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

武汉元码科技 2013-08-20 01:35:38
如果接收端的socket接收缓冲区设置为2M, 并且一直不从缓冲区把数据"拿走(就是recv)",是不是发送端发送2M数据后, 接端的接收收缓冲就区满了?,发送端就发不了数据了?个人认为是这样的,但是我们leader说肯定比2M要大,大概3M左右,不知道会不会这样。当然我会做个试验看看,但是又怕做了试验但是因为方法不对导致了错误的结论。求大神们赐教。

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

不知道这些知识在哪本书里可以学的到。多谢大家回复!
...全文
360 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
武汉元码科技 2013-08-20
  • 打赏
  • 举报
回复
恩,那现在就清晰了,就是自己的发送去和对端的接收缓冲区都满了,就发不出去了.多谢兄弟们。
smwhotjay 2013-08-20
  • 打赏
  • 举报
回复
引用 5 楼 spirit008 的回复:
[quote=引用 4 楼 xiaoxiaoyu85 的回复:] [quote=引用 3 楼 smwhotjay 的回复:] 1.区别不是很大. 只要sock recv缓冲区满了. 对方再send就会失败. 2.对端socket主动断开了,服务端的socket再去recv还能收到数据吗? ------------------------ 断了,recv失败! 3.select为什么没有检测到远程断开呢? ------------------------ select无法100%正确检测连通性,还是要必须recv.
哦,好的,感谢,待会给分。 对于第一个问题的实验,我第一次发了2.2MB,已经大于2M但还是成功发出去了,第二次就发不出去了,在发送超时4s的时候发送大小为0字节。[/quote] 不止你有接收缓冲,对端也有发送缓冲。另外,select不是检测不到,它只是一个事件队列的触发而已。 学这东西就用wireshark去抓包,看windowsize的变化。[/quote] 是的.我忘了 recv缓冲区和对端send缓冲区 都满了 才会send失败.
woshinia 2013-08-20
  • 打赏
  • 举报
回复
引用 4 楼 xiaoxiaoyu85 的回复:
[quote=引用 3 楼 smwhotjay 的回复:] 1.区别不是很大. 只要sock recv缓冲区满了. 对方再send就会失败. 2.对端socket主动断开了,服务端的socket再去recv还能收到数据吗? ------------------------ 断了,recv失败! 3.select为什么没有检测到远程断开呢? ------------------------ select无法100%正确检测连通性,还是要必须recv.
哦,好的,感谢,待会给分。 对于第一个问题的实验,我第一次发了2.2MB,已经大于2M但还是成功发出去了,第二次就发不出去了,在发送超时4s的时候发送大小为0字节。[/quote] 所谓的缓冲区,并不是一块固定大小的内存块,而是一个链表,总内存如果小于设定值,那么可以加一个节点,大于的话就不能加了。这块你可以搜一下“linux下的tcp协议栈”。
木头菇 2013-08-20
  • 打赏
  • 举报
回复
引用 4 楼 xiaoxiaoyu85 的回复:
[quote=引用 3 楼 smwhotjay 的回复:] 1.区别不是很大. 只要sock recv缓冲区满了. 对方再send就会失败. 2.对端socket主动断开了,服务端的socket再去recv还能收到数据吗? ------------------------ 断了,recv失败! 3.select为什么没有检测到远程断开呢? ------------------------ select无法100%正确检测连通性,还是要必须recv.
哦,好的,感谢,待会给分。 对于第一个问题的实验,我第一次发了2.2MB,已经大于2M但还是成功发出去了,第二次就发不出去了,在发送超时4s的时候发送大小为0字节。[/quote] 不止你有接收缓冲,对端也有发送缓冲。另外,select不是检测不到,它只是一个事件队列的触发而已。 学这东西就用wireshark去抓包,看windowsize的变化。
武汉元码科技 2013-08-20
  • 打赏
  • 举报
回复
引用 3 楼 smwhotjay 的回复:
1.区别不是很大. 只要sock recv缓冲区满了. 对方再send就会失败. 2.对端socket主动断开了,服务端的socket再去recv还能收到数据吗? ------------------------ 断了,recv失败! 3.select为什么没有检测到远程断开呢? ------------------------ select无法100%正确检测连通性,还是要必须recv.
哦,好的,感谢,待会给分。 对于第一个问题的实验,我第一次发了2.2MB,已经大于2M但还是成功发出去了,第二次就发不出去了,在发送超时4s的时候发送大小为0字节。
smwhotjay 2013-08-20
  • 打赏
  • 举报
回复
1.区别不是很大. 只要sock recv缓冲区满了. 对方再send就会失败. 2.对端socket主动断开了,服务端的socket再去recv还能收到数据吗? ------------------------ 断了,recv失败! 3.select为什么没有检测到远程断开呢? ------------------------ select无法100%正确检测连通性,还是要必须recv.
武汉元码科技 2013-08-20
  • 打赏
  • 举报
回复
引用 1 楼 fishion 的回复:
socket断开后服务端的socket再recv会出错了
恩,多谢了哈。 我循环的收,在接收之间进行select 判断, FD_ZERO(&scanSet); FD_SET(m_fdSocket, &scanSet); waitTime.tv_sec = 1; waitTime.tv_usec = 0; s32 select_ret = 0; select_ret = select(FD_SETSIZE, &scanSet, (fd_set*)0, (fd_set*)0, &waitTime); if (-1 == select_ret) { printf("recv error!."); } iBytesRead = recv(m_fdSocket, recvptr, iBytesLeft, 0); 这里在select_ret = select处打了断点,将客户端关闭掉,发现select返回的还是1,而且可读,但是recv的时候的确返回-1(10054,远程断开了),没想明白这里select为什么没有检测到远程断开呢?求指点
fishion 2013-08-20
  • 打赏
  • 举报
回复
socket断开后服务端的socket再recv会出错了

18,363

社区成员

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

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