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

wanmoxiaosheng 2007-06-21 09:31:53
刚开始学网络编程,采用阻塞模式向服务器发送数据,结果发送一段时间以后发生阻塞,成为处理瓶颈。如何解决这个问题?听说非阻塞模式可以解决,那么如何将Send()设置为非阻塞模式呢?
感谢你的关注。
...全文
1224 17 打赏 收藏 转发到动态 举报
写回复
用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函数。
适合人群:【学习前提】 1. 具备python3语言基础 【学习人群】 1. 手工测试人员学习UI自动化测试技能 2. 开发人员转岗测试开发岗位 3. 如具有丰富的自动化测经验,本课程可能并不满足你学习计划:1.下载课程中配套的软件资料 2.结合课件中Demo可完成学习任务课程目标:掌握UI自动化测试框架的设计与实现课程简介:UI自动化框架的设计需储备基础知识,方能完成自动化测试框架的实现,如数据驱动、日志、配置文件等AutoUiTestFrame自动化框架的目录结构初步进行规划,目录结构如下:Config 配置文件的目录v  config.ini 配置文件;v  globalconfig.py 获得日志路径、测试用例路径、测试报告路径、测试数据路径;v  Data 测试数据;v  TestData.xlsx 测试数据。Public 公共文件库v  Common 封装的公共的方法n  Commonconfig.py 公共的参数配置:调试过程中的测试数据等;n  DoExcel.py 操作excel(数据驱动);n  Send_mail.py 发送邮件(html);n  ReadConfigIni.py 读取ini格式的配置文件;n  TestCaseInfo.py  测试用例信息;n  Log.py 日志类。设置日志类,其他模块或文件需要日志类时,调用该文件。v  Pages 使用po模式设计的测试页面n  BasePage.py  基类,对一些测试页面公共方法、属性的封装及webdrive一些方法的二次封装;n  Bing.py 测试页面。Report 测试报告v  Log 日志目录n  *****log日志。v  TestReport 测试报告目录n  ***html测试报告。TestCase 测试用例v  TC_bing.py。Run.py  控制测试用例的运行。

18,356

社区成员

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

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