我是C ++的新手,但是我试图学习TCP套接字编码的一些基础知识。无论如何,我已经能够发送和接收消息,但是我想给数据包加上数据包的长度前缀(就像我在过去制作的C#应用程序中所做的那样),因此当我的窗口获取FD_READ命令时,以下代码仅读取数据包的前两个字节以用作短整数。
char lengthBuffer[2];
int rec = recv(sck, lengthBuffer, sizeof(lengthBuffer), 0);
short unsigned int toRec = lengthBuffer[1] << 8 | lengthBuffer[0];
Run Code Online (Sandbox Code Playgroud)
令我感到困惑的是,在数据包进入“ rec”变量后,该变量表示读取了多少个字节,是一个字节,而不是两个字节;如果我将lengthBuffer设置为三个字符而不是两个字符,它将读取三个字节,但是如果是四个,它还会读取三个(仅奇数)。我无法确定我是在犯一些真正的愚蠢错误,还是从根本上误解了语言或API的某些部分。我知道recv不能保证将读取任何数量的字节,但是如果只有两个字节,则不应进行多次读取。
由于您无法假设会有多少数据可用,因此您需要不断从套接字读取数据,直到获得所需的数据量为止。这样的事情应该起作用:
ssize_t rec = 0;
do {
int result = recv(sck, &lengthBuffer[rec], sizeof(lengthBuffer) - rec, 0);
if (result == -1) {
// Handle error ...
break;
}
else if (result == 0) {
// Handle disconnect ...
break;
}
else {
rec += result;
}
}
while (rec < sizeof(lengthBuffer));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3751 次 |
| 最近记录: |