《UNIX网络编程》一书中源代码在ubuntu下如何编译的问题

      今天偶然下载了英文版的《UNIX网络编程》第三版第1卷:the sockets networking API和配套的源代码,因为以前只用java和C#编写过网络应用程序,而没接触过用C编写SOCKET程序,偶然的机会看到了这本书然后就下载了下来。最新版的好像是更新到了第三版,网上有英文版电子版的下载,而且有配套的源码。实话说,看英文原版的感觉真的不错,没多少陌生的单词,一点都不影响理解。这也是我第一次看英文原版的计算机类的书籍,以前总觉得看英文原版会很吃力,现在看来也没什么好害怕的。到了1.2节的本书给了一个简单的客户端的例子,功能是利用TCP协议获取服务器的时间。代码如下所示:

 #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 <IPaddress>");
     if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
         err_sys("socket error");

     bzero(&servaddr, sizeof(servaddr));
     servaddr.sin_family = AF_INET;
     servaddr.sin_port = htons(13);  /* daytime server */
     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;        /* null terminate */
         if (fputs(recvline, stdout) == EOF)
             err_sys("fputs error");
     }
     if (n < 0)
         err_sys("read error");

     exit(0);
}

      因为下载了源代码,很快就找到了对应的C文件,凭着惯性敲了gcc的命令,发现有报错,编译失败。切换到文件夹根目录查看README文件,找到了编译方法:

Execute the following from the src/ directory:

./configure # try to figure out all implementation differences

cd lib # build the basic library that all programs need
make # use "gmake" everywhere on BSD/OS systems

cd ../libfree # continue building the basic library
make

cd ../libroute # only if your system supports 4.4BSD style routing sockets
make # only if your system supports 4.4BSD style routing sockets

cd ../libxti # only if your system supports XTI
make # only if your system supports XTI

cd ../intro # build and test a basic client program
make daytimetcpcli
./daytimetcpcli 127.0.0.1

If all that works, you're all set to start compiling individual programs.

      一切都显得很顺利的样子:

      修改configure可执行权限,执行configure:

《UNIX网络编程》一书中源代码在ubuntu下如何编译的问题_第1张图片

      进入lib目录下执行make命令

《UNIX网络编程》一书中源代码在ubuntu下如何编译的问题_第2张图片

      同样在libfree目录下同样执行make命令,接下来的两次make不是必须的,如果满足它所说的条件即可,不过有一个目录在我下载的源码中是不存在的,会多了一个libgai(感觉像是lib改 - -)目录。我是在ubuntu 11.10下执行的,后面的两次make都不成功。最后当你激动地敲击./daytimetcpcli 127.0.0.1后发现报错,Connection Refused。上网google了一下解决了这个问题,原来是因为这个版本的系统默认是不开daytime服务的,而且开启daytime服务需要有root权限,然后你会看到在相同的目录下有一个daytimetcpsrv.c文件,编译后执行它,注意需要有root权限,即sudo   ./daytimetcpsrv。它的功能就是开启本机的daytime服务,然后你再开启一个终端,敲击./daytimetcpcli 127.0.0.1后返回了你想要的结果。

《UNIX网络编程》一书中源代码在ubuntu下如何编译的问题_第3张图片

      So that's it. 希望遇到同样问题的朋友们能看到这个帖子帮助到你们。另外,想说的是,继续努力地看完这本书~~~

你可能感兴趣的:(ubuntu)