5

UDP 不发回任何确认,但它会发送任何响应吗?

我已经设置了客户端服务器 UDP 程序。如果我让客户端向不存在的服务器发送数据,那么客户端会收到任何响应吗?

我的假设是;

客户端 --> 广播服务器地址 (ARP) 服务器 --> 使用其 MAC 地址回复客户端 (ARP) 客户端向服务器发送数据 (UDP)

在任何情况下,客户端都只会收到 ARP 响应。如果服务器存在与否,它不会得到任何 UDP 响应?

客户端正在使用 sendto 函数发送数据。我们可以在 sendto 调用后得到错误信息。

所以我的问题是当客户没有得到任何回应时如何获得这些信息。错误代码可以从 WSAGetLastError 中获取。

我试图将数据发送到不存在的主机并且 sendto 调用成功。根据文档,它应该失败并返回值 SOCKET_ERROR。

有什么想法吗??

4

6 回答 6

6

对于未到达目的地的 UDP 数据包,您永远不会收到错误或通知。

于 2008-12-02T11:03:48.667 回答
5

sendto通话没有失败。数据报被发送到目的地。

数据报的接收者或到达它的某个路由器可能会返回错误响应(主机不可达、端口不可达、超过 TTL)。但是,sendto当您的系统收到该呼叫时,该呼叫将成为历史记录。一些操作系统确实提供了一种发现这种情况的方法,通常是通过getsockopt调用。但是由于您无论如何都不能依赖得到错误回复,因为它取决于您无法控制的网络状况,因此通常最好忽略它。

位于 UDP 之上的合理协议使用回复。如果你没有得到回复,那么要么对方没有收到你的数据报,要么没有回复给你。

于 2011-09-15T06:53:42.627 回答
3

“UDP 是一种更简单的基于消息的无连接协议。在无连接协议中,没有努力建立专用的端到端连接。通信是通过在一个方向上传输信息来实现的,从源到目的地,无需检查查看如果目的地还在那里,或者它是否准备好接收信息。”

于 2008-12-02T11:06:52.907 回答
3

您向其发送数据包的机器可能会回复 ICMP UDP 端口不可达消息。

于 2009-06-12T00:05:24.887 回答
2

UDP 协议是在 IP 之上实现的。您将 UDP 数据包发送到由 IP 地址而非 MAC 地址标识的主机。

正如所指出的那样,UDP 本身不会发送回复,您必须自己添加代码才能做到这一点。然后您将不得不添加代码以期待回复,并在响应丢失时采取适当的措施(通常在计时器上重新发送,直到您确定另一端“死亡”),等等。

于 2008-12-02T11:06:44.637 回答
1

如果您在订购或验证时需要可靠的 UDP,以便 TCP/IP 让您查看 RUDP 或 Reliable UDP。有时您确实需要验证,但 UDP 和 TCP 的混合可能会阻碍 TCP 可靠性,从而导致瓶颈。

对于大多数大型 MMO 来说,UDP 和可靠性 UDP 是通信和可靠性的手段。RUDP 所做的只是添加一小部分 TCP/IP 来验证和排序某些消息,但不是全部。

一个常见的游戏开发网络库是内置的 Raknet。

RUDP http://www.javvin.com/protocolRUDP.html

使用 Raknet 和 Python 的 RUDP 示例 http://pyraknet.slowchop.com/

于 2009-06-11T23:52:36.243 回答