connect与accept的基本问题。

招RD和QA 2010-08-05 11:07:43
是基本的概念问题,有些搞混了,希望有人帮我弄清楚。

一个TCP的程序,server端listen以后开始sleep,这时backlog个client端connect,会被阻塞嘛?超时时间是多长?如果有其它的client想连接进来,应该是直接被拒绝嘛?还是继续等待超时。

假如server端开始accept了,因此,client端的connect函数返回,然后server端accept函数返回,得到新的socket,这个socket还是使用同样的地址和port,server端会使用这些socket和client端进行通信,需要注意的是,多个client端是和server的某个port做通信,也意味着,server端的tcp栈把在这个port上收到的数据做了dispatch,传送到不同的socket上。不知道这样的理解对不对?
...全文
630 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
斯纳 2012-12-07
  • 打赏
  • 举报
回复
找到了! int listen (int sockfd, int backlog); 要理解backlog参数,我们要知道内核为任何一个给定的监听套接字维护2个队列: 1).未完成连接队列。客户和服务器之间的tcp三次握手并未完成。 2).已完成连接队列。tcp的三次握手已经完成,处于ESTABLISHED状态。 关于两个队列的处理: listen函数的backlog参数曾被规定为两个队列总和的最大值 源自Berkeley的实现给backlog增设了一个模糊因子,把它乘以1.5得到未处理队列最大长度 不要把backlog定义为0,因为不同的实现对此有不同的解释 在三路握手正常完成的前提下(也就是说没有丢失分节,从而没有重传),未完成连接队列的任何一项在其中的存留时间就是一个RTT,而RTT的值取决于特定的客户与服务器 当一个客户SYN到达时,若这些队列是满的,TCP就忽略该分节,也就是不发送RST 在三路握手完成后,但在服务器调用accept之前到达的数据应由服务器TCP排列,最大数据量为相应已连接套接字的接受缓冲区大小 参见: http://www.cnblogs.com/biyeymyhjob/archive/2012/08/05/2623889.html
斯纳 2012-12-07
  • 打赏
  • 举报
回复
我也遇到了这个问题,server端listen后sleep了,还没有调用accept,这是client端竟然能马上connect成功,为什么不阻塞?????
dandykang 2012-10-29
  • 打赏
  • 举报
回复
如果server端listen了,但是因为处理事务,没有来得及accept, connect会阻塞
招RD和QA 2010-08-09
  • 打赏
  • 举报
回复
who can answer this question?
招RD和QA 2010-08-06
  • 打赏
  • 举报
回复
我想知道的是,如果server端listen了,但是因为处理事务,没有来得及accept,这时client端connect会有什么结果?是我说的那样嘛?

还有,多个client端连接server的时候,server相应的accept了多次,产生了多个新的socket,但是这多个client端只会与server同样的port通信,这些socket上的数据应该是tcp协议栈自己dispatch的吧?因为应用层没做这个事件。

看下面这个输出,10001是server端listen的端口,有3个client已经上来,并且传送数据。但是这3个client都是向server:10001发送数据的。

C:\Windows\system32>netstat /a /b /n /p tcp | findstr 10001
TCP 0.0.0.0:10001 0.0.0.0:0 LISTENING
TCP 127.0.0.1:10001 127.0.0.1:33489 ESTABLISHED
TCP 127.0.0.1:10001 127.0.0.1:45892 ESTABLISHED
TCP 127.0.0.1:33489 127.0.0.1:10001 ESTABLISHED
TCP 127.0.0.1:45892 127.0.0.1:10001 ESTABLISHED
TCP 192.168.174.1:10001 192.168.174.1:46129 ESTABLISHED
TCP 192.168.174.1:46129 192.168.174.1:10001 ESTABLISHED
玉古云投 2010-08-05
  • 打赏
  • 举报
回复
找书看吧,《Windows网络编程》
linglongyouzhi 2010-08-05
  • 打赏
  • 举报
回复
你的理解有些问题的
你调用sleep以后会把server进程阻塞,所以这时如果有连接请求是没办法响应的
accept也会阻塞server进程,但是他可以接受连接请求

后一个问题,server进程accept以后会返回一个新的socket,这时client与server的数据连接只通过这个socket了,就相当于有个专线了,而tcp栈就是管这个工作的

[Quote=引用楼主 viper 的回复:]
是基本的概念问题,有些搞混了,希望有人帮我弄清楚。

一个TCP的程序,server端listen以后开始sleep,这时backlog个client端connect,会被阻塞嘛?超时时间是多长?如果有其它的client想连接进来,应该是直接被拒绝嘛?还是继续等待超时。

假如server端开始accept了,因此,client端的connect函数返回,然后server端accept函数……
[/Quote]
dvlinker 2010-08-05
  • 打赏
  • 举报
回复
帮忙顶一个~
thehunters 2010-08-05
  • 打赏
  • 举报
回复
tcp栈做的是把数据分发到不同的应用。哪个个socket有数据就不是tcp栈做的。你可以查询哪个socket是否有数据然后接收,或者阻塞等待接收某个socket的数据。

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧