我怎么知道服务器已使用套接字通过 UDP 关闭

本文关键字:UDP 关闭 套接字 服务器 我怎么知道 | 更新日期: 2023-09-27 18:30:45

我知道UDP不是一个面向连接的协议,但UDP是我必须做的事情的要求。

当我从客户端应用程序向服务器应用程序发送一堆数据包时,是否知道服务器应用程序是否已关闭(例如,用户终止了进程)?

一种方法是定期 ping 服务器(与发送/接收数据流的线程在不同的线程中)并等待响应。如果服务器不确认ping,它可能已关闭(尽管不能保证,毕竟这是UDP)。

但是有没有更好/更简单的方法?

我怎么知道服务器已使用套接字通过 UDP 关闭

没有可靠的方法。我实现的使用 UDP 作为传输的协议使用请求/响应模型。例如,SIP 是这样做的(当然,一般来说):

假设您有 2 个对等方 - A 和 B。如果对等方 A 向对等方 B 发送请求,则对等方 B 应始终发回响应。如果对等方 A 在特定时间内未收到响应,则会重新发送上一条消息。对等方 A 将继续重新发送消息,直到它收到对等方 B 的响应,或者直到指定的到期时间(由您决定)。 如果该时间已过期,则假定对等方 B 已关闭。

当服务器进程未运行时,您的服务器操作系统可能会将 ICMP 数据包(如"目标端口无法访问")发送回发送方。使用 tcpdump 或其他数据包嗅探器进行检查。如果是这样,那么您的客户可能能够找出是否收到了这样的响应。

对服务器执行 ping 操作(ICMP 回显)不会很有用,因为无论您的服务器进程是否正在运行,操作系统都会响应 ping。

嗯,你是对的,UDP 是一种不可靠的协议。没有握手,没有确认,没有可靠性。

最好的办法是 ping 新线程,但以 UDP 方式(相同的端点实现)执行此操作,但这实际上并不比让目标发送"收到的"UDP 数据包更可靠。你不会做得比这更好,因为它不是一个有状态的开放连接,只是你发送了一个数据包并假设它到达了,或者你收到了数据。也不能保证接收顺序,因此您必须假设ping成功并且没有超过您的实际有效负载,或者您没有从其他请求中得到成功的回复。