关于C# UDP套接字

3
  • 我需要使用C#中的UDP套接字连接到外部服务器。
  • 我不理解服务器使用说明中的这两行:

"强制使用专用套接字。"

"如果服务器与客户端失去UDP连接,它将会……"

我认为UDP套接字是无连接的!那么"失去连接"是什么意思?如何避免它?是否有已知的方法确保"专用套接字"?

谢谢


2
值得注意的是,调用 UDP 套接字时可能会抛出 SocketException 异常,并将 SocketError.ConnectionReset 作为错误代码。UDP 没有任何结构化的连接/断开连接会话,但它确实使用动态分配的远程端口来允许回复,这是一种“连接”的方式。 - Dan Bryant
2个回答

3

“强制使用专用套接字。”

对我来说,这句话的意思是,为每个连接创建一个唯一的套接字,并在整个连接过程中使用它。

编辑:仅为了扩展此内容,从服务器的角度来看。

UDP套接字不是通过远程地址识别的,而只是通过本地地址识别的,尽管每个消息都有一个关联的远程地址。(source)

这样,服务器就可以区分每个消息来自哪个客户端。由于远程地址由ip地址和端口组合组成,因此您应该在与服务器通信期间始终使用相同的套接字。这是因为如果不这样做,在更改底层套接字时可能会被分配不同的端口。

“如果服务器与客户端失去UDP连接,则...”

有可能失去UPD连接,例如连接中的任何一端点丢失,比如我去服务器拉电源插头?

编辑2:丹·布莱恩特在评论中提出了一个很好的观点,与我所说的内容相关。

值得注意的一点是,调用UDP套接字可能会抛出SocketException异常,并将SocketError.ConnectionReset作为错误代码。 UDP没有任何结构化的连接/断开会话,但它使用动态分配的远程端口来允许回复,这是一种“连接”的方式。

2
服务器可能有某种超时。当我们的UDP连接被中断时,无需执行任何操作即可再次调用Socket.Send()(在初始连接后是无状态的)。 Translated text: 服务器可能有某种超时。当我们的UDP连接被中断时,无需执行任何操作即可再次调用Socket.Send()(在初始连接后是无状态的)。 - Byron Ross
我认为Parmesan提出了一个很好的观点。但是如果接收方有许多套接字,服务器如何确定这些套接字来自同一客户端?! - Betamoo

0

经过尝试了两个小时不同的 -也许是随机的解决方案:

  • 服务器希望您在与实际发送数据所使用的端口不同的端口上介绍自己。"专用套接字"

  • 您知道正在发送启动信息的IP和端口,但不知道将用于实际数据传输的IP和端口。

解决方案

1- 您将创建具有已知IPEndpoint的套接字,并在其上发送“开始消息”。

2- 然后等待从任何IP接收...

3- 服务器将响应“欢迎消息”,指定它将使用的Endpoint。(通过更改Socket.ReceiveFrom()的参数ref remoteEP)

4- 然后您必须更改要发送的端口=远程Endpoint端口+1 (为什么?标准方式或其他原因?)

5- 最后,您可以使用这些端口正常发送和接收


这与Dan Bryant所说的密切相关... “动态分配远程端口以允许回复” -除了这不是“动态”的。 - Betamoo
这听起来像是你的第三方服务器使用的自定义“协议”。我以前见过类似的东西(除了端点+1),那看起来有些可疑。 - ParmesanCodice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接