//#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;
}
windows重叠IO和event模型
猜你喜欢
转载自blog.csdn.net/weixin_39057744/article/details/120686727
今日推荐
周排行