社区
网络编程
帖子详情
Socket在send数据时,有时会出现堵塞的情况如何处理?
bzg2010
2010-10-17 02:11:32
Socket设置的是堵塞模式。
发送的消息多了,send会偶尔出现返回-1的情况。
然后一直发一直发,等了30分钟的循环,还发不出去,估计死在那里了。
问题一:什么情况下,Socket会堵塞?
问题二:堵塞能够恢复吗?
问题三:一直堵塞只能是关闭连接重连?
问题四:我最终的目录不是重连,是为了不堵塞。但不能够修改Socket的模式。有什么好办法?
...全文
994
16
打赏
收藏
Socket在send数据时,有时会出现堵塞的情况如何处理?
Socket设置的是堵塞模式。 发送的消息多了,send会偶尔出现返回-1的情况。 然后一直发一直发,等了30分钟的循环,还发不出去,估计死在那里了。 问题一:什么情况下,Socket会堵塞? 问题二:堵塞能够恢复吗? 问题三:一直堵塞只能是关闭连接重连? 问题四:我最终的目录不是重连,是为了不堵塞。但不能够修改Socket的模式。有什么好办法?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
C++
Socket
编程(二)
send
与recv 缓冲区与阻塞
socket
缓冲区每一个
socket
在被创建之后,系统都
会
给它分配两个缓冲区,即输入缓冲区和输出缓冲区。
send
函数并不是直接将
数据
传输到网络中,而是负责将
数据
写入输出缓冲区,
数据
从输出缓冲区发送到目标主机是由TCP协议完成的。
数据
写入到输出缓冲区之后,
send
函数就可以返回了,
数据
是否发送出去,是否发送成功,何
时
到达目标主机,都不由它负责了,而是由协议负责。recv函数也是一样的,它并不是直
socket
阻塞态、非阻塞态理解
1、
socket
默认是阻塞的,阻塞
时
:
send
函数如果可用空间大小小于要发送的
数据
长度,则
send
会
被阻塞,直到缓冲区中的
数据
被发送到目标主机,有了足够的空间之后,
send
函数才
会
将
数据
写入输出缓冲区。 要写入的
数据
大于输出缓冲区的最大长度的
时
候,要分多次写入,直到所有
数据
都被写到缓冲区之后,
send
函数才
会
返回。 recv函数,函数先检查输入缓冲区,如果输入缓冲区中有
数据
,读取出缓冲区中的
数据
,否则的话,recv函数
会
被阻塞,等待网络上传来
数据
。如果每次读取的
数据
长度小于buffer的
数据
长度.
socket
阻塞模式
对于TCP套接字,当使用 write()/
send
() 发送
数据
时
: 1、如果缓冲区可用空间小于
数据
的发送长度
时
,
会
停止发送
数据
,发生阻塞
情况
; 2、如果TCP协议正在向网络发送
数据
,输出缓冲区
会
被锁定,不允许写入,write()/
send
() 也
会
被阻塞,直到
数据
发送完毕缓冲区解锁,write()/
send
() 才
会
被唤醒; 3、如果要写入的
数据
长度大于缓冲区的最大长度,那么将分批写入; 4、直到所有
数据
被写入缓冲区 write()/
send
() 才能返回。 当使用 read()/recv() 读取
数据
时
socket
中
send
和recv函数的阻塞理解
int
send
(
SOCKET
s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用
send
函数来向TCP连接的另一端发送
数据
。客户程序一般用
send
函数向服务器发送请求,而服务器则通常用
send
函数来向客户程序发送应答。 该函数的第一个参数指定发送端套接字描述符(发给谁写谁的
socket
); 第二个参数指
客户端断开
socket
连接, 服务端
send
向一个失效的
socket
发送
数据
,导致服务的进程退出
问题描述: 客户端断开
socket
连接, 服务端
send
向一个失效的
socket
发送
数据
,导致服务的进程退出。 原因分析: 在linux下写
socket
的程序的
时
候,如果尝试
send
到一个disconnected
socket
上,就
会
让底层抛出一个SIGPIPE信号。 这个信号的缺省
处理
方法是退出进程,大多数
时
候这都不是我们期望的。因此我们需要重载这个信号的
处理
方法。 解决方法可以有两...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章