windows重叠IO和event模型

//#include<windows.h>
#include<iostream>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;

int main() {
    
    
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
    
    
		cout << "wsastart faild<<endl" << endl;
		WSACleanup();
		return 1;
	};

	SOCKET server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (server == INVALID_SOCKET) {
    
    
		cout << "socket failed" << endl;
		return 1;
	}
	struct sockaddr_in addr;
	int addr_len = sizeof(sockaddr_in);
	int port = 9901;
	int errCode;
	//inet_addr(char *) ->ulong
	//inet_ntoa(in_addr in)->char
	//htons short
	//htonl long
	//ntohs short
	//
	addr.sin_family = AF_INET;
	addr.sin_port = htons(port);
	addr.sin_addr.s_addr = htonl(INADDR_ANY);
	errCode = bind(server, (SOCKADDR*)&addr, addr_len);
	if (errCode == SOCKET_ERROR) {
    
    
		cout << "bind failed" << endl;
		return 1;
	}

	if (listen(server, 3) == SOCKET_ERROR) {
    
    
		cout << "listen error" << endl;
		exit(2);
	}
	SOCKET sock = accept(server, NULL, NULL);
	WSAEVENT events[128];

	events[0] = WSACreateEvent();
	WSAEventSelect(sock, events[0], FD_READ);


	WSAOVERLAPPED overlap;

	DWORD len = 0;
	DWORD flag = 0;
	WSABUF buf;
	char buffer[2048];
	ZeroMemory(buffer, 2048);
	ZeroMemory(&overlap, sizeof overlap);
	buf.buf = buffer;
	buf.len = 2048;
	cout << "enter while" << endl;
	while (1) {
    
    
		if (WSARecv(sock, &buf, 1, &len, &flag, &overlap, NULL) == SOCKET_ERROR) {
    
    
			if (WSAGetLastError() != WSA_IO_PENDING) {
    
    
				cout << "fatal error" << endl;
			}
		}
		DWORD len2 = 0, flag2 = 0;
		int idx = WSAWaitForMultipleEvents(1, events, false, WSA_INFINITE, false);//这个会永久等待
		cout << "test" << endl;
		WSAGetOverlappedResult(sock, &overlap, &len2, false, &flag2);
		if (len2 == 0) {
    
    
			cout << "sock close" << endl;
			WSACloseEvent(events[idx - WSA_WAIT_EVENT_0]);
			break;
		}
		cout << buffer << endl;
		WSAResetEvent(events[idx - WSA_WAIT_EVENT_0]);
		flag = 0;
		ZeroMemory(&overlap, sizeof overlap);


		buffer[30] = '\0';


	}
	return 0;


}

猜你喜欢

转载自blog.csdn.net/weixin_39057744/article/details/120686727
今日推荐