UDP 套接字读取最后一个传入字节

UDP Socket reading last incoming byte

本文关键字:字节 最后一个 套接字 读取 UDP      更新时间:2023-10-16

我有一个在字节中发送大量内容的套接字,它经常重复相同的信息,但接收器无法一次获得所有这些字节。我有办法减慢发送端的速度,但现在我有延迟,因为没有足够的字节。我需要实时转账。

有没有办法让接收器读取最后一个传入字节并丢弃其他字节,然后在程序中追求?

while (sock->isConnect() && tcpsock->isConnect()) {
// with while instead of if, stuck in the loop
if (sock->RecData(buff, 14)) { //receiving 14 bytes from UDP
sendAngles2(buff);
logger->setLatenz(logger->RECV);
}
logger->setLatenz(logger->MAIN);
logger->LogData();
// rest of the code 
}

有没有办法让接收方读取最后一个传入字节并丢弃其他字节,然后在程序中追求?

是的。设置套接字非阻塞。如有必要,如果需要,请使用select等待数据到达。

然后继续在循环中调用recv(或recvfrom(,直到它返回EWOULDBLOCK错误。然后使用您从上一次呼叫中收到的数据(确保保存其长度(。

不幸的是,没有标准/正常的方法可以做到这一点1- 当为具有完整接收缓冲区的 UDP 套接字接收新数据包时,新数据包将被丢弃,即使可以丢弃较旧的(缓冲(数据包。

您可以做的一件事是使用setsockopt(fd, SOL_SOCKET, SO_RECVBUF,...减小套接字接收缓冲区的大小。 这样做将导致它在接收方落后时更快地开始丢弃数据包,矛盾地减少了处理数据包的延迟,类似于缓冲区膨胀缓解技术。


1我所知,在Linux或BSD上没有办法做到这一点;一些实时操作系统可能有办法做到这一点。