WinSock编程,WSAAsyncSelect模式,返回WSAEWOULDBLOCK错误

yndfcd 2004-12-17 01:36:36
代码片段如下
用了WSAAsyncSelect模式,设置接与FD_READ和FD_CLOSE通知,在FD_READ消息中发送数据出错.
case FD_READ:
int len;
ioctlsocket( wParam, FIONREAD, &len )
char* buffer = new char[len];
recv( wParam, buffer, len, 0 );

//处理接收的数据
...........

//发送数扰

MessageHeader* hdr = buffer;
hdr->Message = PLAYERID;
hdr->Size = sizeof( UINT );
memcpy( hdr->Data, &id , sizeof( id ) );
send( wParam, buffer, len, 0 );//这时发生WSAEWOULDBLOCK错误。
大概是什么原因,高手指点一下。
感觉这时并没有数据等待发送
...全文
202 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yndfcd 2004-12-20
  • 打赏
  • 举报
回复
第一次做网络编程,请大伙说得详细点,谢谢。
yndfcd 2004-12-20
  • 打赏
  • 举报
回复
继续上面的问题.

现在我在WSAAsyncSelect函数中加入FD_WRITE消息通知,再send返回WSAEWOULDBLOCK时,将没有发送成功的消息加到一个队列中.
代码如下:
case FD_READ:
int len;
ioctlsocket( wParam, FIONREAD, &len )
char* buffer = new char[len];
recv( wParam, buffer, len, 0 );

//处理接收的数据
...........

//发送数据
MessageHeader* hdr = buffer;
hdr->Message = PLAYERID;
hdr->Size = sizeof( UINT );
memcpy( hdr->Data, &id , sizeof( id ) );
send( wParam, buffer, len, 0 );//这里以前发生WSAEWOULDBLOCK错误。
if( ret == WSAEWOULDBLOCK )
{
Packet p;
p.size = bufsize;
memcpy( p.buffer, buffer, bufsize );
gsqueue[wParam].push( p ); //map< SOCKET, queue< Packet > > gsqueue;
}
其他没有提到的代码保待不变。

现在发现,send不会返回WSAEWOULDBLOCK了,只要没有用FD_WRITE,这里就又会出现WSAEWOULDBLOCK错误。这就是问题一:为什么会出现这种情况?


问题二:这个是一个服务器程序。我将两个客户程序连接到服务器上来。发现这一个客户程序完全正常,第二个客户程序不能收到上面的提到那个send发送的消息。而其它地方send的消息可以收到。如果我用调试模式单步执行操作,那个send发送的消息第二个客户程序可以收到;如果我在那个send的前面加上一个MessageBox调用,第二个客户程序也可以收到消息.如果什么都不加,直接用上面的代码,就收不到(注:服务器和两个客户程序运行在同一台机器上)。这是到底是怎么回事?
HunterForPig 2004-12-17
  • 打赏
  • 举报
回复
这实际上不算是错误
看看msdn的描述
This error is returned from operations on nonblocking sockets that cannot be completed immediately, for example recv when no data is queued to be read from the socket. It is a nonfatal error, and the operation should be retried later. It is normal for WSAEWOULDBLOCK to be reported as the result from calling connect on a nonblocking SOCK_STREAM socket, since some time must elapse for the connection to be established.
danyueer 2004-12-17
  • 打赏
  • 举报
回复
这个错误表明,一个非阻塞的Socket操作正在进行,你无法进行其他操作。

根据你的描述,这些代码应该是在FD_READ消息的响应函数中,这个时候Socket正在处理接收消息的情况,无法发送信息,因此出错。你可以在执行完这个响应函数后,再执行send。

18,356

社区成员

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

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