}
ReceLen+=CurReceLen;
}
}
在异步方式下,采用非阻塞方式实现比较方便,在非阻塞方式下可使用 WSAAsyncSelect 模型和
WSAEventSelect 模型: WSAAsyncSelect 模型基于消息, WSAEventSelect 模型基于事件,下面的示
例代码设置了 Socket 进行读写和关闭操作的消息:
status = WSAAsyncSelect(TempSocket, hWnd, WSA_READ, FD_READ | FD_CLOSE |
FD_WRITE);
if (status == SOCKET_ERROR)
{
WriteLogFile(”Set stream socket module fail!!!IP(%s),Port(%d) and error(%
d)",GetIPAddr((PeerMap+node)-〉IPAddr),(PeerMap+node)—>PeerPortNo,WSAGetLastError());
CloseSocket(TempSocket,__LINE__,__FILE__);
return FALSE;
}
无论使用阻塞方式或非阻塞方式编程,需要重点考虑的一个问题:粘包现象,即应用发送两个或以
上的数据包,在 Socket 通讯层将数据包合并成一个发送出去,因此接收端收到数据包以后需要对数据
包根据应用定义的长度进行拆分,否则导致应用层丢包.
评论0