非阻塞方式,明明收到FD_READ消息了,可是recv收数据时,为什么还是返回WSAEWOULDBOLCK?

mbctb 2015-07-21 06:59:42
在服务器端,我的程序结构是这样的:用一个socket监听。监听到一个连接进入以后,将它保存在一个socket数组中,并将它设为非阻塞模式,将消息绑定到一个窗口中(所有连接进来的socket绑定到同一个窗口)。

然后在该窗口中接收消息,发现收到消息以后,并且LOWORD(lParam)为FD_READ时,我用recv接收这个消息,其中socket参数就用wParam,结果发现,有的时候(不是总是),还是返回WSAEWOULDBOLCK?我查了一下资料,这表示没有数据可读。

明明收到FD_READ了,为什么recv还是读不到数据?
...全文
408 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Magic丶旭 2015-08-15
  • 打赏
  • 举报
回复
因为当你调用了WSAAsyncSelect函数之后,这个函数会将套接字设置成非阻塞模式,那么当有消息可读的时候,你调用recv去接收数据,因为是非阻塞模式,recv函数会直接返回,它不管你有没有数据,不管你有没有成功地读取出来,这也就是它返回WSAEWOULDBOLCK的原因,如果你不设置非阻塞模式的话,那么recv函数会一直读取,除非读到了数据,否则recv是不会返回的。
杂家老周 2015-08-14
  • 打赏
  • 举报
回复
建议你网络通讯时,自己用线程处理,不要依赖消息
yhlzxq 2015-07-28
  • 打赏
  • 举报
回复
数据发到服务器
  • 打赏
  • 举报
回复
引用 3 楼 mbctb 的回复:
我还发现:当客户端连接服务器时,服务器会收到FD_READ消息,此时如果用recv读数据,会返回SOCKET_ERROR,用WSAGetLastError(),会得到10057,含义是无效的套接字。可是我用recv读数据的时候,套接字用的是wParam,按照资料,此时wParam就是套接字句柄. 这又是为什么呢?
这个我也没有深入研究,但我建议你还是用MFC封装好的CAsyncSocket来做吧。 这样复用性会更好,除非你有某些特别底层的处理要做,不然这个类足够了。
mbctb 2015-07-21
  • 打赏
  • 举报
回复
我还发现:当客户端连接服务器时,服务器会收到FD_READ消息,此时如果用recv读数据,会返回SOCKET_ERROR,用WSAGetLastError(),会得到10057,含义是无效的套接字。可是我用recv读数据的时候,套接字用的是wParam,按照资料,此时wParam就是套接字句柄. 这又是为什么呢?
mbctb 2015-07-21
  • 打赏
  • 举报
回复
引用 1 楼 dcmilan 的回复:
你能不能确定一下,当时确实有数据发到服务器了。
我刚才试了一下,原来是这样的:当客户端连接服务器的时候,服务器除了会收到FD_ACCEPT消息以外,还会收到FD_READ消息,我原以为只会收到FD_ACCEPT消息。 当客户端与服务器连接好了以后,客户端再发数据,服务端收到FD_READ消息后,确实不会出现读不到数据的情况。 我再试试。
  • 打赏
  • 举报
回复
你能不能确定一下,当时确实有数据发到服务器了。

18,356

社区成员

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

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