当调用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完成后再从队列中取出下一个数据包进行发送。。。