社区
网络编程
帖子详情
如何将Send()设置为非阻塞模式?
wanmoxiaosheng
2007-06-21 09:31:53
刚开始学网络编程,采用阻塞模式向服务器发送数据,结果发送一段时间以后发生阻塞,成为处理瓶颈。如何解决这个问题?听说非阻塞模式可以解决,那么如何将Send()设置为非阻塞模式呢?
感谢你的关注。
...全文
1303
17
打赏
收藏
如何将Send()设置为非阻塞模式?
刚开始学网络编程,采用阻塞模式向服务器发送数据,结果发送一段时间以后发生阻塞,成为处理瓶颈。如何解决这个问题?听说非阻塞模式可以解决,那么如何将Send()设置为非阻塞模式呢? 感谢你的关注。
复制链接
扫一扫
分享
转发到动态
举报
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函数。
socket的阻塞
模式
和
非阻塞
模式
文章目录socket的阻塞
模式
和
非阻塞
模式
如何将socket
设置
为
非阻塞
模式
send
和recv函数在阻塞和
非阻塞
模式
下的表现
非阻塞
模式
下
send
和recv函数的返回值总结阻塞与
非阻塞
socket的各自使用场景 socket的阻塞
模式
和
非阻塞
模式
如何将socket
设置
为
非阻塞
模式
无论是Windows还是Linux,默认创建的socket都是阻塞
模式
的。 在linux上,我们可以使用fcntl函数或者ioctl函数给创建的socket增加O_NONBLOCK标志来将socket
设置
为
非阻塞
模式
。 int o
socket的阻塞
模式
和
非阻塞
模式
(
send
和recv函数在阻塞和
非阻塞
模式
下的表现)
socket的阻塞
模式
和
非阻塞
模式
无论是Windows还是Linux,默认创建socket都是阻塞
模式
的 在Linux中,可以再创建socket是直接将它
设置
为
非阻塞
模式
int socket (int __domain, int __type, int __protocol) 将__type增加SOCK_NOBLOCK 不仅如此,在Linux上直接利用accept函数返回的代表与客户端通信的socket也提供了一个拓展函数accept4,直接将accept4返回的socket
设置
为
非阻塞
的
send
和
服务器编程心得(四)—— 如何将socket
设置
为
非阻塞
模式
只要将accept4()最后一个参数flags
设置
成SOCK_NONBLOCK即可。3. 除了创建socket时,将socket
设置
成
非阻塞
模式
,还可以通过以下API函数来
设置
:参考:),linux下如果调用fcntl()
设置
socket为
非阻塞
模式
,不仅要
设置
O_NONBLOCK
模式
,还需要在接收和发送数据时,需要使用MSG_DONTWAIT标志,即在recv,recvfrom和
send
,
send
to数据时,将flag
设置
为MSG_DONTWAIT。
socket
设置
为
非阻塞
模式
1,套接字的默认状态是阻塞的。即当发出一个不能立即完成的套接字调用时,该进程将被投入睡眠,等待相应操作完成。2,阻塞的套接字分为下面四类:输入操作:包括read、recv、recvfrom和recvmsg。输出操作:包括write、
send
、
send
to和
send
msg。接受外来连接,accept 函数。发起外出连接,connect 函数。3,将一个socket
设置
成
非阻塞
模式
,使用fcntl...
WebServer为什么需要将socket
设置
为
非阻塞
?
目录一些基本概念解释1.socket文件描述符有哪些2.socket文件描述符
设置
为阻塞的影响二、使用epoll模型将socket
设置
为
非阻塞
1.listenfd
非阻塞
2.clientfd
非阻塞
(1)epoll的ET
模式
(2)epoll返回读写事件,但不一定真的可读写小结 一些基本概念解释 1.socket文件描述符有哪些 网络中的客户端和服务器进行连接通信时需要建立连接,服务器端需要两个socket文件描述符,分别是建立连接时需要的监听文件描述符listenfd和连接完成后的已连接文件描述符clientf
网络编程
18,363
社区成员
64,187
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章