?? eventselectserver.cpp
字號:
///////////////////////////////////////////
// EventSelectServer.cpp文件
#include "../common/initsock.h"
#include <stdio.h>
#include <windows.h>
#include "EventSelectServer.h"
// 初始化Winsock庫
CInitSock theSock;
int main()
{
USHORT nPort = 4567; // 此服務器監(jiān)聽的端口號
// 創(chuàng)建監(jiān)聽套節(jié)字
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);
// 創(chuàng)建事件對象,并關聯(lián)到監(jiān)聽的套節(jié)字
WSAEVENT event = ::WSACreateEvent();
::WSAEventSelect(sListen, event, FD_ACCEPT|FD_CLOSE);
::InitializeCriticalSection(&g_cs);
// 處理客戶連接請求,打印狀態(tài)信息
while(TRUE)
{
int nRet = ::WaitForSingleObject(event, 5*1000);
if(nRet == WAIT_FAILED)
{
printf(" Failed WaitForSingleObject() \n");
break;
}
else if(nRet == WSA_WAIT_TIMEOUT) // 定時顯式狀態(tài)信息
{
printf(" \n");
printf(" TatolConnections: %d \n", g_nTatolConnections);
printf(" CurrentConnections: %d \n", g_nCurrentConnections);
continue;
}
else // 有新的連接未決
{
::ResetEvent(event);
// 循環(huán)處理所有未決的連接請求
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;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -