2

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

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

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

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

4

3 回答 3

2

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

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

于 2012-04-11T01:44:15.157 回答
1

当服务器进程未运行时,您的服务器操作系统可能会将诸如“目标端口不可达”之类的 ICMP 数据包发送回发送方。使用 tcpdump 或其他数据包嗅探器检查。如果是这样,那么您的客户可能能够查明是否收到了这样的响应。

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

于 2012-04-11T01:21:28.080 回答
1

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

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

于 2012-04-11T01:25:57.357 回答