【问题标题】:Will socket send and receive call block till the complete message is transferred?套接字发送和接收调用是否会阻塞,直到传输完整的消息?
【发布时间】:2016-10-25 15:40:42
【问题描述】:

我们为 TCP/IP 连接套接字设置了以下选项。 SO_SNDBUF 和 SO_RCVBUF 选项设置的值是 10240。传递给 recv 和 send 调用的缓冲区大小是 1024。

recv 调用是否总是等待获得 1024 个字节后才返回?发送方发送大小为 1024 的数据包

发送调用是否会一直等待发送 1024 字节才返回?

在传输指定的字节之前,我是否应该设置任何其他选项来防止调用返回?

setsockopt(*p_sockwk, SOL_SOCKET,  SO_REUSEADDR, (void*)&reuseaddr,   (socklen_t)sizeof(socklen_t));
    setsockopt(*p_sockwk, SOL_SOCKET,  SO_SNDBUF,    (void*)&sendbufsize, (socklen_t)sizeof(socklen_t));
    setsockopt(*p_sockwk, SOL_SOCKET,  SO_RCVBUF,    (void*)&recvbufsize, (socklen_t)sizeof(socklen_t));
    setsockopt(*p_sockwk, IPPROTO_TCP, TCP_NODELAY,  (void*)&delay,       (socklen_t)sizeof(socklen_t));

【问题讨论】:

  • @ErikAlapää 非常有帮助。整本书?为什么是最新版本?早期的有什么问题?请。
  • @EJP 当提出问题的人甚至没有做出最小的尝试来理解 API 和协议背后的想法时,我会很生气。对于这本书,早期版本是一些有史以来最好的编程书籍,但使用最新版本可以为您提供最新的材料,例如ipv6 和线程。
  • @ErikAlapää 推荐整本书可能会减轻您的烦恼,但实际上并不能有效地回答这个问题。
  • @EJP 一个相当聪明的人应该能够在打开这本书的 10 分钟内找到关于 TCP 套接字 recv() 的答案。就我而言,辩论结束。
  • @ErikAlapää 一个相当聪明的人应该能够在不打开甚至根本没有书的情况下找到答案。没有什么反对这本书的,但你在这里的cmets是徒劳的。

标签: linux sockets


【解决方案1】:

套接字发送和接收调用是否会阻塞直到完整的消息被传输?

你使用的是 TCP,而 TCP 中没有消息之类的东西。

我们为 TCP/IP 连接套接字设置了以下选项。 SO_SNDBUF 和 SO_RCVBUF 选项设置的值是 10240。传递给 recv 和 send 调用的缓冲区大小是 1024。

recv 调用会一直等待获得 1024 字节后返回吗?

没有。这是记录在案的。

发送方发送大小为 1024 的数据包

无关紧要。

发送调用是否会一直等待发送 1024 字节才返回?

在阻塞模式下,是的,除非有中断。

在传输指定的字节之前,我是否应该设置任何其他选项来防止调用返回?

没有。

setsockopt(*p_sockwk, SOL_SOCKET,  SO_REUSEADDR, (void*)&reuseaddr,   (socklen_t)sizeof(socklen_t));

与发送或接收无关。

setsockopt(*p_sockwk, SOL_SOCKET,  SO_SNDBUF,    (void*)&sendbufsize, (socklen_t)sizeof(socklen_t));
setsockopt(*p_sockwk, SOL_SOCKET,  SO_RCVBUF,    (void*)&recvbufsize, (socklen_t)sizeof(socklen_t));

如果您愿意,可以将它们设置为大于默认值,但它们不会影响您询问的行为。

setsockopt(*p_sockwk, IPPROTO_TCP, TCP_NODELAY,  (void*)&delay,       (socklen_t)sizeof(socklen_t));

这可能有帮助,也可能没有帮助,但不能保证。

如果你想在读取时填充缓冲区,你必须循环。

【讨论】:

    猜你喜欢
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多