Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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
C# 两次发送相同的mesage是针对UDP劣势的好政策吗?_C#_Udpclient - Fatal编程技术网

C# 两次发送相同的mesage是针对UDP劣势的好政策吗?

C# 两次发送相同的mesage是针对UDP劣势的好政策吗?,c#,udpclient,C#,Udpclient,我有一个叫做服务器、客户端和客户端2的c#可执行文件,它们在同一个地址上互相传递消息。我正在根据MSG的端口号来区分它们 常规运行-1 服务器启动 客户加入,离开 第二轮 服务器启动 客户2加入,离开 第三轮 服务器启动 客户端加入 client2加入(问题来了),有时它从服务器获得回复,有时它只是挂起,而服务器的回复无法到达 我正在使用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协议)中,通常建议执行以下操作:

  • 设置一个定时器,使其在500毫秒(T1)时点火
  • 发送请求并启动计时器
  • 如果T1过期而没有得到响应,则重新传输请求并加倍T1
  • 执行#3直到得到响应或T1达到32秒

  • 如果可靠性胜过一切,请使用TCP。但如果您需要低延迟和基于数据包的通信,那么您可以坚持使用UDP,但可以实现更好的重传过程

    例如,在SIP(VOIP协议)中,通常建议执行以下操作:

  • 设置一个定时器,使其在500毫秒(T1)时点火
  • 发送请求并启动计时器
  • 如果T1过期而没有得到响应,则重新传输请求并加倍T1
  • 执行#3直到得到响应或T1达到32秒

  • UDP的可靠性与网络堆栈中较低级别的协议相同;IP基本上是一种尽力而为的服务。这意味着您的数据不会被故意丢失或损坏,但不会做出任何保证。好消息是,在通常情况下,通道的固有可靠性非常好,因此UDP也可以。假设每个UDP数据报到达接收方的概率为p,且未受损。在这种情况下,N个数据包中的至少一个未损坏地发送给接收机的概率为1-(1-p)^N.F