2012年(24)
分类: 系统运维
2012-07-14 14:03:30
connect函数
1. 函数原型:
#include
int connect(int sockfd, const sturct sockaddr* servaddr, socklen_t addrlen)
由客户端发起TCP三次握手过程,servaddr是服务器套接字地址结构。客户在调用connect函数前不需要调用bind函数,内核会选择一个临时的端口。
2. connect函数出错情况分析
2.1 超时:超时的前期工作上一篇已经介绍了。unp说“若TCP客户没有收到SYN分节,则返回ETIMEOUT错误”。
[root@localhost unp]# date;./client 192.168.197.20;date
2012年 07月 14日 星期六 13:10:35 CST
connect error: Connection timed out
2012年 07月 14日 星期六 13:11:38 CST
说明:arp映射是假的,若客户主机(192.168.197.20)没有收到ARP请求,它将永远收不到ARP应答,可以看到超时时间为63秒,下面是抓包情况(Ominpeek抓包软件,此软件很好!)
1 192.168.197.10 192.168.197.20 78 0.000000
2 192.168.197.10 192.168.197.20 78 0.999882
3 192.168.197.10 192.168.197.20 78 3.000087
4 192.168.197.10 192.168.197.20 78 7.001960
5 192.168.197.10 192.168.197.20 78 15.002222
6 192.168.197.10 192.168.197.20 78 31.001919
2.2 若客户的SYN的响应是RST,表明服务器主机在我们指定的端口没有进程与之等待(没有运行服务器程序的主机)。客户接收到RST就马上返回ECONNREFUSED错误。这是一种硬错误。
这个实验也很好做。
[root@localhost unp]# date;./client 192.168.197.5;date
2012年 07月 14日 星期六 13:25:51 CST
connect error: Connection refused
2012年 07月 14日 星期六 13:25:51 CST
首先我Ubuntu虚拟机IP是192.168.197.5,此时没有运行server程序,所以会出现这种情况。抓包看看:
192.168.197.10 192.168.197.5 0.000481 TCP Src=53237,Dst= 9877,....S.,S=3521322144,
192.168.197.5 192.168.197.10 0.000617 TCP Src= 9877,Dst=53237,.A.R..,S= 0
可以看到,首先客户端发送了一个SYN请求,服务器返回的是RST异常终止此连接.
2.3 最后一种情况是路由不可达。不过这个和第2种情况到底有什么本质的区别还不太了解,因为下面这条命令返回的错误不总是“No route to host”,有些时候还会出现refused的情况,这个是为什么??
[root@localhost unp]# date;./client 220.181.112.143;date
2012年 07月 14日 星期六 13:39:17 CST
connect error: No route to host
2012年 07月 14日 星期六 13:39:21 CST
这里220.181.112.143是百度的地址。时差只有4秒。。。
[root@localhost unp]# date;./client 220.181.112.143;date
2012年 07月 14日 星期六 13:44:52 CST
connect error: Connection refused
2012年 07月 14日 星期六 13:45:13 CST
时差大约20秒。
这个实验不太好做,tcp详解p88页介绍了主机不可达的知识。