我知道UDP不是面向连接的协议,但UDP是我必须做的事情的必要条件。
当我从客户端应用程序向服务器应用程序发送一堆数据包时,无论如何都知道服务器应用程序是否已关闭(例如,用户是否终止了该过程)?
一种方法是定期ping服务器(在与发送/接收数据流的线程不同的线程中)并等待响应。如果服务器没有确认ping,它可能会关闭(虽然不能保证,毕竟这是UDP)。
但是有更好/更简单的方法吗?
答案 0 :(得分:2)
没有可靠的方法。我实现的使用UDP作为传输的协议使用请求/响应模型。例如,SIP,这样做(当然,一般来说):
假设你有2个对等体 - A和B.如果对等体A向对等体B发送请求,则对等体B应该总是发回响应。如果对等体A在特定时间内未收到响应,则重新发送先前的消息。对等方A将继续重新发送消息,直到它从对等方B获得响应,直到指定的到期时间(由此决定)。如果该时间已到期,则假设对等方B已关闭。
答案 1 :(得分:1)
当服务器进程未运行时,您的服务器操作系统可能将“目标端口无法访问”等ICMP数据包发送回发送方。检查tcpdump或其他数据包嗅探器。如果是这样,那么您的客户可能会发现是否收到了这样的回复。
Ping(ICMP echo)服务器不会非常有用,因为无论服务器进程是否正在运行,操作系统都会响应ping。
答案 2 :(得分:1)
嗯,你是对的,UDP是一个不可靠的协议。没有握手,没有确认,没有可靠性。
您最好的选择是在新线程中ping,但是以UDP方式(相同的端点实现)执行此操作,但这实际上并不比让目标发回“已接收”的UDP数据包更可靠。你不会做得比这更好,因为它不是一个有状态的开放连接,只要你发送一个数据包并假设它已到达或你收到了数据。也不保证接收顺序,因此您必须假设ping成功并且没有超过您在那里的实际有效负载,或者您没有从其他请求获得成功回复。