【问题标题】:How send function works发送功能如何工作
【发布时间】:2012-09-06 21:34:46
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c sockets network-programming send


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:
      • 函数send 将尝试发送您告诉它的数量。如果缓冲区足够大,没有什么特别的事情发生。如果不是,则未定义会发生什么:它可能会发送垃圾,可能会崩溃或可能会做任何其他事情

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2020-11-10
          • 2022-01-15
          • 2016-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-26
          • 2020-11-16
          • 1970-01-01
          相关资源
          最近更新 更多