WSAEventSelect模型

来源:互联网 发布:qq头像透明软件 编辑:程序博客网 时间:2024/06/05 00:53
//////////////////////////////////////////////////// WSAEventSelect文件#include <winsock2.h>#include <stdio.h>#include <iostream>#include <windows.h>#pragma comment(lib, "WS2_32")int main(){WSADATA wsaData;WORD sockVersion = MAKEWORD(2, 2);WSAStartup(sockVersion, &wsaData);// 事件句柄和套节字句柄表WSAEVENTeventArray[WSA_MAXIMUM_WAIT_EVENTS];SOCKETsockArray[WSA_MAXIMUM_WAIT_EVENTS];int nEventTotal = 0;USHORT nPort = 4567;// 此服务器监听的端口号// 创建监听套节字SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(nPort);sin.sin_addr.S_un.S_addr = INADDR_ANY;if(::bind(sListen, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR){printf(" Failed bind() \n");return -1;}::listen(sListen, 5);// 创建事件对象,并关联到新的套节字WSAEVENT event = ::WSACreateEvent();::WSAEventSelect(sListen, event, FD_ACCEPT|FD_CLOSE);// 添加到表中eventArray[nEventTotal] = event;sockArray[nEventTotal] = sListen;nEventTotal++;// 处理网络事件while(TRUE){// 在所有事件对象上等待int nIndex = ::WSAWaitForMultipleEvents(nEventTotal, eventArray, FALSE, WSA_INFINITE, FALSE);// 对每个事件调用WSAWaitForMultipleEvents函数,以便确定它的状态nIndex = nIndex - WSA_WAIT_EVENT_0;for(int i=nIndex; i<nEventTotal; i++){nIndex = ::WSAWaitForMultipleEvents(1, &eventArray[i], TRUE, 1000, FALSE);if(nIndex == WSA_WAIT_FAILED || nIndex == WSA_WAIT_TIMEOUT){continue;}else{// 获取到来的通知消息,WSAEnumNetworkEvents函数会自动重置受信事件WSANETWORKEVENTS event;::WSAEnumNetworkEvents(sockArray[i], eventArray[i], &event);if(event.lNetworkEvents & FD_ACCEPT)// 处理FD_ACCEPT通知消息{if(event.iErrorCode[FD_ACCEPT_BIT] == 0){if(nEventTotal > WSA_MAXIMUM_WAIT_EVENTS){printf(" Too many connections! \n");continue;}SOCKET sNew = ::accept(sockArray[i], NULL, NULL);WSAEVENT event = ::WSACreateEvent();::WSAEventSelect(sNew, event, FD_READ|FD_CLOSE|FD_WRITE);// 添加到表中eventArray[nEventTotal] = event;sockArray[nEventTotal] = sNew;nEventTotal++;}}else if(event.lNetworkEvents & FD_READ)// 处理FD_READ通知消息{if(event.iErrorCode[FD_READ_BIT] == 0){char szText[256];int nRecv = ::recv(sockArray[i], szText, strlen(szText), 0);if(nRecv > 0){szText[nRecv] = '\0';printf("接收到数据:%s \n", szText);}}}else if(event.lNetworkEvents & FD_CLOSE)// 处理FD_CLOSE通知消息{if(event.iErrorCode[FD_CLOSE_BIT] == 0){::closesocket(sockArray[i]);for(int j=i; j<nEventTotal-1; j++){sockArray[j] = sockArray[j+1];sockArray[j] = sockArray[j+1];}nEventTotal--;}}else if(event.lNetworkEvents & FD_WRITE)// 处理FD_WRITE通知消息{}}}}WSACleanup();return 0;}



#include <Winsock2.h>#include <stdio.h>#pragma comment (lib,"Ws2_32.lib")int main (void){//加载套接字WORD wVersionRequested=MAKEWORD(2,2);WSADATA lpWSAData;WSAStartup(wVersionRequested,&lpWSAData);//创建socketSOCKET sockSrv=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(4567);//连接if (connect(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))==SOCKET_ERROR){printf("连接失败\n");return 0;}char Sendbuff[100]={0};sprintf(Sendbuff,"this zhangsan");send(sockSrv,Sendbuff,strlen(Sendbuff+1),0);closesocket(sockSrv);WSACleanup();getchar();return 0;}


0 0