⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wsaeventselect.cpp

📁 WinSocket各种阻塞非阻塞模式的简单例子都已通过调试适合网络编程初学者
💻 CPP
字号:
#include "../comm/initsock.h"
#include <stdio.h>

CInitSock initSock;


int main()
{
	//事件句柄和套接字句柄表
	WSAEVENT	eventArray[WSA_MAXIMUM_WAIT_EVENTS]; //WSA_MAXIMUM_WAIT_EVENTS = 64,一个线程最多支持64
	SOCKET		sockArray[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);
			//WSA_WAIT_FAILED:函数调用失败;WSA_WAIT_TIMEOUT:时间超时 
			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)
				{
					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 eventNew = ::WSACreateEvent();
						::WSAEventSelect(sNew, eventNew, FD_READ|FD_WRITE|FD_CLOSE);

						//添加到表中
						eventArray[nEventTotal] = eventNew;
						sockArray[nEventTotal] = sNew;
						nEventTotal++;
					}
				}
				else if (event.lNetworkEvents & 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)
				{
					if (event.iErrorCode[FD_CLOSE_BIT] == 0)
					{
						::closesocket(sockArray[i]);
						for (int j=i; j<nEventTotal-1; j++)
						{
							sockArray[j] = sockArray[j+1];
							eventArray[j] = eventArray[j+1];
						}
						nEventTotal--;
					}
				}
				else if (event.lNetworkEvents & FD_WRITE)
				{
				}
			}
		}
	}

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -