今天偶然下载了英文版的《UNIX网络》第三版第1卷:the sockets working 和配套的,因为以前只用java和C#编写过网络,而没接触过用C编写SOCKET程序,偶然的机会看到了这本书然后就下载了下来。最新版的好像是更新到了第三版,网上有英文版电子版的下载,而且有配套的源码。实话说,看英文原版的感觉真的不错,没多少陌生的单词,一点都不影响理解。这也是我第一次看英文原版的类的书籍,以前总觉得看英文原版会很吃力,现在看来也没什么好害怕的。到了1.2节的本书给了一个简单的的例子,功能是利用TCP协议获取的时间。代码如下所示:
main(int argc, char **argv) |
char recvline[MAXLINE 1]; |
struct sockaddr_in servaddr; |
err_quit("usage: a.out "); |
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) |
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) |
因为下载了源代码,很快就找到了对应的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/ 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 piling inidual 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. 希望遇到同样问题的朋友们能看到这个帖子帮助到你们。另外,想说的是,继续努力地看完这本书~~~
阅读(6447) | 评论(2) | 转发(0) |