我们为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));
答案 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));
这可能会或可能没有帮助,但没有任何保证。
如果你想在阅读时填充缓冲区,你必须循环。