UDP发送和接收插座行为(Udp Send and Receive socket behavior)

2019-10-21 11:20发布

我写一个程序,它会首先验证到服务器,然后通过UDP发送和接收消息。 而发送和接收消息,我还需要保持与服务器的连接,所以我需要周期性地发送保持活动到服务器并从服务器接收响应。

我的理解是可以发送,并在同一时间在同一插座上接收数据包,但我担心,我需要一段时间来建立一个数据包发送的情况下,在此期间,服务器发送了我两个消息。

  1. 当我打电话接收(),做第二个消息覆盖的第一条消息?
  2. 它是建立两个UDP套接字什么,我试图完成的最佳实践? 一个插座用于发送和用于接收一个插座。

谢谢你,莱克斯

Answer 1:

不幸的是服务器,你说你无法控制的,需要UDP 具有认证方案。 这是一个严重的安全问题,因为它是相对容易的攻击者假装是相同的UDP终点为您的客户端已被验证。

至于你的具体问题去:

  1. 在一个完美的世界,如果服务器发送给您两个数据包(消息)你已经尝试接收任何之前,你仍然会同时接收数据包,在其发送的顺序,因为操作系统已经缓冲了他们,他们都提出来你为了。

问题是,它不是一个完美的世界,尤其是当你正在处理UDP。 UDP有三个显著的局限性:

  • 任何给定的数据报传递不能保证。 任何数据包可以在任何时候丢失。
  • 交付的订单不能保证。 数据报不一定在它们被发送的顺序接收。
  • 交货的唯一性无法得到保证。 任何给定的数据报可被传递一次以上。

因此,它不仅是可能的,如果服务器发送第二数据报,第一个可能会丢失,如果你还没有收到它,第一个可能会丢失在任何情况下 。 你有没有保证任何数据报将被交付给你。

现在,也有你与数据报做什么,一旦你已经收到了这个问题。 不幸的是,它不是从你的问题清楚这是否是你问什么的一部分。 但自然,一旦调用ReceiveFrom()完成(或Receive()如果你已经使用Connect()在UDP Socket ),你手头的数据报,这完全取决于你的代码是如何处理和是否previously-接收到的数据将被覆盖或没有。

  1. 不是创建两个单独的UDP最佳实践Socket实例,一个以处理接收和一个来处理发送。 它不仅是不必要的,你就必须要么有某种机制使服务器明白,两个不同的远程端点实际上代表相同的客户端(因为它们通常有不同的端口号,就算你保证,他们是在同一个IP地址),或者你将不得不滥用Socket使用“复用地址”选项(这是一种方法,允许通过两个不同的使用相同的端口Sockets ,但是这会导致各种其他问题)。

这是完全没有使用相同Socket实例接收和发送,而事实上这就是你如何预期使用它。 最好的做法是这样做的。



文章来源: Udp Send and Receive socket behavior
标签: c# sockets udp