Chinaunix首页 | 论坛 | 博客
  • 博客访问: 424294
  • 博文数量: 71
  • 博客积分: 1525
  • 博客等级: 上尉
  • 技术积分: 605
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-05 17:28
文章分类

全部博文(71)

文章存档

2012年(21)

2011年(50)

分类: 系统运维

2012-03-24 21:39:03


今天偶然下载了英文版的《UNIX网络》第三版第1卷:the sockets working 和配套的,因为以前只用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 ");
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/ 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. 希望遇到同样问题的朋友们能看到这个帖子帮助到你们。另外,想说的是,继续努力地看完这本书~~~

阅读(1943) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~