《UNIX网络编程》中的unp.h和config.h

时间:2022-02-14 02:18:33

  1. 下载源代码包  www.unpbook.com

  2. 3.进入unp13e 查看readme,照下列提示操作
  3.  1)chmod u+x configure
  4.       ./configure
  5.  2)cd lib
  6.         make
  7.  3)cd ../libfree
  8.       make
  9.  4)cd ../libgai
  10.       make

  11. 4.将生成的libunp.a静态库复制到/usr/lib /usr/lib64中

  12.  cd.. //回到unpv13e目录
  13.  
  14.  sudo cp libunp.a /usr/lib
  15.  sudo cp libunp.a /usr/lib64

  16. 5.修改unp.h并将其和config.h拷贝到/usr/include 中,为了以后include方便
  17.  vim lib/unp.h //将unp.h 中#include “../config.h”修改为#include “config”
  18.  
  19.  sudo cp lib/unp.h /usr/include
  20.  sudo cp config.h /usr/inlcude 

  21. 6.编译源代码
  22.  cd ./intro
  23.  gcc daytimetcpcli.-o daytimetcpcli -lunp
  24. gcc daytimetcpsrv.c -o daytimetcpsrv -lunp

 7.一个简单的获取时间程序:
  1. 客户端程序:
  2. #include "unp.h" //包含自己编写的头文件

  3. int main(int argc, char *argv[])
  4. {
  5.   int sockfd, n;
  6.   char recvline[MAXLINE + 1];
  7.   struct sockaddr_in servaddr;

  8.   if(argc != 2)
  9.     err_quit("usage: a.out");
  10.   //创建TCP套接字,socket函数创建一个网际(AF_INET)字节流(SOCK_INET)套接字,该函数返回小整数描述符。
  11.   if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) , 0)
  12.     err_sys("socket error");
  13.   //把网际套接字地址结构清零
  14.   bzero(&servaddr, sizeof(servaddr));
  15.   servaddr.sin_family = AF_INET;
  16.   //调用htons转换二进制端口号,由主机字节顺序为网络字节顺序
  17.   servaddr.sin_port = htons(13);
  18.   //把命令行参数转换为合适的格式
  19.   if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
  20.     err_quit("inet_pton error for %s, argv[1]");
  21.   //建立与服务器的连接
  22.   if(connect(sockfd, (SA*) &servaddr, sizeof(servaddr)) < 0)
  23.     err_sys("connect error");
  24.   //读入并输出与服务器的应答
  25.   while((= read(sockfd, recvline, MAXLINE)) > 0)
  26.     {
  27.       recvline[n] = 0;
  28.       if(fputs(recvline, stdout) == EOF)
  29.     err_sys("fputs error");
  30.      }
  31.   if (< 0)
  32.     {
  33.       err_sys("read error");
  34.     }
  35.   //终止程序
  36.   exit(0);
  37. }


  38. 服务器端程序:
  39. #include "unp.h"
  40. #include <time.h>

  41. int main(int argc, char *argv[])

  42.   int listenfd, connfd;
  43.   struct sockaddr_in servaddr;
  44.   char buff[MAXLINE];
  45.   time_t ticks;
  46.   //创建TCP套接字
  47.   listenfd = Socket(AF_INET, SOCK_STREAM, 0);
  48.   //把服务器的众所周知端口捆绑到套接字
  49.   bzero(&servaddr, sizeof(servaddr));
  50.   servaddr.sin_family = AF_INET;
  51.   servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  52.   servaddr.sin_port = htons(13);
  53.   Bind(listenfd, (SA*)&servaddr, sizeof(servaddr));
  54.   //把套接字转换成监听套接字,这样来自客户的外来连接就可以在该套接字上由内核接受
  55.   Listen(listenfd, LISTENQ);
  56.   //接受客户连接,发送应答
  57.   for ( ; ; )
  58.     {
  59.       //
  60.       connfd = Accept(listenfd, (SA*) NULL, NULL);
  61.       ticks = time(NULL);
  62.       snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
  63.       Write(connfd, buff, strlen(buff));
  64.       //终止连接
  65.       Close(connfd);
  66.     }
  67.   return 0;
  68. }


  69. 测试结果:
  70. 服务器端:
  71. root@ubuntu:/home/unpv13e/lib# ./daytimetcpsrv 
  72. 客户端:
  73. root@ubuntu:/home/unpv13e/lib# ./daytimetcpcli  127.0.0.1  (本机回环从测试) 
  74. Oct Tue 6 20:32:04 2015