【发布时间】:2021-12-14 05:14:30
【问题描述】:
在使用recv的时候,我一直都是这么干的:
int len = 1000;
int n = 0;
char buf[1000];
while(n < len) {
n += recv(socket, buf + n, len - n, 0);
}
我的逻辑是,如果 recv 没有收到 len 字节的完整数据,我应该只收到其余字节 (len - n) 并且不应该覆盖已经收到的数据(所以我抵消了缓冲区的初学者到已接收内容的末尾)。每当我使用它时,这似乎都可以正常工作。
但是,我看到的大多数(如果不是全部)recv 示例只是执行以下操作:
int len = 1000;
int n = 0;
char buf[1000];
while(n < len) {
n += recv(socket, buf, len, 0);
}
如果多次调用recv,这不会让您容易覆盖缓冲区的开头吗?
【问题讨论】:
-
"recv 的大多数(如果不是全部)示例'。除非这些示例只是试图在不使用数据的情况下使用数据,或者您将其脱离上下文,否则它看起来确实正如你所说的那样不正确。
-
您的“偏移量”出现是因为您试图将来自多次调用
recv()的数据存储到数组中,即您并不总是读取数组的第一个元素。您引用的示例都读取到缓冲区的第一个字符(因此第二次和后续调用recv()的数据会覆盖先前收到的数组元素)。这两种方法都是有效的,但在不同的情况下(即没有一些神奇的“总是这样做”的方法)。在所有情况下,都必须确保您的代码不会超出数组的末尾。
标签: c++ c pointers networking recv