繁体   English   中英

UDP发送和接收套接字行为

[英]Udp Send and Receive socket behavior

我正在编写一个程序,该程序将首先对服务器进行身份验证,然后通过UDP发送和接收消息。 在发送和接收消息时,我还需要维护与服务器的连接,因此我需要定期将KeepAlive发送到服务器并从服务器接收响应。

我知道可以在同一时间在同一套接字上发送和接收数据包,但是我担心这种情况:我花了一些时间来构建要发送的数据包,在此期间,服务器向我发送了两条消息。

  1. 当我调用receive()时,第二条消息是否会覆盖第一条消息?
  2. 为要完成的任务设置两个UDP套接字是最佳实践吗? 一个用于发送的插槽和一个用于接收的插槽。

谢谢Lex

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

至于您的具体问题:

  1. 在理想的情况下,如果服务器在尝试接收任何数据报之前向您发送了两个数据报(消息),则您仍将按照发送它们的顺序接收两个数据报,因为操作系统已将它们缓冲并提供给为了你。

问题在于,这不是一个完美的世界,尤其是在处理UDP时。 UDP具有三个重要限制:

  • 不保证任何给定数据报的传送。 任何数据报都可能随时丢失。
  • 不能保证交货顺序。 数据报不一定按发送时的相同顺序接收。
  • 不能保证交付的唯一性。 任何给定的数据报可能会被多次传递。

因此,如果服务器发送第二个数据报,不仅有可能会丢失第一个数据报(如果您尚未收到),那么无论如何第一个数据报都可能会丢失。 您不能保证任何数据报都会被交付给您。

现在,也有你与数据报做什么,一旦你已经收到了这个问题。 不幸的是,从您的问题中尚不清楚这是否是您要问的内容的一部分。 但是自然地,一旦对ReceiveFrom()的调用完成(或者,如果您已经在UDP Socket上使用了Connect()Receive()的调用)并且您拥有了数据报,这完全取决于您的代码如何处理以及是否先前-接收的数据是否被覆盖。

  1. 创建两个单独的UDP Socket实例不是一个最佳实践,一个实例用于处理接收,另一个实例用于发送。 不仅是没有必要的,您还必须具有某种机制让服务器理解两个不同的远程端点实际上代表同一客户端(因为即使保证它们位于相同的IP地址上,它们通常具有不同的端口号) ),否则您将不得不使用“重用地址”选项来滥用Socket (这是一种允许两个不同的Sockets使用同一端口的方法,但这会导致其他各种问题)。

将相同的Socket实例用于接收和发送都很好,实际上,这就是您期望使用它的方式。 最佳做法是这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM