首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

当调用WSARecv后,能否调用WSASend进行发送数据?解决方案

2012-01-16 
当调用WSARecv后,能否调用WSASend进行发送数据?WSARecv和WSASend我使用了两个不同的WSAOVERLAPPED结构,先

当调用WSARecv后,能否调用WSASend进行发送数据?
WSARecv和WSASend我使用了两个不同的WSAOVERLAPPED结构,先调用WSARecv后,才调用WSASend发送数据没问题吗?WSARecv和WSASend是异步的,不会阻塞,但调用两次WSARecv会出现WSA_IO_PENDING错误,不知道调用WSARecv-> WSASend会不会同样出样WSA_IO_PENDING错误?如果会需要如何解决?

[解决办法]
代码说明一切:
// 创建监听socket,绑定,listen
WSAOVERLAPPED AcceptOverlapped;

while(TRUE)
{
NewConnection=accept(ListeningSocket,NULL,NULL);
if(NewConnection> 0)
break;
}
dm::DebugMessage(NewConnection,0, "NewConnection ");

EventArray[g_EventTotal]=WSACreateEvent();

ZeroMemory(&AcceptOverlapped,sizeof(WSAOVERLAPPED));

AcceptOverlapped.hEvent=EventArray[g_EventTotal];
g_EventTotal++;

DataBuf.len=13;
DataBuf.buf=buf;

if(WSARecv(NewConnection,&DataBuf,1,&RecvBytes,&Flags,&AcceptOverlapped,NULL)
==SOCKET_ERROR)
{
if(WSAGetLastError()!=WSA_IO_PENDING) ////////////////////// Look here
{
dm::DebugMessage( "Encounter an error ");
}
}

while(TRUE)
{
DWORD index;
index = WSAWaitForMultipleEvents(g_EventTotal,EventArray,
FALSE,WSA_INFINITE,FALSE);
dm::DebugMessage( "Event occur==============================> ");
WSAResetEvent(EventArray[index-WSA_WAIT_EVENT_0]);

if(WSAGetOverlappedResult(NewConnection,&AcceptOverlapped,&BytesTransferred,
FALSE,&Flags)==FALSE)
{
dm::DebugMessage( "WSAGetOverlappedResult error ");
}
else
{
dm::DebugMessage(Flags,0, "Flags ");
CString str=DataBuf.buf;
MessageBox(str);
}


// another I/O request
Flags=0;
ZeroMemory(&AcceptOverlapped,sizeof(WSAOVERLAPPED));

AcceptOverlapped.hEvent = EventArray[index-WSA_WAIT_EVENT_0];
DataBuf.len=13;
DataBuf.buf=buf;
if(WSARecv(NewConnection,&DataBuf,1,&RecvBytes,&Flags,&AcceptOverlapped,
NULL)==SOCKET_ERROR)
{
if(WSAGetLastError()!=WSA_IO_PENDING)
{
dm::DebugMessage( " another I/O no pending error ");
}
}

}
[解决办法]
WSARecv和WSASend我使用了两个不同的WSAOVERLAPPED结构,先调用WSARecv后,才调用WSASend发送数据没问题吗?

答: 没问题

WSARecv和WSASend是异步的,不会阻塞,但调用两次WSARecv会出现WSA_IO_PENDING错误,不知道调用WSARecv-> WSASend会不会同样出样WSA_IO_PENDING错误?

答: 会

如果会需要如何解决?

答: 这是它的特性啊,为什么要解决?
[解决办法]
WSARecv/WSASend使用不同的OVERLAPPED的结构没问题,在连续调用WSASend或是WSARecv时应该处理WSA_IOPENDING

应该将所有的数据排队缓冲,一次IO完成后再从队列中取出下一个数据包进行发送。。。

热点排行