recv使用问题

aslprince 2010-05-03 12:25:12

我已经设置SOCKET为非阻塞模式了
但是经常还是会出现阻塞。。。。。。。

这是为啥子呢???
...全文
233 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2010-05-03
  • 打赏
  • 举报
回复
SOCKET sock = WSASocket(AF_INET, SOCK_..., 0, NULL, 0, WSA_FLAG_OVERLAPPED);
bragi523 2010-05-03
  • 打赏
  • 举报
回复
用getsockopt看下是否设置成功

另:socket属性不能传递
lijianli9 2010-05-03
  • 打赏
  • 举报
回复
发错了,不好意思。
lijianli9 2010-05-03
  • 打赏
  • 举报
回复
如果没有使用WSA_FLAG_OVERLAPPED这个关键字创建socket
可以使用这个
//设置非阻塞方式
unsigned long ul = 1;
ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul);
if(ret==SOCKET_ERROR)return 0;
尹成 2010-05-03
  • 打赏
  • 举报
回复
那要看你的设置,一般非阻塞模式要设置一个超时时间,超出这个时间就会返回;但如果你设置为一直都不返回,那么就会一种阻塞。

非阻塞模式模式recv/send
不管接收/发送是否成功,都立即返回。
recv
如果接收成功,返回接收到的字节数。
如果对方关闭连接,返回0
如果没有数据到来,返回SOCKET_ERROR(-1),WSAGetLastError返回WSAEWOULDBLOCK
此时必须等到FD_READ事件后,再接收。
注意:如果接收成功,不会再产生FD_READ事件。

send
如果成功,返回发送的字节数。
如果socket正忙,发送失败,返回SOCKET_ERROR(-1),WSAGetLastError返回WSAEWOULDBLOCK,
此时要发送的数据没有被发送或者放到发送队列里,必需等FD_WRITE事件后,重新发送。
注意:如果发送成功,不会再产生FD_WRITE事件。

18,356

社区成员

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

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