如何将Send()设置为非阻塞模式?

wanmoxiaosheng 2007-06-21 09:31:53
刚开始学网络编程,采用阻塞模式向服务器发送数据,结果发送一段时间以后发生阻塞,成为处理瓶颈。如何解决这个问题?听说非阻塞模式可以解决,那么如何将Send()设置为非阻塞模式呢?
感谢你的关注。
...全文
1303 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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函数。

18,363

社区成员

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

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