您的位置:首页 > 其它

WSAEventSelect模型

2010-09-28 11:19 375 查看
#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呀!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: