社区
网络编程
帖子详情
如何将Send()设置为非阻塞模式?
wanmoxiaosheng
2007-06-21 09:31:53
刚开始学网络编程,采用阻塞模式向服务器发送数据,结果发送一段时间以后发生阻塞,成为处理瓶颈。如何解决这个问题?听说非阻塞模式可以解决,那么如何将Send()设置为非阻塞模式呢?
感谢你的关注。
...全文
1334
17
打赏
收藏
如何将Send()设置为非阻塞模式?
刚开始学网络编程,采用阻塞模式向服务器发送数据,结果发送一段时间以后发生阻塞,成为处理瓶颈。如何解决这个问题?听说非阻塞模式可以解决,那么如何将Send()设置为非阻塞模式呢? 感谢你的关注。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
17 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wynney
2007-07-24
打赏
举报
回复
/*设置发送超时6秒*/
int TimeOut = 6000;
if( ::setsockopt(uSock,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut)) == SOCKET_ERROR )
{
WSACleanup( );
}
/*设置接收超时11秒*/
TimeOut = 11000;
if( ::setsockopt(uSock,SOL_SOCKET,SO_RCVTIMEO,(char*)&TimeOut,sizeof(TimeOut)) == SOCKET_ERROR )
{
WSACleanup( );
}
wanmoxiaosheng
2007-07-24
打赏
举报
回复
感谢各位的热心答复,等我把这个问题弄清除了再给大家得分.
wanmoxiaosheng
2007-07-24
打赏
举报
回复
感谢Big_Stone,我的邮箱地址为wanmoxiaosheng@gmail.com.
Big_Stone
2007-07-03
打赏
举报
回复
还可以用重叠I/O进行处理
Big_Stone
2007-07-03
打赏
举报
回复
u_long ul = 1L;
nRet = ioctlsocket(m_sockDesc, FIONBIO, (u_long FAR *)&ul);
if(SOCKET_ERROR == nRet)
------------------------------------------------------------
就是这样的,留下个EMAIL,我给你个完整的例子
yuyizhi
2007-07-03
打赏
举报
回复
改成非阻塞unsigned long int flag=1;
result=ioctlsocket(client,FIONBIO,&flag);
然后send()
再//set back to block mode咯
flag=0;
result=ioctlsocket(client,FIONBIO,&flag);
或设定超时setsockopt(client,SOL_SOCKET,SO_SNDTIMEO,(const char *)&sendtimeout,sizeof(sendtimeout)然后closesocket()?
redex
2007-07-03
打赏
举报
回复
Avoid(千金散去还复来), glunoy():
send确实会阻塞, 测试方案如下:
一个阻塞式客户端, 连一个阻塞式服务器, 服务器向客户端发大量数据,
但客户端模拟读数据非常慢的情况(读一次休息几秒钟), 当服务器端发送
缓冲区满时, 注意!!! send不出错,不返回,阻塞了!
"send不会阻塞" 这种说法太普遍了, 但好象实际动手测试的人很少啊...
WizardK
2007-07-02
打赏
举报
回复
你说的是RECV吧
xiaodongdehome
2007-07-02
打赏
举报
回复
按 2楼的, 把 socket 设置成 异步模式 没错!
WindRand
2007-07-02
打赏
举报
回复
你应该是把套接字设置为非阻塞模式,用ioctlsocket来完成。
aj3423
2007-07-01
打赏
举报
回复
“send会阻塞?
没听说过。。。”
我也觉得这样,send发送完了不就自动执行下面的代码了吗
hdqqq
2007-07-01
打赏
举报
回复
用WSASend,然后可以通过事件等待或者用完成端口处理.
glunoy
2007-07-01
打赏
举报
回复
send 是把东西放到系统的发送缓冲区并立即返回,不会引起所谓的阻塞。只有在缓冲区已满时返回一个异常。
Avoid
2007-06-30
打赏
举报
回复
send会阻塞?
没听说过。。。
wanmoxiaosheng
2007-06-30
打赏
举报
回复
有完整地例子吗?
ouyh12345
2007-06-21
打赏
举报
回复
好象不能光把send设为非阻塞。
u_long ul = 1L;
nRet = ioctlsocket(m_sockDesc, FIONBIO, (u_long FAR *)&ul);
if(SOCKET_ERROR == nRet)
{
sprintf( m_pszError, "Winsock error : %s (Error Code %d)\n", "Nonblocking socket call error", WSAGetLastError());
return FALSE;
}
ul为0时为阻塞,不为0时为非阻塞
wanmoxiaosheng
2007-06-21
打赏
举报
回复
补充一点,我使用的是Win32 API函数。
手把手写C++服务器(35):手撕代码——高并发高QPS技术基石之
非阻塞
send
【万字长文】
本文详细解析了C++服务器中如何通过
非阻塞
send
提升高并发场景下的QPS。深入探讨
send
/recv的本质,介绍文件描述符控制函数fcntl()用于
设置
非阻塞
模式
,并提供了服务端、客户端的实现框架,通过实验结果和tcpdump抓包分析,阐述
非阻塞
send
在实际应用中的效果。
python socket timeout
设置
本文详细解释了如何在Python中通过socket库
设置
阻塞和
非阻塞
模式
,包括如何
设置
超时时间以及如何正确处理
非阻塞
模式
下的
send
()和recv()操作。此外还介绍了
非阻塞
模式
下makefile()方法的限制。
[linux] 将socket
设置
为
非阻塞
(non-blocking)
本文揭示了一个关于
设置
socket
非阻塞
模式
的陷阱:使用ioctl
设置
FIONBIO标志可能不会生效。正确的做法是利用fcntl进行
设置
。此问题曾导致线程在
send
()调用处阻塞。
将socket
设置
为
非阻塞
(non-blocking) - 艾子的日志 - 网易博客
本文揭示了一个常见的编程误区,即使用ioctl
设置
socket
非阻塞
模式
可能无效。正确的做法应使用fcntl函数,通过获取并修改文件状态标志来实现。这一隐蔽问题可能导致线程在
send
()调用中阻塞。
网络编程
18,356
社区成员
64,165
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章