首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络协议 >

linux tcp server端未调用accept, client端连接顺利

2013-07-04 
linux tcp server端未调用accept, client端连接成功今天做测试,server-client。server调用listen没有调用

linux tcp server端未调用accept, client端连接成功
今天做测试,server<->client。server调用listen没有调用accept, client端connect成功。有没有大牛解答下

netstat 网络连接状况如下,ESTABLISHED 表明3次握手已经建立起来了。但是查看不到服务端的进程号。
[root@localhost ~]# netstat -antpl|grep 7001
tcp        0      0 0.0.0.0:7001                0.0.0.0:*                   LISTEN      23348/tcpserver     
tcp       11      0 192.168.5.45:7001           192.168.5.45:49746          ESTABLISHED -                   
tcp        0      0 192.168.5.45:49746          192.168.5.45:7001           ESTABLISHED 23349/tcpclient    
[解决办法]
server端调用listen后,在内核层是默认有accept的队列的,默认好像是3个. 这个时候需要用户层主动调用accept将socket取出来。 你可以做个尝试, server只listen不accpet,开启多个client去连接server,看看能连上几个。
[解决办法]
有哪个大牛来说说原理,没有调用accept,为何也能建立连接呢?
[解决办法]
你理解可能有偏差。
accept的本质并不是触发三次握手过程,而是“如果某个链接完成了三次握手,则唤醒被阻塞的accept调用”。

在你调用listen的时候,系统已经准备了一个小队列,用于接收匹配的客户端连接。这也是为什么listen函数带了一个队列大小参数。
listen调用成功后,客户端连接上来会完成三次握手,不需要你干预。如果你调用accept,则系统会从已经完成三次握手的链接中返回返回给你一个。

这个可以通过wireshark抓包来证实。

热点排行