
最近开始学习unix网络编程,开篇第一个程序daytimetcpcli.c编译运行失败unix网络编程源码运行,就花费了好多心思,把难题汇总起来,供大家参考。
FreeBsd unix 系统建立的vmware虚拟机,之前对FreeBsd也是小白,虽说也玩过linux,对网络通信这种设置啊还是不熟。
书中源代码如下:
#include"../lib/unp.h"
#include"../lib/error.c"
int
main(int argc, char **argv)
{
intsockfd, n;
charrecvline[MAXLINE + 1];
struct sockaddr_inservaddr;
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);
}
FreeBsd 安装成功后,telnet 和ftp这些服务,要自己进入,在/etc/inetd.conf,用ee命令打开,可以直接编辑,
要保存需要用root权限,esc后aa保存。ps -ef | grep inetd 查看PID号,kill 后,用inetd -wW重
新进入,新修改生效。
编辑其实就是去掉相应行的“#”注释。
#ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l

#ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l
#telnet stream tcp nowait root /usr/libexec/telnetd telnetd
#telnet stream tcp6 nowait root /usr/libexec/telnetd telnetd
言归正传,cc daytimetcpcli.c,生成a.out, 运行./a.out 127.0.0.1
总是提示connect error: Connection refused。
用sockstat 查看服务器运行的端口,有21,23这些常见的端口。
百度说需要没有开daytime服务端口。看freebsd手册,说这种服务是内置默认开启的。
再回到网络编程书中,看下面的代码解释,知道是connect执行成功,再预测后关键点在
htons(13)这个函数,
其中13是服务端口号,把13改成其它端口看看,然后改成21,发现执行成功。
虽然执行失败,但是不是书中的daytime字串,心里而是有些遗憾。现在起码可证明
服务器没有问题,应该是配置还有些没有设置恰当。继续百度。

随后在基维百科中发现daytime协议的解释:
DAYTIME协议(英语:DAYTIME protocol)是一个在RFC867内定义的网络传输协议。
主机可以用TCP或UDP端口13连接支持DAYTIME协议的服务器。
服务器会以ASCII字符传回当时日期及时间。格式类似:星期unix网络编程源码运行,月 日,年 时区。
它也用作测试手机网络的联通性,现在测试网络的方式已经转为用ping或traceroute。
DAYTIME协议在inetd上
在Linux、FreeBSD,或其它类UNIX操作系统中,DAYTIME时间服务器是在inetd中内置。通常DAYTIME协议服务是默认关闭的,或是在/etc/inetd.conf文件中加上以下数据以开启服务:
daytime stream tcp nowait root internal daytime stream tcp6 nowait root internal daytime dgram udp wait root internal daytime dgram udp6 wait root internal
看了前面的解释,再把daytime服务启动,重新启动inetd,一切OK
看到inetd.conf上面有很多#开头的行,应该是这些服务都应手工进入。
书中第一个例子似乎完美执行失败,这样的起初才使人兴奋。小白继续前进
<<unix 网络编程>> 源码编译daytimetcpcli.c 问题汇总
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-131205-1.html
晚安