【问题标题】:About C# UDP Sockets关于 C# UDP 套接字
【发布时间】:2011-02-15 00:25:35
【问题描述】:
  • 我应该使用 C# 中的 UDP 套接字连接到外部服务器..
  • 我无法理解服务器使用说明中的这两行:

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

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

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

谢谢

【问题讨论】:

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

标签: c# sockets connection udp


【解决方案1】:

"使用专用套接字是 强制执行。”

这就是说,为每个连接创建一个唯一的套接字并在整个连接中使用它。

编辑:从服务器的角度来看,只是为了扩展这一点。

UDP 套接字不被 远程地址,但只能由本地 地址,虽然每条消息都有一个 关联的远程地址。 (source).

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

"如果服务器失去 UDP 连接 与客户一起,它将……”

可能会丢失 UPD 连接,例如连接中的任何一个端点都丢失了,假设我去服务器并拔掉插头?

编辑2: Dan Bryant 在 cmets 中提出了一个很好的观点,这与我所说的有关。

值得注意的一点是 可以调用 UDP 套接字 抛出一个 SocketException SocketError.ConnectionReset 为 错误代码。 UDP没有任何排序 与结构化的会话 连接/断开连接,但它确实使用了 动态分配的远程端口 允许回复,这是一种 '连接'。

【讨论】:

  • 服务器很可能有某种超时。当我们的 UDP 连接中断时,无需再次调用 Socket.Send() (初始连接后是无状态的)。
  • 我认为 Parmesan 提出了一个很好的观点。但是如果接收方有很多套接字,服务器将如何确定这些套接字来自同一个客户端?!
【解决方案2】:

尝试不同的 2 小时后 - 可能是随机解决方案:

  • 服务器希望您在一个端口上介绍自己,而不是您将用于实际发送数据的端口。 “专用套接字”

  • 您知道要在哪个 IP 和端口上发送启动信息,但您不知道哪个将用于实际数据传输..

解决方案

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

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

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

4- 然后您必须更改您发送的端口 = 远程端点端口 + 1 (为什么?标准方式还是什么?)

5-终于可以使用这些端口正常收发了

【讨论】:

  • 这与 Dan Bryant 所说的密切相关......“动态分配的远程端口以允许回复” - 除非这不是“动态”......
  • 这听起来像是为您的第三方服务器定制的“协议”。我以前见过类似的东西(除了端点 + 1),看起来很狡猾。
猜你喜欢
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 2011-08-19
  • 2018-04-03
  • 2017-10-28
  • 2012-01-30
  • 2010-12-22
  • 2013-11-18
相关资源
最近更新 更多