关于事件模型
小弟最近看<windows网络编程>一书 学 事件模型 COPY代码如下:
SOCKET sock[WSA_MAXINUM_WAIT_EVENTS];
WSAEVENT Event[WSA_MAXINUM_WAIT_EVENTS];
WSAEVENT NewEvent;
SOCKET Accpet , Listen;
SOCKADDR_IN InternetAddr;
DWORD EventTotal = 0;
DWORD Index;
WSANETWORKEVENTS NetworkEvent;
char buffer[256];
memset( buffer,0,256 );
Listen = socket( PF_INET , SOCK_STREAM , 0 );
InternetAddr.sin_family = AF_INET;
InternetAddr.sin_addr.S_un.S_addr = htonl( INADDR_ANY );
InternetAddr.sin_port = htons( 5010 );
NewEvent = WSACreateEvent();
//WSAEventSelect(Listen,NewEvent,FD_ACCEPT|FD_CLOSE);
int ret = ::WSAEventSelect(Listen,NewEvent,FD_ACCEPT|FD_READ|FD_WRITE|FD_CLOSE);//这里设置事件
if (ret != 0)
{
printf("WSAEventSelect error!");
}
bind( Listen ,(SOCKADDR*)&InternetAddr , sizeof(SOCKADDR) );
listen( Listen ,5 );
sock[EventTotal] = Listen;
Event[EventTotal]= NewEvent;
EventTotal++;
while ( true )
{
Index = ::WSAWaitForMultipleEvents( EventTotal, Event , FALSE ,WSA_INFINITE , FALSE );
::WSAEnumNetworkEvents( sock[Index-WSA_WAIT_EVENT_0] , Event[Index-WSA_WAIT_EVENT_0] , &NetworkEvent);
//FD_ACCEPT
if ( NetworkEvent.lNetworkEvents & FD_ACCEPT )
{
if ( NetworkEvent.iErrorCode[FD_ACCEPT_BIT] != 0 )
{
printf("FD_ACCEPT failed with error %d\n!",
NetworkEvent.iErrorCode[FD_ACCEPT_BIT]);
break;
}
Accpet = accept( sock[Index-WSA_WAIT_EVENT_0],NULL,NULL );
if ( EventTotal > WSA_MAXINUM_WAIT_EVENTS)
{
printf("too many connections!\n");
closesocket(Accpet);
break;
}
NewEvent = WSACreateEvent();
WSAEventSelect( Listen , NewEvent , FD_ACCEPT|FD_READ|FD_WRITE|FD_CLOSE );
Event[EventTotal]= NewEvent;
sock[EventTotal] = Accpet;
EventTotal++;
printf("Socket %d connectioned\n",Accpet);
//send( Accpet,"this is Server!",strlen("this is Server!")+1,0);
}
//FD_READ
if ( NetworkEvent.lNetworkEvents & FD_READ )
{
if ( NetworkEvent.iErrorCode[FD_READ_BIT] != 0 )
{
printf("FD_READ failed with error %d\n!",
NetworkEvent.iErrorCode[FD_READ_BIT]);
break;
}
recv( sock[Index-WSA_WAIT_EVENT_0] , buffer ,sizeof(buffer),0 );
printf("recv buffer: %s\n",buffer);
}
//FD_WRITE
if ( NetworkEvent.lNetworkEvents & FD_WRITE )
{
if ( NetworkEvent.iErrorCode[FD_WRITE_BIT] != 0 )
{
printf("FD_WRITE failed with error %d\n!",
NetworkEvent.iErrorCode[FD_WRITE_BIT]);
break;
}
send( sock[Index-WSA_WAIT_EVENT_0],buffer,sizeof(buffer),0 );
printf("send buffer: %s\n",buffer);
}
//FD_CLOSE
if ( NetworkEvent.lNetworkEvents & FD_CLOSE )
{
if ( NetworkEvent.iErrorCode[FD_CLOSE_BIT] != 0 )
{
printf("FD_CLOSE failed with error %d\n!",
NetworkEvent.iErrorCode[FD_CLOSE_BIT]);
break;
}
closesocket(sock[Index-WSA_WAIT_EVENT_0]);
printf("client close!\n");
}
}
return 1;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
问题如下:
为什么我的服务器只能处理到FD_ACCEPT,其他事件都无法处理.因为之前我写的//WSAEventSelect(Listen,NewEvent,FD_ACCEPT|FD_CLOSE); 朋友说的这样没有注册到事件,后来我改成::WSAEventSelect(Listen,NewEvent,FD_ACCEPT|FD_READ|FD_WRITE|FD_CLOSE);
但是还是不行.请教各位了 . 客户端是没问题的.