- 下载源代码包 www.unpbook.com
-
3.进入unp13e 查看readme,照下列提示操作
- 1)chmod u+x configure
- ./configure
- 2)cd lib
- make
- 3)cd ../libfree
- make
- 4)cd ../libgai
- make
-
4.将生成的libunp.a静态库复制到/usr/lib和 /usr/lib64中
- cd.. //回到unpv13e目录
-
- sudo cp libunp.a /usr/lib
- sudo cp libunp.a /usr/lib64
-
5.修改unp.h并将其和config.h拷贝到/usr/include 中,为了以后include方便
- vim lib/unp.h //将unp.h 中#include “../config.h”修改为#include “config”
-
- sudo cp lib/unp.h /usr/include
- sudo cp config.h /usr/inlcude
-
6.编译源代码
- cd ./intro
- gcc daytimetcpcli.c -o daytimetcpcli -lunp
- gcc daytimetcpsrv.c -o daytimetcpsrv -lunp
7.一个简单的获取时间程序:
- 客户端程序:
- #include "unp.h" //包含自己编写的头文件
-
int main(int argc, char *argv[])
- {
- int sockfd, n;
- char recvline[MAXLINE + 1];
- struct sockaddr_in servaddr;
- if(argc != 2)
- err_quit("usage: a.out");
- //创建TCP套接字,socket函数创建一个网际(AF_INET)字节流(SOCK_INET)套接字,该函数返回小整数描述符。
- if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) , 0)
- err_sys("socket error");
- //把网际套接字地址结构清零
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- //调用htons转换二进制端口号,由主机字节顺序为网络字节顺序
- servaddr.sin_port = htons(13);
- //把命令行参数转换为合适的格式
- if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
- err_quit("inet_pton error for %s, argv[1]");
- //建立与服务器的连接
- if(connect(sockfd, (SA*) &servaddr, sizeof(servaddr)) < 0)
- err_sys("connect error");
- //读入并输出与服务器的应答
- while((n = read(sockfd, recvline, MAXLINE)) > 0)
- {
- recvline[n] = 0;
- if(fputs(recvline, stdout) == EOF)
- err_sys("fputs error");
- }
- if (n < 0)
- {
- err_sys("read error");
- }
- //终止程序
- exit(0);
- }
-
服务器端程序:
- #include "unp.h"
- #include <time.h>
-
int main(int argc, char *argv[])
- {
- int listenfd, connfd;
- struct sockaddr_in servaddr;
- char buff[MAXLINE];
- time_t ticks;
- //创建TCP套接字
- listenfd = Socket(AF_INET, SOCK_STREAM, 0);
- //把服务器的众所周知端口捆绑到套接字
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servaddr.sin_port = htons(13);
- Bind(listenfd, (SA*)&servaddr, sizeof(servaddr));
- //把套接字转换成监听套接字,这样来自客户的外来连接就可以在该套接字上由内核接受
- Listen(listenfd, LISTENQ);
- //接受客户连接,发送应答
- for ( ; ; )
- {
- //
- connfd = Accept(listenfd, (SA*) NULL, NULL);
- ticks = time(NULL);
- snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
- Write(connfd, buff, strlen(buff));
- //终止连接
- Close(connfd);
- }
- return 0;
- }
-
测试结果:
- 服务器端:
- root@ubuntu:/home/unpv13e/lib# ./daytimetcpsrv
- 客户端:
- root@ubuntu:/home/unpv13e/lib# ./daytimetcpcli 127.0.0.1 (本机回环从测试)
- Oct Tue 6 20:32:04 2015