套接字是否会发送和接收呼叫阻塞,直到完整的消息被转移?

时间:2016-06-23 10:42:40

标签: linux sockets

我们为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));

1 个答案:

答案 0 :(得分:0)

  

套接字是否会发送和接收呼叫阻塞,直到传输完整的消息?

您正在使用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));

这可能会或可能没有帮助,但没有任何保证。

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