Socket在send数据时,有时会出现堵塞的情况如何处理?

bzg2010 2010-10-17 02:11:32
Socket设置的是堵塞模式。
发送的消息多了,send会偶尔出现返回-1的情况。
然后一直发一直发,等了30分钟的循环,还发不出去,估计死在那里了。
问题一:什么情况下,Socket会堵塞?
问题二:堵塞能够恢复吗?
问题三:一直堵塞只能是关闭连接重连?
问题四:我最终的目录不是重连,是为了不堵塞。但不能够修改Socket的模式。有什么好办法?
...全文
994 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
libinfei8848 2010-10-21
  • 打赏
  • 举报
回复
学习、、、、
野男孩 2010-10-21
  • 打赏
  • 举报
回复
阻塞方式的话,send如果返回-1,就不要试了,链路断开了。

应该尝试异步方式,至少可以用个selct检测是否可以发送数据,避免阻塞。
bzg2010 2010-10-21
  • 打赏
  • 举报
回复
程序执行大部分时间是OK的,只是很长一段时间后,出现send堵塞.
返回10004错误?

不知道什么原因?
bragi523 2010-10-18
  • 打赏
  • 举报
回复
返回-1代表连接已断开,就要退出循环了
SpiritMFC 2010-10-18
  • 打赏
  • 举报
回复
然后一直发一直发,等了30分钟的循环,还发不出去,估计死在那里了。
问题一:什么情况下,Socket会堵塞?
问题二:堵塞能够恢复吗?
问题三:一直堵塞只能是关闭连接重连?
问题四:我最终的目录不是重连,是为了不堵塞。但不能够修改Socket的模式。有什么好办法?


问题1:socket底层缓冲区满了,就会send失败。
问题2: tcp将底层缓冲区数据发完就会恢复。
问题3:不会一直阻塞,要么你的程序有问题,要么网络有问题,多试几个模型看一下。
问题4:参照第三条。
vansbluge 2010-10-18
  • 打赏
  • 举报
回复
异步更灵活 你会喜欢上他的
SpiritMFC 2010-10-18
  • 打赏
  • 举报
回复
楼上正解,
socket底层缓冲区满了,就会send失败。

解决方法:
这是你可以sleep()一会 或者干脆
do

{
发送
}
while(发送失败)

不断去看,如果缓冲区有空位就发送出去。否则不断的检查缓冲区。

个人建议,仅供参考
dong364 2010-10-17
  • 打赏
  • 举报
回复
阻塞式socket情况下,send只是copy数据到系统的发送缓冲区,系统的发送缓冲区满时,它就会阻塞
Eleven 2010-10-17
  • 打赏
  • 举报
回复
int nTime = 5000;
setsockopt(SOCKET, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTime, sizeof(nTime));
mayudong1 2010-10-17
  • 打赏
  • 举报
回复
上代码吧
bzg2010 2010-10-17
  • 打赏
  • 举报
回复
这个可能不行,目前只能用堵塞模式,这个是同步的吧。
如果不能改变,有其他好招没?
m_tornado 2010-10-17
  • 打赏
  • 举报
回复
修改socket模式

WSAAsyncSelect(m_sockClient, this->m_hWnd, WM_TCPCLIENTMSG, FD_ACCEPT | FD_READ | FD_CLOSE | FD_CONNECT | FD_WRITE | FD_WRITE);

改成异步接收模式
bzg2010 2010-10-17
  • 打赏
  • 举报
回复
server端关闭的原因,是send消息给client端一直返回-1
堵塞了!一直。没办法,只能关闭。
现求堵塞的原因以及不堵塞的办法。
mayudong1 2010-10-17
  • 打赏
  • 举报
回复
10054说明server端关闭了socket
bzg2010 2010-10-17
  • 打赏
  • 举报
回复
自已写的程序,client往server发送消息,总是返回10054;
用其他的WINDOWS程序,有时候也会返回这个错误吗?
当然,这两者没有什么联系。只是现象类似。
mayudong1 2010-10-17
  • 打赏
  • 举报
回复
发送数据前使用select判断下当前该socket是否可写,可写再调用send

18,356

社区成员

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

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