@
franswish 不知道怎么搞定协议解析、切分消息(俗称解决粘包) = 我高中玩编程的水平。
那时候是真觉得这玩意儿也忒复杂了,怎么这么难搞。
现在嘛,不就是把 TcpConn 放到一个 Stream 里面,然后
string readNextChunk(int size) {
int nLeft = size;
string ret;
char buffer[8192];
while (nLeft > 0) {
int nRead = read(conn, buffer, min(nLeft, sizeof(buffer));
if (nRead == 0) {
break; // EOF
}
for (int i=0; i<nRead; ++i) {
ret.push_back(buffer[i]);
}
nLeft -= nRead;
}
return ret;
}
其实第一个认知更新,是在网络条件下,read(..., 8192) 不一定能给你真的读出来 8192 bytes ,你得用循环读。然后这部分写成一个通用函数(比如上面这个 readNextChunk) 就行了。用的时候
int nextMsgLength = fromLittleEndianUint32Bytes(readNextChunk(4));
string msg = readNextChunk(nextMsgLength)