-
2006-11-27
8.2.3WSAEventSelect - [winsock]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://xingzhesun.blogbus.com/logs/3921298.html
8.2.3WSAEventSelect
应用程序在一个或者多个套接字上,接收以事件为基础的网络事件通知。网络事件投递至一个事件对象句柄。
事件通知
WSAVENT WSACreateEvent(void);
BOOL WSAResetEvent(WSAEVENT hEvent);
BOOL WSACloseEvent(WSAEVENT hEvent);
int WSAEventSelect(SOCKET S, WSAEVENT hEventObject, long lNetworkEvents);DWORD WSAWaitForMultipleEvents(DWORD cEvents, const WSAEVENT FAR* lphEvents, BOOL fWaitAll, DWORD dwTimeout, BOOL fAlertable);
Index = WSAWaitForMultipleEvents();
MyEvent = EventArray[index - WSA_WAIT_EVENT_0];
int WSAEnumNetworkEvents(SOCKET s, WSAEVET hEventObject, LPWSANETWORKEVENTS lpNetworkEvents);SOCKET Socket[WSA_MAXIMUM_MAIT_EVENTS];
WSAEVENT Event[WSA_MAXIMUM_MAIT_EVENTS];
SOCKET Accept, Listen;
DWORD EventTotal = 0;
DWORD Index;//Set up a TCP socket for listening on port 5150;
Listen = socket(PF_INET, SOCKET_STREAM, 0);InternetAddr.sin_family = AF_INET;
InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
InternetAddr.sin_port = htons(5105);bind(Listen, (PSOCKADDR)&InternetAddr, sizeof(InternetAddr));
NewEvent = WSACreateEvent();
WSAEventSelect(Listen, NewEvent, FD_ACCEP|FD_CLOSE);
listen(Listen, 5);
Socket[EventTotal] = Listen;
Event[EventTotal] = NewEvent;
EventTotal++;while(TRUE)
{
//Wait for network events on all sockets
Index = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, WSA_INFINITE, FALSE);
WSAEnumNetworkEvents(SocketArray[Index - WSAWAIT_EVENT_0],EventArray[Index_WSA_WAIT_EVENT_0], &NetworkEvents);
//check for FD_ACCEPT messages
if(NetWorkEvents.lNetworkEvents&FD_ACCEPT)
{
if(NetworkEvent.iErrorCode[FD_ACCEPT_BIT]!=0)
{
printf("FD_ACCEPT failed with error%d\n", NetWorkEvent.iErrorCode[FD_ACCEPT_BIT]);
break;
}
//Accept a new connection and it to the socket and event lists
Accept = accept(SocketArray[Index-WSA_WAIT_EVENT_0],NULL, NULL);
//We can not process more than WSA_MAXIMUM_WAIT_EVENTS sockets, so close the accepted socket
if(EventTotal > WSA_MAXIMUM_WAIT_EVENTS)
{
printf("Too many connecttions");
closesocket(Accept);
break;
}
NewEvent = WSACreateEvent();
WSAEventSelect(Accept, NewEvent, FD_READ|FD_WRITE|FD_CLOSE);
Event[EventTotal] = NewEvent;
Socket[EventTotal] = Accept;
EventTotal++;
printf("socket &d connected\n",ACCept);
}//Process FD_READ notification
if(NewWorkEvent.iErrorCode[FD_READ_BIT]!0)
{
if(NetworkEvents.iErrorCode[FD_READ_BIT]!=0)
{
printf("FD_READ failed with error %dn", NetworkEvent.iErrorCode[FD_READ_BIT]);
break;
}//Read data from socket
recv(Socket[Index - WSA_WAIT_EVENT_0], buffer, sizeof(buffer),0);
}//Process FD_WRITE notification
if(NetworkEvents.lNetworkEvents&FD_WRITE)
{
if(NetworkEvent.iErrorCode[FD_WRITE_BIT]!=0)
{
printf("FD_WRITE failed with error %d\n",
NetworkEvents.iErrorCode[FD_WRITE_BIT]);
break;
}
send(Socket[Index - WSA_WAIT_EVENT_0], buffer, sizeof(buffer),0);
}
if(NetworkEvents.lNetworkEvents&FD_CLOSE)
{
if(NetworkEvent.iErrorCode[FD_CLOSE_BIT]!=0)
{
printf("FD_CLOSE failed with error &d\n",
NetworkEvents.iErrorCode[FD_CLOSE_BIT]);
break;
}
}
closesocket(Socket[index - WSA_WAIT_EVET_0]);
//Remove socket and associated event from the socket and evnet array and decrement eventtatal
CompressArrays(Event, socket,&EventTotal);
}
}随机文章:
在在VC工程中去掉自动化接口 2008-07-21Windows网络编程经验小结 2007-02-058.2.5完成端口模型 2006-11-27第7章 Winsock基础 2006-11-24第六章 地址家族和名字解析 2006-11-20
收藏到:Del.icio.us








