今天偶然下载了英文版的《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 systemscd ../libfree # continue building the basic library
makecd ../libroute # only if your system supports 4.4BSD style routing sockets
make # only if your system supports 4.4BSD style routing socketscd ../libxti # only if your system supports XTI
make # only if your system supports XTIcd ../intro # build and test a basic client program
make daytimetcpcli
./daytimetcpcli 127.0.0.1If all that works, you're all set to start compiling individual programs.
一切都显得很顺利的样子:
修改configure可执行权限,执行configure:
进入lib目录下执行make命令
同样在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后返回了你想要的结果。
So that's it. 希望遇到同样问题的朋友们能看到这个帖子帮助到你们。另外,想说的是,继续努力地看完这本书~~~