#include <winsock2.h> #include <stdlib.h> #pragma comment(lib, "WS2_32") // 链接到WS2_32.lib class CInitSock { public: CInitSock(BYTE minorVer = 2, BYTE majorVer = 2) { // 初始化WS2_32.dll WSADATA wsaData; WORD sockVersion = MAKEWORD(minorVer, majorVer); if(::WSAStartup(sockVersion, &wsaData) != 0) { exit(0); } } ~CInitSock() { ::WSACleanup(); } }; initsock.h // WSAEventSelect.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "../common/initsock.h" CInitSock initsock; int cout=0; int main(int argc, char* argv[]) { SOCKET socks[WSA_MAXIMUM_WAIT_EVENTS]; WSAEVENT sevent[WSA_MAXIMUM_WAIT_EVENTS]; sockaddr_in si; SOCKET listensock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(listensock == SOCKET_ERROR) { printf("create sock error !/n"); return -1; } si.sin_family = AF_INET; si.sin_port = htons(5000); si.sin_addr.S_un.S_addr = INADDR_ANY; if(bind(listensock,(struct sockaddr *)&si,sizeof(si)) == SOCKET_ERROR) { printf("bind error !/n"); closesocket(listensock); return -1; } listen(listensock,5); WSAEVENT event = WSACreateEvent(); WSAEventSelect(listensock,event,FD_ACCEPT|FD_CLOSE); sevent[cout] = event; socks[cout] = listensock; cout++; while (true) { int index = WSAWaitForMultipleEvents(cout,sevent,false,WSA_INFINITE,false); index -= WSA_WAIT_EVENT_0; for (int i = index; i<cout ;i++) { index = WSAWaitForMultipleEvents(1,&sevent[i],false,1000,false); if (index == WSA_WAIT_FAILED || index == WSA_WAIT_TIMEOUT) { continue; } else { WSANETWORKEVENTS nevent; WSAEnumNetworkEvents(socks[i],sevent[i],&nevent); if (nevent.lNetworkEvents & FD_ACCEPT) { if(nevent.iErrorCode[FD_ACCEPT_BIT] == 0) { if(cout > WSA_MAXIMUM_WAIT_EVENTS) { printf("too max !/n"); continue; } SOCKET acceptsock = accept(socks[i],NULL,NULL); WSAEVENT acceptevent = WSACreateEvent(); WSAEventSelect(acceptsock,acceptevent,FD_WRITE|FD_CLOSE|FD_READ); socks[cout] = acceptsock; sevent[cout] = acceptevent; cout++; } printf("/ncount : %d",cout); } else if (nevent.lNetworkEvents & FD_READ) { if (nevent.iErrorCode[FD_READ_BIT] == 0) { char buff[100]; int len = recv(socks[i],buff,100,0); if(len <= 0) { closesocket(socks[i]); CloseHandle(sevent[i]); for (int j = i; j < cout - 1; j++) { socks[j] = socks[j + 1]; sevent[j] = sevent[j + 1]; } cout--; continue; } buff[len] = '/0'; printf("recv buff : %s/n",buff); } } else if (nevent.lNetworkEvents & FD_CLOSE) { if (nevent.iErrorCode[FD_CLOSE_BIT] == 0) { closesocket(socks[i]); CloseHandle(sevent[i]); for (int j = i; j < cout -1; j++) { socks[j] = socks[j+1]; sevent[j] = sevent[j+1]; } cout--; } } else if (nevent.lNetworkEvents & FD_WRITE) { continue; } } } } return 0; } WSAEventSelect.cpp 这些天看WINDOWS网络编程,发现这些SELECT模型效率太慢,还是得用IOCP呀!