【发布时间】:2015-02-16 14:07:57
【问题描述】:
我对 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];
让我感到困惑的是,在一个数据包进入“rec”变量之后,它表示读取了多少字节是一,而不是二,如果我将 lengthBuffer 设为三个字符而不是两个,它读取三个字节,但是如果是四,它也读三(只有奇数)。我不知道我是否在这里犯了一些非常愚蠢的错误,或者从根本上误解了语言或 API 的某些部分。我知道 recv 不保证会读取任意数量的字节,但如果它只是两个,它不应该多次读取。
【问题讨论】:
-
您是要查找正在发送和接收的字节数,还是要查找要发送的可用字节数?也许帮助或不基于问题 - stackoverflow.com/questions/12984816/…
-
可能只是重复,这取决于有多少其他类似的问题。
-
阻塞模式下 TCP 套接字的“正确字节数”是一个或多个。请参阅 man 页面。你的期望是没有根据的。