在客户端有如下程序:
g_Event = WSACreateEvent();
nRet = WSAEventSelect(LocalSocket,g_Event,FD_CONNECT | FD_CLOSE | FD_ACCEPT);
g_AllEvents[unEventCount] = g_Event;
g_Socket[unEventCount] = LocalSocket;
unEventCount++;
while(TRUE)
{
int nIndex = 0;
nIndex = WSAWaitForMultipleEvents(unEventCount,g_AllEvents,FALSE,WSA_INFINITE,FALSE);
switch(nIndex)
{
case WSA_WAIT_EVENT_0:
Debug("Event0\n");
WSAEnumNetworkEvents(LocalSocket,g_AllEvents,&newEvent);
if(newEvent.lNetworkEvents & FD_ACCEPT)
{
//accept link
int len = sizeof(SOCKADDR);
sockaddr_in ConnAddr;
ConnSock = accept(LocalSocket,(SOCKADDR*)&ConnAddr,&len);
if(ConnSock == INVALID_SOCKET )
{
Debug(msg,"ErrorCode = %d\n",WSAGetLastError());
return 0;
} g_Event = WSACreateEvent();
nRet = WSAEventSelect(ConnSock,g_Event,FD_READ | FD_CONNECT | FD_CLOSE); g_AllEvents[unEventCount] = g_Event;
unEventCount++;
}
break; case WSA_WAIT_EVENT_0 + 1: WSAEnumNetworkEvents(ConnSock,g_AllEvents,&newEvent);
if(newEvent.lNetworkEvents & FD_READ)
{
//receive data
char szData[100];
memset(szData,'\0',100);
int nReceiveSize = recv(ConnSock,szData,100,0);
bEndFlag = TRUE;
closesocket(ConnSock);
}
break;
default:
break;
}
然后从客户端发送数据,accept可以执行成功,但是收数据的那一块执行不到。求高手指教。
g_Event = WSACreateEvent();
nRet = WSAEventSelect(LocalSocket,g_Event,FD_CONNECT | FD_CLOSE | FD_ACCEPT);
g_AllEvents[unEventCount] = g_Event;
g_Socket[unEventCount] = LocalSocket;
unEventCount++;
while(TRUE)
{
int nIndex = 0;
nIndex = WSAWaitForMultipleEvents(unEventCount,g_AllEvents,FALSE,WSA_INFINITE,FALSE);
switch(nIndex)
{
case WSA_WAIT_EVENT_0:
Debug("Event0\n");
WSAEnumNetworkEvents(LocalSocket,g_AllEvents,&newEvent);
if(newEvent.lNetworkEvents & FD_ACCEPT)
{
//accept link
int len = sizeof(SOCKADDR);
sockaddr_in ConnAddr;
ConnSock = accept(LocalSocket,(SOCKADDR*)&ConnAddr,&len);
if(ConnSock == INVALID_SOCKET )
{
Debug(msg,"ErrorCode = %d\n",WSAGetLastError());
return 0;
} g_Event = WSACreateEvent();
nRet = WSAEventSelect(ConnSock,g_Event,FD_READ | FD_CONNECT | FD_CLOSE); g_AllEvents[unEventCount] = g_Event;
unEventCount++;
}
break; case WSA_WAIT_EVENT_0 + 1: WSAEnumNetworkEvents(ConnSock,g_AllEvents,&newEvent);
if(newEvent.lNetworkEvents & FD_READ)
{
//receive data
char szData[100];
memset(szData,'\0',100);
int nReceiveSize = recv(ConnSock,szData,100,0);
bEndFlag = TRUE;
closesocket(ConnSock);
}
break;
default:
break;
}
然后从客户端发送数据,accept可以执行成功,但是收数据的那一块执行不到。求高手指教。
下面的语句,看得挺别扭的
while(TRUE)
{
int nIndex = WSAWaitForMultipleEvents(unEventCount, AllEvents,FALSE,WSA_INFINITE,FALSE)'
nIndex -= WSA_WAIT_EVENT_0;
for(int i=nIndex; i<unEventCount; i++)
{
nIndex = WSAWaitForSingleEvents(1, AllEvents[i], TRUE, 1000, FALSE);
if(WSA_WAIT_FAILED == nIndex || WSA_WAIT_TIMEOUT == nIndex)
{
continue;
}
else
{
WSANETWORKEVENTS event;
WSAEnumNetworkEvents(g_Socket[i], AllEvents[i], &event);
if(event.lNetworkEvents & FD_ACCEPT)
{
if(0 == event.iErrorCode[FD_ACCEPT_BIT])
{
if(unEventCount > WSA_MAXIMUM_WAIT_EVENTS)
{
// Too many connections
continue;
}
SOCKET sNew = accept(g_Socket[i], NULL, NULL);
WSAEVENT evt = WSACreateEvent();
WSAEventSelect(sNew, evt, FD_READ|FD_CLOSE|FD_WRITE);
g_Socket[unEventCount] = sNew;
AllEvents[unEventCount] = evt;
unEventCount++;
}
}
else if(event.lNetworkEvents & FD_READ)
{
if(0 == event.iErrorCode[FD_READ_BIT])
{
char szText[256] ={0};
int nRecv = recv(g_Socket[i], sztext, 256, 0);
//... 接收到数据
}
}
}
else if(event.lNetworkEvents & FD_CLOSE)
{
if(0 == event.iErrorCode[FD_CLOSE_BIT])
{
closesocket(g_Socket[i]);
for(int j=i; j<unEventCount-1;j++)
{
g_Socket[j] = g_Socket[j+1];
AllEvents[j] = AllEvents[j+1];
}
unEventCount--;
}
}
else if(event.lNetworkEvents & FD_WRITE)
{
if(0 == event.lErroCode[FD_WRITE_BIT])
{
// 写数据
}
}
}
}