《unix网络编程》中源码使用方法

时间:2021-10-21 22:13:40

原文来自《小华编程网》:《unix网络编程》中源码使用方法

本人最近学习<unix网络编程>这本书,对于我这种刚接触刚入门unix和网络编程的人来说确实有点难。不过我相信万事开头难,就像一个飞行员说过:一旦跨过起跑线,就会离目标越来越近。

      第一步就是解决书中源码的使用,使用源码中写好的一些头文件。我的系统是ubuntu 14.04

              1.下载源码解压,百度unpv13e自行下载

              2.把主目录中的config.h和sctp目录中的unp.h 复制到/usr/include 中去。

              3.把复制好的/usr/include中的unp.h中的 #include”../config.h” 改为 #include”config.h”,在/usr/include中的unp.h中添加#define MAXLINE 2048

               4.尝试编译书中第一个例子,成功解决,最后会贴出经过修改的代码。

               5.不过我这里对第一个例子进行了修改,去掉了err_quit()等函数,而是用peeor()来输出错误。要想使用err_quie等这些函数,可以自己按照书中的来编写一个解决错误的头文件,然后在/usr/include/unp.h中include即可。

cli.c

#include"unp.h"

int main(int argc, char **argv)
{
intsockfd, n;
charrecvline[MAXLINE + 1];
struct sockaddr_inservaddr;

if((sockfd = socket(AF_INET, SOCK_STREAM, 0))<0)
{
char *errorMsg="socket error";
perror(errorMsg);
}

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(12345);/* daytime server */
if(inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr)<=0)
{
char *errorMsg="inet_pton error";
perror(errorMsg);

}

if(connect(sockfd, (SA *) &servaddr, sizeof(servaddr))<0)
{
char *errorMsg="connect error";
perror(errorMsg);
}

while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
recvline[n] = 0;/* null terminate */
if (fputs(recvline, stdout) == EOF)
printf("error");
}
if (n < 0)
printf("read error");

exit(0);
}
             我这里使用了本地端口12345而不是13,ip为回环地址127.0.0.1

srv.c

#include<unp.h>
#include<time.h>

int
main(int argc, char **argv)
{
intlistenfd, connfd;
struct sockaddr_inservaddr;
charbuff[MAXLINE];
time_tticks;

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(12345);/* daytime server */

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);
}
}
            书本里的例子用到了很多包裹函数,比如上面提到的err_sys等,如果要使用这些函数,先在unpv13e文件夹下找到这些包裹函数的实现,将这些函数include在unp.h文件中既可以