比如目前接收的数据样例如下第一次接收:
<+++>
设备告警流水?第二次接收:
? = 21699
网络流水号 = 739641这里第一次和第二次的是“号”,但服务端发过来后,“号”是被拆分到两次发过来的客户端应该如何处理呢?
<+++>
设备告警流水?第二次接收:
? = 21699
网络流水号 = 739641这里第一次和第二次的是“号”,但服务端发过来后,“号”是被拆分到两次发过来的客户端应该如何处理呢?
如何判断读取完成,如果是长连接,可以在传输数据时规定一个开始、结束标志;如果不是,发送完成后,可以关闭SOCKET,然后有个READBUFFER == 0 (这个有点记不清了)可以判断传输己经结束。此时可以去MEMOSTREAM中读取并还原数据
bool MySocket::reciveMsg(int socket, std::string& s, bool *eof)
{
const int READ_SIZE = 4096; // Number of bytes to attempt to read at a time
char readBuf[READ_SIZE];
bool wouldBlock = false;
*eof = false;
while ( ! wouldBlock && ! *eof) {
int n = recv(socket, readBuf, READ_SIZE-1, 0);
if (n > 0) {
readBuf[n] = 0;
s.append(readBuf, n);
} else if (n == 0) {
*eof = true;
} else if (GetError()) {
wouldBlock = true;
} else {
return false; // Error
}
}
return true;
}
方法是通过设置头、尾标记确定包内容
以BYTE[]方式缓存接收到的数据,接收数据后查找头尾标记并取出包内容,
对于没有匹配的则再次压入缓存