UDP不会发回任何确认,但它会发送任何响应吗?
我已经设置了客户端服务器UDP程序。如果我让客户端将数据发送到不存在的服务器,那么客户端会收到任何响应吗?
我的假设是;
客户端 - >广播服务器地址(ARP) 服务器 - >用其mac地址(ARP)回复客户端 客户端将数据发送到服务器(UDP)
在任何情况下,客户端都只会收到ARP响应。如果服务器存在与否,它将不会获得任何UDP响应?
客户端使用sendto函数发送数据。发送到电话后我们可以收到错误信息。
所以我的问题是当客户端没有得到任何回复时这些信息是如何可用的。 错误代码可以从WSAGetLastError获得。
我尝试将数据发送到不存在的主机,sendto调用成功。根据文档,它应该失败,返回值为SOCKET_ERROR。
有什么想法吗?
答案 0 :(得分:6)
您永远不会收到错误,也不会收到没有到达目的地的UDP数据包。
答案 1 :(得分:5)
sendto
来电没有失败。数据报已发送到目的地。
数据报的收件人或路上的某个路由器可能会返回错误响应(主机无法访问,端口无法访问,超出TTL)。但是sendto
电话会在您的系统收到时成为历史记录。某些操作系统确实提供了一种方法来查找发生的情况,通常是通过getsockopt
调用。但是,既然你不能依赖于获得错误回复,因为它取决于你无法控制的网络条件,通常最好忽略它。
在UDP之上分层的敏感协议使用回复。如果你没有得到回复,那么另一方没有得到你的数据报,或者回复没有回复给你。
答案 2 :(得分:3)
“UDP是一种更简单的基于消息的无连接协议。在无连接协议中,没有努力建立专用的端到端连接。通过在一个方向上传输信息来实现通信,从源到目的地,而不检查目的地是否仍在那里,或者是否准备好接收信息。“
答案 3 :(得分:3)
您要向其发送数据包的计算机可能会回复ICMP UDP端口不可达消息。
答案 4 :(得分:2)
UDP协议在IP之上实现。您将UDP数据包发送到由IP地址标识的主机,而不是MAC地址。
正如所指出的,UDP本身不会发送回复,您必须自己添加代码来执行此操作。然后你必须添加代码以期待回复,并在响应丢失时采取适当的操作(通常在计时器上重发,直到你决定另一端“死”),等等。
答案 5 :(得分:1)
如果您在订购或验证时需要可靠的UDP,那么TCP / IP将让您查看RUDP或Reliable UDP。有时您确实需要验证,但TCP和TCP的混合可以阻止TCP可靠性造成瓶颈。
对于大多数大型MMO来说,UDP和Reliablity UDP是通信和可靠性的手段。所有RUDP都会添加一小部分TCP / IP来验证和订购某些消息,但不是全部。
一个常见的游戏开发网络库是Raknet,内置了它。
RUDP http://www.javvin.com/protocolRUDP.html
使用Raknet和Python的RUDP示例 http://pyraknet.slowchop.com/