-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEventSelectServer.cpp
More file actions
74 lines (64 loc) · 1.67 KB
/
EventSelectServer.cpp
File metadata and controls
74 lines (64 loc) · 1.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
///////////////////////////////////////////
// EventSelectServer.cpp文件
#include "../common/initsock.h"
#include <stdio.h>
#include <windows.h>
#include "EventSelectServer.h"
// 初始化Winsock库
CInitSock theSock;
int main()
{
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, 200);
// 创建事件对象,并关联到监听的套节字
WSAEVENT event = ::WSACreateEvent();
::WSAEventSelect(sListen, event, FD_ACCEPT|FD_CLOSE);
::InitializeCriticalSection(&g_cs);
// 处理客户连接请求,打印状态信息
while(TRUE)
{
int nRet = ::WaitForSingleObject(event, 5*1000);
if(nRet == WAIT_FAILED)
{
printf(" Failed WaitForSingleObject() \n");
break;
}
else if(nRet == WSA_WAIT_TIMEOUT) // 定时显式状态信息
{
printf(" \n");
printf(" TatolConnections: %d \n", g_nTatolConnections);
printf(" CurrentConnections: %d \n", g_nCurrentConnections);
continue;
}
else // 有新的连接未决
{
::ResetEvent(event);
// 循环处理所有未决的连接请求
while(TRUE)
{
sockaddr_in si;
int nLen = sizeof(si);
SOCKET sNew = ::accept(sListen, (sockaddr*)&si, &nLen);
if(sNew == SOCKET_ERROR)
break;
PSOCKET_OBJ pSocket = GetSocketObj(sNew);
pSocket->addrRemote = si;
::WSAEventSelect(pSocket->s, pSocket->event, FD_READ|FD_CLOSE|FD_WRITE);
AssignToFreeThread(pSocket);
}
}
}
::DeleteCriticalSection(&g_cs);
return 0;
}