C# 两次发送相同的mesage是针对UDP劣势的好政策吗?
我有一个叫做服务器、客户端和客户端2的c#可执行文件,它们在同一个地址上互相传递消息。我正在根据MSG的端口号来区分它们 常规运行-1 服务器启动 客户加入,离开 第二轮 服务器启动 客户2加入,离开 第三轮 服务器启动 客户端加入 client2加入(问题来了),有时它从服务器获得回复,有时它只是挂起,而服务器的回复无法到达 我正在使用UDPClient阻塞消息传输例程 当前解决方案:我从服务器发送了两次相同的消息(希望至少第二次),因为这非常重要,我不再丢失此消息。这样一个临时黑客可能会有什么样的失败?C# 两次发送相同的mesage是针对UDP劣势的好政策吗?,c#,udpclient,C#,Udpclient,我有一个叫做服务器、客户端和客户端2的c#可执行文件,它们在同一个地址上互相传递消息。我正在根据MSG的端口号来区分它们 常规运行-1 服务器启动 客户加入,离开 第二轮 服务器启动 客户2加入,离开 第三轮 服务器启动 客户端加入 client2加入(问题来了),有时它从服务器获得回复,有时它只是挂起,而服务器的回复无法到达 我正在使用UDPClient阻塞消息传输例程 当前解决方案:我从服务器发送了两次相同的消息(希望至少第二次),因为这非常重要,我不再丢失此消息。这样一个临时黑客可能会有什
也请告诉我,如果我的q?不完整,我将提供更多详细信息。UDP本身不可靠。您可以编写自己的代码,使其可靠地满足您的需要,但这取决于您自己。如果您想要一个可靠的流,请使用TCP 两次发送UDP数据包可能会减少数据包丢失问题,但是您无法保证。我建议您实现一些确认系统,当客户端成功地处理了传入的数据包时,客户端将数据包发送回服务器。服务器反复发送原始数据包,直到看到确认为止。(您应该对此仍有一些限制,否则它将永远尝试)
UDP很有用的一种情况是,您不介意偶尔丢失数据包,但需要UDP可以带来的减少延迟(因为没有内置的重新传输)。例如,服务器通过UDP发送游戏数据的游戏状态信息。如果客户端没有接收到数据包,那么当下一个数据包在几毫秒内到达时,它就会赶上。UDP本身是不可靠的。您可以编写自己的代码,使其可靠地满足您的需要,但这取决于您自己。如果您想要一个可靠的流,请使用TCP 两次发送UDP数据包可能会减少数据包丢失问题,但是您无法保证。我建议您实现一些确认系统,当客户端成功地处理了传入的数据包时,客户端将数据包发送回服务器。服务器反复发送原始数据包,直到看到确认为止。(您应该对此仍有一些限制,否则它将永远尝试) UDP很有用的一种情况是,您不介意偶尔丢失数据包,但需要UDP可以带来的减少延迟(因为没有内置的重新传输)。例如,服务器通过UDP发送游戏数据的游戏状态信息。如果一个客户端没有收到数据包,那么当下一个数据包在几毫秒内到达时,它就会赶上。简而言之,UDP是不可靠的。UDP的定义就是,无法判断数据包是否会到达目的地,更不用说确保了 如果这些消息和你引导的一样重要,我建议改用TCP。这样,传输错误和故障将自动为您处理,您可以放心数据包将到达其目的地 至于黑客的潜在失败,你必须处理两份邮件都到达的情况,并且不考虑两份邮件都没有到达的情况。对我来说,在这种情况下,尝试重新发明轮子(发送确认消息、超时重试、处理重复收据)是不值得的。只需使用TCP。简而言之,UDP不可靠。UDP的定义就是,无法判断数据包是否会到达目的地,更不用说确保了 如果这些消息和你引导的一样重要,我建议改用TCP。这样,传输错误和故障将自动为您处理,您可以放心数据包将到达其目的地
至于黑客的潜在失败,你必须处理两份邮件都到达的情况,并且不考虑两份邮件都没有到达的情况。对我来说,在这种情况下,尝试重新发明轮子(发送确认消息、超时重试、处理重复收据)是不值得的。只要使用TCP。如果可靠性胜过一切,就使用TCP。但如果您需要低延迟和基于数据包的通信,那么您可以坚持使用UDP,但可以实现更好的重传过程 例如,在SIP(VOIP协议)中,通常建议执行以下操作:
如果可靠性胜过一切,请使用TCP。但如果您需要低延迟和基于数据包的通信,那么您可以坚持使用UDP,但可以实现更好的重传过程 例如,在SIP(VOIP协议)中,通常建议执行以下操作:
UDP的可靠性与网络堆栈中较低级别的协议相同;IP基本上是一种尽力而为的服务。这意味着您的数据不会被故意丢失或损坏,但不会做出任何保证。好消息是,在通常情况下,通道的固有可靠性非常好,因此UDP也可以。假设每个UDP数据报到达接收方的概率为p,且未受损。在这种情况下,N个数据包中的至少一个未损坏地发送给接收机的概率为1-(1-p)^N.F