网络编程-3 异步通知I/O

#include<iostream>
#include<WinSock2.h>
#pragma warning(disable:4996)
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main()
{
	WSAData ws;
	WSAStartup(MAKEWORD(2, 2), &ws);

	SOCKET sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (INVALID_SOCKET == sockServer)
	{
		WSACleanup();
		return 0;
	}
	
	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(1024);
	char host[256];
	int nRes = gethostname(host, 256);
	if (0 != nRes)
	{
		return 0;
	}
	hostent *pHost = gethostbyname(host);
	pHost->h_addr_list[0];
	char *pIp = inet_ntoa(*(in_addr*)(pHost->h_addr_list[0]));
	cout << "本机Ip" << pIp << endl;
	addr.sin_addr.S_un.S_addr = inet_addr(pIp);
	if (SOCKET_ERROR == bind(sockServer, (sockaddr*)&addr, sizeof(sockaddr)))
	{
		return 0;
	}
	if (SOCKET_ERROR == listen(sockServer, 1))
	{
		return 0;
	}
	sockaddr_in addrClient;
	int nLen = sizeof(sockaddr_in);
	HANDLE hEvent = WSACreateEvent();
	HANDLE hArr[WSA_MAXIMUM_WAIT_EVENTS];
	SOCKET sockArr[WSA_MAXIMUM_WAIT_EVENTS];
	int num = 0;
	hArr[num] = hEvent;
	sockArr[num] = sockServer;
	num++;
	WSAEventSelect(sockServer, hEvent, FD_ACCEPT);
	char buf[256] = {0};
	WSANETWORKEVENTS nw;
	while (true)
	{
		int nRes = WSAWaitForMultipleEvents(num, hArr, false, WSA_INFINITE, false);
		for (int i = nRes; i < num; i++)
		{
			int nPos = WSAWaitForMultipleEvents(1, &hArr[i], true, 0, false);
			if (nPos == WSA_WAIT_FAILED || nPos == WSA_WAIT_TIMEOUT)
			{
				continue;
			}
			else
			{
				WSAEnumNetworkEvents(sockArr[i], hArr[i], &nw);
				if (nw.lNetworkEvents == FD_ACCEPT)
				{
					SOCKET sockClient = accept(sockArr[i],(sockaddr*)&addrClient, &nLen);
					HANDLE hEvent1 = WSACreateEvent();
					WSAEventSelect(sockClient, hEvent1, FD_READ|FD_CLOSE);
					hArr[num] = hEvent1;
					sockArr[num] = sockClient;
					num++;
					cout << "连接成功!" << endl;
					cout << "IP:"<<inet_ntoa(addrClient.sin_addr)<<endl;
					cout << "Port" << ntohs(addrClient.sin_port) << endl;
				}
				else if (nw.lNetworkEvents == FD_READ)
				{
					memset(buf, 0, 256);
					int nRecv = recv(sockArr[i], buf, 256, 0);
					if (0 == nRecv)
					{
						continue;
					}
					else
					{
						send(sockArr[i], buf, 256, 0);
					}
					
				}
				else if (nw.lNetworkEvents == FD_CLOSE)
				{
					closesocket(sockArr[i]);
					for (int j = i; j < num - 1; j++)
					{
						sockArr[j] = sockArr[j + 1];
						hArr[j] = hArr[j + 1];
					}
					num--;
				}
			}
		}
	}
	closesocket(sockServer);
	WSACleanup();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_37703001/article/details/88176863