对于想学习网络编程的同学来说,《UNIX网络编程》这书肯定是不二选择。所谓实践是检验真理的唯一标志,特别是对于编程来讲,再多的理论经验也比不过code一次。《UNIX网络编程》这本书提供连源码下载,第三版本的源码我是在 GitHub上面下载的。
但是源码归源码,下载了如果不会使用那也是瞎扯。下面简单介绍一下在本节主要介绍UNIX网络编程卷(第三版)在Ubuntu19.04的配置问题,并运行一个简单时间获取客户程序。
1.首先下载源文件,链接如下
2.将下载好的压缩文件unpv13e.tar.gz解压,解压后文件为unpv13e.
3.解压后进入源码目录,打开README文件:
4.按照提示首先在命令行执行 ./configure,没有问题。
5.执行 cd lib 进入lib文件夹,执行make命令,没有问题。
6.执行 cd …/libfree进入libfree文件夹,执行make命令,会遇到以下问题:
错误解决办法是:进入libfree文件夹,打开inet_ntop.c,在第60行将size_t size改为socklen_t size。
7.再执行第6步,问题解决。
8.在命令行执行 cd …/intro/,进入intro文件夹,
执行 make daytimetcpcli,生成可执行文件后,
执行 ./daytimetcpcli 127.0.0.1 会出现以下问题:
Connection refused
运行时间获取程序,需要现在ubuntu里安装时间服务
9.执行以下命令
sudo apt-get install xinetd
sudo vi /etc/xinetd.d/daytime
将图中的两个disable的值改为no:
执行 service xinetd restart
10.重新执行./daytimetcpcli 127.0.0.1,结果如图
结果:报socket error: Address family not supported by protocol family 。
经查询:AF_INET本身代表了protocol family的一个特殊标记值,如果修改成其他值,相当于一个新的protocol family,那么之后传入的address family当然不会支持了。
int counter = 0;
while ( (n = read(sockfd, recvline, MAXLINE)) > 0)
{
counter++;
recvline[n] = 0; /* null terminate */
if (fputs(recvline, stdout) == EOF)
err_sys("fputs error");
}
printf("%d\n",counter);
for (int i = 0; i < strlen(buff); ++i)
{
Write(connfd, &(buff[i]), 1);
}
Close(connfd);