#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;
}
网络编程-3 异步通知I/O
猜你喜欢
转载自blog.csdn.net/weixin_37703001/article/details/88176863
今日推荐
周排行