采用重叠I/O模式之事件通知中遇到的问题?
我采用的是重叠I/O模式之事件通知编程;现在有这样一个问题:当客户端传递字符串给服务器的时候,函数WSAGetOverlappedResult()是否一次获得到字符串长度值,也就是说该函数的参数lpcbTransfer是否一次性获得字符串的长度值;函数WSARecv()是否一次性获得字符串,如果WSARecv没有一次获得字符串,那么如何处理才能不会让服务器端多次接收完客户端发送的字符串;
例如客户端发送字符串:abcdefg;函数WSAGetOverlappedResult()中的参数lpcbTransfer的值是否是7(或者分两次:一次是5,一次是2)?,函数WSARecv()可能一次接收到abcdefg(或者分两次接收,一次接收到abcde,再一次接收到fg?
[解决办法]
先用缓存接受字符串,判断是否接受完整。不完整就重复接受,当然要设偏移地址。
例:
int nReadCount = 0;
int nOffset = m_nRecvBytes;
int nBuffSize = (int)sizeof(m_dataBuffer) - nOffset;
char *szDataBuff = m_dataBuffer + nOffset;
nReadCount = recv(m_hSocket, szDataBuff, nBuffSize, 0);