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 从不同来源解复用udp流_Sockets_Udp - Fatal编程技术网

Sockets 从不同来源解复用udp流

Sockets 从不同来源解复用udp流,sockets,udp,Sockets,Udp,我的服务器使用单个udp套接字接收来自不同ip地址的udp流。所有发件人发送到同一端口。 当recv在服务器上返回一个数据块时,该数据块可能包含来自不同来源的字节吗? 假设没有,是否有可靠的方法来确定哪个发送方发送了整个数据块?在UDP中,接收到的每个数据块都将与发送方之前传递给“发送”或“发送到”的数据块完全相同。与TCP不同,UDP维护消息边界 通过调用“recvfrom”而不是“recv”,您可以找到发送接收数据包的IP地址和端口。这些值将写入您提供指针的“struct inaddr_in

我的服务器使用单个udp套接字接收来自不同ip地址的udp流。所有发件人发送到同一端口。 当recv在服务器上返回一个数据块时,该数据块可能包含来自不同来源的字节吗?
假设没有,是否有可靠的方法来确定哪个发送方发送了整个数据块?

在UDP中,接收到的每个数据块都将与发送方之前传递给“发送”或“发送到”的数据块完全相同。与TCP不同,UDP维护消息边界


通过调用“recvfrom”而不是“recv”,您可以找到发送接收数据包的IP地址和端口。这些值将写入您提供指针的“struct inaddr_in”中。

嗨,Jeremy,Alex F回答了我关于解复用的问题。不过,您的评论很有趣。如果消息大于MTU或接收器的内部套接字缓冲区,会发生什么情况?那么recvfrom读取的数据肯定不是一条完整的消息吗?您是说recvfrom读取的数据永远不会包含来自多个数据包的数据,但一条消息可能被拆分为多个recvfrom调用?你能指出这方面的文档吗?我将作为一个单独的问题来问这个问题。如果发送的数据大于MTU,则发送方将透明地对数据包进行碎片化,如果所有碎片都在传递给你之前由接收方透明地重新组装到接收方机器上。如果任何一个片段没有成功,它们都将被自动删除,用于UDP,传递给send的数据将与recv稍后返回的数据相匹配。代码只能看到1和4;tcp堆栈将透明地处理您列出的其他数据,即如果校验和不匹配,tcp堆栈将简单地丢弃udp数据包,而不是将损坏的数据交给您