TIdUDPClient的ReceiveBuffer无延迟及接收相关技术咨询
关于TIdUDPClient重传机制的两个问题解答
1. ReceiveTimeout设置:用0实现无等待接收
要让ReceiveBuffer()在缓冲区无数据时完全不等待,直接返回,需要把ReceiveTimeout设为0:
- 当
ReceiveTimeout=0时,ReceiveBuffer()会立即检查缓冲区,有数据就读取,无数据则直接抛出EIdSocketError异常(错误码对应WSAEWOULDBLOCK),你可以捕获这个异常来判断当前没有数据需要处理。 - 设为
-1代表无限等待,直到有数据到达,这不符合你“完全不等待”的需求。 - 另外,也可以直接调用
ReceiveBufferTimeout()方法,传入超时参数0,效果和设置ReceiveTimeout=0一致,不用修改全局超时属性。
2. 接收重传请求前无需调用Connect()
你当前每次调用SendBuffer()都指定IP和端口的做法是没问题的,接收重传请求前不需要提前调用Connect():
- UDP是无连接协议,TIdUDPClient的
Connect()方法只是预先绑定一个默认的目标地址,后续发送可以省略地址参数,但会限制只能接收来自该绑定地址的数据包。 - 对于你的场景,重传请求来自服务器端,直接调用
ReceiveBuffer()或ReceiveFrom()即可获取发送方的地址信息,之后针对该地址发送重传数据就行。保持无连接状态更灵活,避免因绑定地址导致无法接收其他意外数据包(虽然你这里场景单一,但没必要多此一举)。
内容的提问来源于stack exchange,提问作者Ross
相关产品推荐
相关产品推荐

