受信线程
void ReceiveThread()
{
//**************************************************
// 创建Event对象
//**************************************************
// 处理结果
BOOL bResult = TRUE;
// Event对象数
DWORD eventTotal = 0;
// Event对象数组
WSAEVENT eventArray[WSA_MAXIMUM_WAIT_EVENTS];
// socket数组
SOCKET socketArray[WSA_MAXIMUM_WAIT_EVENTS];
// 把监听socket放入socket数组的首位置
socketArray[eventTotal] = m_ListenSocket;
// 创建监听socket用的Event对象、放入Event对象数组的首位置
if ((eventArray[eventTotal] = ::WSACreateEvent()) == WSA_INVALID_EVENT) {
// 失败
bResult = FALSE;
}
if (bResult) {
// 监听用event对象和监听socket绑定:绑定接受,关闭事件
if (SOCKET_ERROR == ::WSAEventSelect(m_ListenSocket,
eventArray[eventTotal],
FD_ACCEPT|FD_CLOSE) ) {
// 失败
bResult = FALSE;
} else {
// Event对象数+1
eventTotal++;
}
}
//**************************************************
// 监听socket绑定
//**************************************************
if (bResult) {
// 绑定
sockaddr_in ser_addr;
ser_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
ser_addr.sin_family=AF_INET;
ser_addr.sin_port=htons(50000);
if (SOCKET_ERROR == bind(m_ListenSocket, (LPSOCKADDR)&ser_addr, sizeof(ser_addr))) {
// 失败
bResult = FALSE;
}
}
if (bResult) {
// 监听开始
if (SOCKET_ERROR == listen(m_ListenSocket, 5)) {
// 失败
bResult = FALSE;
}
}
//**************************************************
// 等待和处理网络事件
//**************************************************
if (bResult) {
DWORD signaledIndex = 0;
SOCKET signaledSocket = INVALID_SOCKET;
WSAEVENT signaledEvent = WSA_INVALID_EVENT;
//**************************************************
// 等待网络事件
//**************************************************
while(TRUE) {
//等待event对象被激发
signaledIndex = ::WSAWaitForMultipleEvents(eventTotal,
eventArray,
FALSE,
INFINITE,
FALSE);
if (WSA_WAIT_FAILED == signaledIndex) {
// 失败
break;
}
// 根据被激发的event对象的索引值,取得对应的socket以及event对象
signaledSocket = socketArray[signaledIndex - WSA_WAIT_EVENT_0];
signaledEvent = eventArray[signaledIndex - WSA_WAIT_EVENT_0];
// 枚举网络中、在被激活的socket上、发生的网络事件
WSANETWORKEVENTS netEvents;
if (SOCKET_ERROR == ::WSAEnumNetworkEvents(signaledSocket, signaledEvent, &netEvents)){
// 失败
break;
}
//******************************************************
// FD_ACCEPT事件:网络中有客户端的连接请求
//******************************************************
if (netEvents.lNetworkEvents & FD_ACCEPT) {
// 网络错误
if (netEvents.iErrorCode[FD_ACCEPT_BIT] != 0) {
// 失败
break;
}
sockaddr_in cli_addr;
int addrlen = sizeof(cli_addr);
// 连接
if ((m_ClientSocket1 = accept(signaledSocket, (sockaddr *)&cli_addr, &addrlen))
== INVALID_SOCKET) {
// 失败
break;
}
// accept函数执行后,也会激活监听用socket的event对象,重置监听用socket的event对象
WSAResetEvent(signaledEvent);
// 判断是否超过最大可管理的socket数64
if (eventTotal > WSA_MAXIMUM_WAIT_EVENTS) {
// 如果超过64个,关闭该连接,不再接收连接要求
closesocket(m_ClientSocket1);
break;
}
// 把通信用socket放入socket数组
socketArray[eventTotal] = m_ClientSocket1;
// 为该通信用socket,创建event对象,并放入event对象管理数组
if ((eventArray[eventTotal] = ::WSACreateEvent()) == WSA_INVALID_EVENT) {
// 失败
// 关闭该连接
closesocket(socketArray[eventTotal]);
break;
}
// event对象邦定:绑定读取,关闭事件
if (SOCKET_ERROR == ::WSAEventSelect(socketArray[eventTotal],
eventArray[eventTotal],
FD_READ|FD_CLOSE) ) {
// 失败
// 关闭连接和event对象
closesocket(socketArray[eventTotal]);
WSACloseEvent(eventArray[eventTotal]);
break;
}
// Event对象数+1
eventTotal++;
}
//**************************************************
// FD_READ事件:网络中有可读入数据
//**************************************************
if (netEvents.lNetworkEvents & FD_READ) {
// 网络错误
if (netEvents.iErrorCode[FD_READ_BIT] != 0) {
// 失败
break;
}
char recved[50];
ZeroMemory(recved, 50);
int recvedLen = 50;
char info[50];
ZeroMemory(info, 50);
// 接收数据
recvedLen = recv(signaledSocket, recved, recvedLen, 0);
if (recvedLen == SOCKET_ERROR || recvedLen == 0) {
// 失败
break;
}
}
//**************************************************
// FD_CLOSE事件:断开连接
//**************************************************
if (netEvents.lNetworkEvents & FD_CLOSE) {
// 网络错误
if (netEvents.iErrorCode[FD_CLOSE_BIT] != 0) {
// 失败
break;
}
// 关闭连接
closesocket(signaledSocket);
WSACloseEvent(signaledEvent);
// 把socket和event对象从管理数组中删除
for (DWORD i = signaledIndex - WSA_WAIT_EVENT_0; i < eventTotal - 1; i++) {
socketArray[i] = socketArray[i + 1];
eventArray[i] = eventArray[i + 1];
}
// Event对象数-1
eventTotal--;
}
}
}
}
|