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.
[解决办法]
1.区别不是很大. 只要sock recv缓冲区满了. 对方再send就会失败.
2.对端socket主动断开了,服务端的socket再去recv还能收到数据吗?
------------------------
断了,recv失败!
3.select为什么没有检测到远程断开呢?
------------------------
select无法100%正确检测连通性,还是要必须recv.
哦,好的,感谢,待会给分。
对于第一个问题的实验,我第一次发了2.2MB,已经大于2M但还是成功发出去了,第二次就发不出去了,在发送超时4s的时候发送大小为0字节。
1.区别不是很大. 只要sock recv缓冲区满了. 对方再send就会失败.
2.对端socket主动断开了,服务端的socket再去recv还能收到数据吗?
------------------------
断了,recv失败!
3.select为什么没有检测到远程断开呢?
------------------------
select无法100%正确检测连通性,还是要必须recv.
哦,好的,感谢,待会给分。
对于第一个问题的实验,我第一次发了2.2MB,已经大于2M但还是成功发出去了,第二次就发不出去了,在发送超时4s的时候发送大小为0字节。
不止你有接收缓冲,对端也有发送缓冲。另外,select不是检测不到,它只是一个事件队列的触发而已。
学这东西就用wireshark去抓包,看windowsize的变化。