Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets TCP阻塞套接字-在不同数据包中接收少量字节的可能性_Sockets_Tcp_Packet - Fatal编程技术网

Sockets TCP阻塞套接字-在不同数据包中接收少量字节的可能性

Sockets TCP阻塞套接字-在不同数据包中接收少量字节的可能性,sockets,tcp,packet,Sockets,Tcp,Packet,如果服务器发送4个字节 send(sock, buffer1, 4, 0); 客户端只等待4个字节 recv(sock, buffer2, 4, 0); 是否有可能将少于4个字节写入缓冲区2? 之前未进行任何其他send或recv 如果没有可能,那么send可以执行的最大缓冲区大小是多少,这样recv就可以在一次调用中获得相同的缓冲区大小。是的,存在这种可能性。事实上,recv将接收的字节数作为返回值提供给您。是的,存在这种可能性。事实上,recv将接收的字节数作为返回值提供给您。来自rec

如果服务器发送4个字节

send(sock, buffer1, 4, 0);
客户端只等待4个字节

recv(sock, buffer2, 4, 0);
是否有可能将少于4个字节写入
缓冲区2
? 之前未进行任何其他
send
recv


如果没有可能,那么
send
可以执行的最大缓冲区大小是多少,这样
recv
就可以在一次调用中获得相同的缓冲区大小。

是的,存在这种可能性。事实上,recv将接收的字节数作为返回值提供给您。

是的,存在这种可能性。事实上,recv将接收的字节数作为返回值提供给您。

来自
recv
的手册页:

这些调用返回接收的字节数,如果发生错误,则返回-1

对于TCP套接字,返回值0表示对等方已关闭其连接的一半。”

因此,始终允许
recv
返回所有已发送的字节,少于已发送的字节,或不返回已发送的字节。您不能仅仅因为碰巧知道
send
在连接的另一端正在做什么而假设任何事情


无法保证您始终可以获得完整的消息。

recv
的手册页:

这些调用返回接收的字节数,如果发生错误,则返回-1

对于TCP套接字,返回值0表示对等方已关闭其连接的一半。”

因此,始终允许
recv
返回所有已发送的字节,少于已发送的字节,或不返回已发送的字节。您不能仅仅因为碰巧知道
send
在连接的另一端正在做什么而假设任何事情


没有办法保证你总是能得到完整的信息。

除了你自己定义的以外,没有“信息”这类东西

重复:没有消息这样的东西

TCP不发送消息,它发送八位字节流


您需要在循环中发送,以防有未确认的数据积压,并且
send
没有使用您传入的整个缓冲区。您需要在循环中recv,以防发送堆栈以意外的方式将其分块。您需要对消息进行定界(例如,通过预先设置网络端点长度),以便能够正确地恢复它们。

除了您自己定界的内容外,没有“消息”这类东西

重复:没有消息这样的东西

TCP不发送消息,它发送八位字节流


您需要在循环中发送,以防有未确认的数据积压,并且
send
没有使用您传入的整个缓冲区。您需要在循环中recv,以防发送堆栈以意外的方式将其分块。您需要对邮件进行定界(例如,通过预先设置网络尾端长度),以便正确恢复邮件。

您的实际问题是“如何知道何时收到完整邮件”@CodeCaster,不。我想知道我是否总能收到完整的消息。您应该始终编写套接字代码,就好像一次只能收到1个字节一样。换句话说,始终检查recv的返回值,并根据需要处理部分填充的缓冲区。您的实际问题是“我如何知道何时收到完整消息”@CodeCaster,不。我想知道我是否总能收到完整的消息。您应该始终编写套接字代码,就好像一次只能收到1个字节一样。换句话说,始终检查recv的返回值,并根据需要处理部分填充的缓冲区。+1大约每天一次此“TCP无法正确处理我的多字节消息”会被发布。“strlen为我的缓冲区中的数据返回错误的结果”和“printf(%s…)segfults在尝试打印我的缓冲区时”。大约每天+1次此“TCP无法正确处理我的多字节消息”会被发布。以及“strlen为我的缓冲区中的数据返回错误的结果”和“printf(%s…)segfults在尝试打印我的缓冲区时”。只有在套接字处于非阻塞模式或发生错误时,才允许不返回发送的任何字节。否则它必须阻塞,直到至少有一个字节到达,或者出现EOS。当然可以,但您的答案并不清楚。还有一种普遍的看法是,当对等方停止发送时,recv()返回零,例如,在消息末尾:您的答案也可以被读取以支持这一点。只有在套接字处于非阻塞模式或发生错误时,才允许它不返回任何发送的字节。否则它必须阻塞,直到至少有一个字节到达,或者出现EOS。当然可以,但您的答案并不清楚。还有一种普遍的看法是,当对等方停止发送时,recv()返回零,例如在消息末尾:您的答案也可以被读取以支持这一点。