- 我需要使用C#中的UDP套接字连接到外部服务器。
- 我不理解服务器使用说明中的这两行:
"强制使用专用套接字。"
和
"如果服务器与客户端失去UDP连接,它将会……"
我认为UDP套接字是无连接的!那么"失去连接"是什么意思?如何避免它?是否有已知的方法确保"专用套接字"?
谢谢
"强制使用专用套接字。"
和
"如果服务器与客户端失去UDP连接,它将会……"
我认为UDP套接字是无连接的!那么"失去连接"是什么意思?如何避免它?是否有已知的方法确保"专用套接字"?
谢谢
“强制使用专用套接字。”
对我来说,这句话的意思是,为每个连接创建一个唯一的套接字,并在整个连接过程中使用它。
编辑:仅为了扩展此内容,从服务器的角度来看。
UDP套接字不是通过远程地址识别的,而只是通过本地地址识别的,尽管每个消息都有一个关联的远程地址。(source)。
这样,服务器就可以区分每个消息来自哪个客户端。由于远程地址由ip地址和端口组合组成,因此您应该在与服务器通信期间始终使用相同的套接字。这是因为如果不这样做,在更改底层套接字时可能会被分配不同的端口。
“如果服务器与客户端失去UDP连接,则...”
有可能失去UPD连接,例如连接中的任何一端点丢失,比如我去服务器拉电源插头?
编辑2:丹·布莱恩特在评论中提出了一个很好的观点,与我所说的内容相关。
值得注意的一点是,调用UDP套接字可能会抛出SocketException异常,并将SocketError.ConnectionReset作为错误代码。 UDP没有任何结构化的连接/断开会话,但它使用动态分配的远程端口来允许回复,这是一种“连接”的方式。经过尝试了两个小时不同的 -也许是随机的解决方案:
服务器希望您在与实际发送数据所使用的端口不同的端口上介绍自己。"专用套接字"
您知道正在发送启动信息的IP和端口,但不知道将用于实际数据传输的IP和端口。
解决方案
1- 您将创建具有已知IPEndpoint的套接字,并在其上发送“开始消息”。
2- 然后等待从任何IP接收...
3- 服务器将响应“欢迎消息”,指定它将使用的Endpoint。(通过更改Socket.ReceiveFrom()的参数ref remoteEP)
4- 然后您必须更改要发送的端口=远程Endpoint端口+1 (为什么?标准方式或其他原因?)
5- 最后,您可以使用这些端口正常发送和接收