怎么FD_WRITE FD_READ一起触发了呢?
服务器端采用的是事件选择,当客户端向服务器端发送消息时,服务器端的FD_WRITE FD_READ怎么一起触发了呢?
if(WSAEventSelect(sAccept,pRecvEvent,FD_WRITE|FD_READ|FD_CLOSE)==SOCKET_ERROR)
{
break;
}
DWORD dwWaitResult;
dwWaitResult = WSAWaitForMultipleEvents(1, pRecvEvent, FALSE,WSA_INFINITE,FALSE);
if (dwWaitResult==WSA_WAIT_FAILED)
{
WSAEventSelect(sAccept, pRecvEvent, 0);
CloseHandle(pRecvEvent);
return -1;
}
dwWaitResult=dwWaitResult-WSA_WAIT_EVENT_0;
if(dwWaitResult==0)
{
closesocket(sAccept);
return -1;
}
else if(dwWaitResult==1)
{
WSANETWORKEVENTS wNetworkEvents;
if(WSAEnumNetworkEvents(sAccept,pRecvEvent,&wNetworkEvents) == SOCKET_ERROR)
{
WSAEventSelect(sAccept, pRecvEvent, 0);
CloseHandle(pRecvEvent);
return (SOCKET_ERROR);
}
if(wNetworkEvents.lNetworkEvents&FD_READ||wNetworkEvents.lNetworkEvents&FD_WRITE)
{
if(wNetworkEvents.lNetworkEvents&FD_READ&&wNetworkEvents.iErrorCode[FD_READ_BIT]!=0)
{
WSAEventSelect(sAccept,pRecvEvent, 0);
CloseHandle(pRecvEvent);
AfxMessageBox("FD_READ error");
break;
}
else
{
AfxMessageBox("读事件");
int nRet;
int idx=0;
char buffer[256];
nRet=recv(sAccept,buffer,256,0);
}
if(wNetworkEvents.lNetworkEvents&FD_WRITE&&wNetworkEvents.iErrorCode[FD_WRITE_BIT]!=0)
{
AfxMessageBox("FD_WRITE error");
WSAEventSelect(sAccept,pRecvEvent[1], 0);
CloseHandle(pRecvEvent);
AfxMessageBox("FD_WRITE error");
break;
}
else
{
AfxMessageBox("写事件");
}
WSAResetEvent(pRecvEvent);
}
}
要关门了,没有时间修改了,大体的过程就是这样,服务器并没有像客户端发消息,不知道为什么显示了写事件也触发了??
问题点数:10、回复次数:5Top
1 楼stevecrisewu(月亮骑士)回复于 2004-09-04 09:18:33 得分 8
FD_WRITE在下面四种情况发生
1。When WSAAsyncSelect called, if a send or sendto is possible.
2。After connect or accept called, when connection established.
3。After send or sendto fail with WSAEWOULDBLOCK, when send or sendto are likely to succeed.
4。After bind on a connectionless socket. FD_WRITE may or may not occur at this time (implementation-dependent). In any case, a connectionless socket is always writeable immediately after a bind operation.
从你的描述中,可能是这种情况:
你的客户连接进来后立刻发送消息给服务器,因此,你调试跟踪时候发现FD_WRITE和FD_READ好像同时发生了,其实不然。客户连接进来时候也触发了FD_WRITE事件。Top
2 楼flyingjm((我要找工作))回复于 2004-09-04 09:46:47 得分 0
好像是啊,因为刚连接近来的时候,我没有发送消息也就触发了这两个事件了?Top
3 楼flyingjm((我要找工作))回复于 2004-09-04 09:47:18 得分 0
有这方面的例子吗?
感觉看书看的也没有什么效果Top
4 楼hellopine()回复于 2004-09-04 15:10:48 得分 2
用API函数比较好
我一直用Top
5 楼flyingjm((我要找工作))回复于 2004-09-05 20:15:20 得分 0
楼上的能给各例子吗〉?Top




