📄 wsaeventselect.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 + -