1

我正在使用ssize_t send(int sockfd, const void *buf, size_t len, int flags);文件socket.h。我对此有些怀疑。

疑问1:如果假设我传递给的字符串send是长度10,而我在第三个参数中指定的长度是15。那么什么send只会发送 10 个字符或者它将发送 15 个字符(它通过读取最后 5 个字符的未分配内存来获得)。
在相反的情况下会发生什么意味着如果第二个参数的长度大于第三个参数。

疑问2:我假设第二个参数的长度等于第三个参数。现在,如果第二个参数是 - "abc\0def\0qw"。它的长度是 11。将send发送整个字符串或\0有任何效果。我认为它会发送整个字符串。发送的真正效果如何。

如果有人知道任何好的来源sendrecv请深入讨论这些功能,请分享。

4

3 回答 3

2
  • 该函数send将尝试发送与您告诉它的一样多的内容。如果缓冲区足够大,没有什么特别的事情发生。如果不是,则未定义会发生什么:它可能会发送垃圾,可能会崩溃,或者它可能会做任何其他事情

  • 该函数send不关心缓冲区内容 - 它只关心要写入的指定字节数

于 2012-09-13T18:16:56.167 回答
1

send对以 NUL 结尾的字符串一无所知(参数类型中有一条线索 - 它需要 avoid*而不是 a char*)。

它只是从你给它的地址发送你给它的字节数。如果这意味着读取未分配的内存,那么它就会这样做,可能会在进程中崩溃。

于 2012-09-13T18:16:45.223 回答
1

send函数对“字符串”一无所知。如果您给它一个指针,并告诉它在该指针之后发送接下来的 15 个字节,那么这正是它将尝试做的事情。(如果你给它一个不合适的值,你很可能会遇到Seg-Faultlen或类似的问题)。

没有理由相信它会因为找到一个具有 value 的字节而停止0x00。毕竟,许多网络协议0x00到处都是。send每次碰巧找到该值时,您都不能停下来。

于 2012-09-13T18:18:24.393 回答