首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

socket接收缓冲区设立为2M,那么是不是对端发2M数据,就满了(通讯的高手来,坐等结贴)

2013-08-25 
socket接收缓冲区设置为2M,那么是不是对端发2M数据,就满了(通讯的高手来,坐等结贴)本帖最后由 oyljerry 于

socket接收缓冲区设置为2M,那么是不是对端发2M数据,就满了(通讯的高手来,坐等结贴)
本帖最后由 oyljerry 于 2013-08-20 22:21:02 编辑 如果接收端的socket接收缓冲区设置为2M, 并且一直不从缓冲区把数据"拿走(就是recv)",是不是发送端发送2M数据后, 接端的接收收缓冲就区满了?,发送端就发不了数据了?个人认为是这样的,但是我们leader说肯定比2M要大,大概3M左右,不知道会不会这样。当然我会做个试验看看,但是又怕做了试验但是因为方法不对导致了错误的结论。求大神们赐教。

还有就是select的时候,如果select检测缓冲区中有数据,但是没有及时去收,等待大概500ms再去收,这期间对端socket主动断开了,服务端的socket再去recv还能收到数据吗?是不是对端一断链,这边的socket就被"复位",句柄变为无效。不能再收数据了?

不知道这些知识在哪本书里可以学的到。多谢大家回复!
[解决办法]
socket断开后服务端的socket再recv会出错了
[解决办法]
1.区别不是很大. 只要sock recv缓冲区满了. 对方再send就会失败. 

2.对端socket主动断开了,服务端的socket再去recv还能收到数据吗?
------------------------
断了,recv失败!


3.select为什么没有检测到远程断开呢?
------------------------
select无法100%正确检测连通性,还是要必须recv.  
[解决办法]

引用:
Quote: 引用:

1.区别不是很大. 只要sock recv缓冲区满了. 对方再send就会失败. 

2.对端socket主动断开了,服务端的socket再去recv还能收到数据吗?
------------------------
断了,recv失败!


3.select为什么没有检测到远程断开呢?
------------------------
select无法100%正确检测连通性,还是要必须recv.  

哦,好的,感谢,待会给分。
对于第一个问题的实验,我第一次发了2.2MB,已经大于2M但还是成功发出去了,第二次就发不出去了,在发送超时4s的时候发送大小为0字节。

不止你有接收缓冲,对端也有发送缓冲。另外,select不是检测不到,它只是一个事件队列的触发而已。
学这东西就用wireshark去抓包,看windowsize的变化。
[解决办法]
引用:
Quote: 引用:

1.区别不是很大. 只要sock recv缓冲区满了. 对方再send就会失败. 

2.对端socket主动断开了,服务端的socket再去recv还能收到数据吗?
------------------------
断了,recv失败!


3.select为什么没有检测到远程断开呢?
------------------------
select无法100%正确检测连通性,还是要必须recv.  

哦,好的,感谢,待会给分。
对于第一个问题的实验,我第一次发了2.2MB,已经大于2M但还是成功发出去了,第二次就发不出去了,在发送超时4s的时候发送大小为0字节。


所谓的缓冲区,并不是一块固定大小的内存块,而是一个链表,总内存如果小于设定值,那么可以加一个节点,大于的话就不能加了。这块你可以搜一下“linux下的tcp协议栈”。
------解决方案--------------------


引用:
Quote: 引用:

Quote: 引用:

1.区别不是很大. 只要sock recv缓冲区满了. 对方再send就会失败. 

2.对端socket主动断开了,服务端的socket再去recv还能收到数据吗?
------------------------
断了,recv失败!


3.select为什么没有检测到远程断开呢?
------------------------
select无法100%正确检测连通性,还是要必须recv.  

哦,好的,感谢,待会给分。
对于第一个问题的实验,我第一次发了2.2MB,已经大于2M但还是成功发出去了,第二次就发不出去了,在发送超时4s的时候发送大小为0字节。

不止你有接收缓冲,对端也有发送缓冲。另外,select不是检测不到,它只是一个事件队列的触发而已。
学这东西就用wireshark去抓包,看windowsize的变化。

是的.我忘了 recv缓冲区和对端send缓冲区 都满了 才会send失败. 

热点排行