UDP Socket读取最后一个输入字节

时间:2017-08-18 16:50:32

标签: c++ sockets udp

我有一个套接字,它在字节之间发送一个massiv,通常重复相同的信息,但是接收器不能一次得到所有这些字节。我有办法减慢发送方的速度,但现在我有延迟,因为没有足够的字节来。我需要实时转移。

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

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 
}

2 个答案:

答案 0 :(得分:1)

Is there a way that the receiver read the last incoming byte and discard the other ones then pursue in the program?

Yes. Set the socket non-blocking. If necessary, use select to wait for data to arrive if you need to do that.

Then keep calling recv (or recvfrom) in a loop until it returns a EWOULDBLOCK error. Then use the data you received from the previous call (make sure to save its length).

答案 1 :(得分:0)

不幸的是,没有标准/正常的方法来执行此操作 1 - 当收到具有完整接收缓冲区的UDP套接字的新数据包时,新数据包将被丢弃,即使它已被删除最好丢弃旧的(缓冲的)数据包。

您可以做的一件事是使用setsockopt(fd, SOL_SOCKET, SO_RECVBUF, ...来减少套接字接收缓冲区的大小。这样做会导致它在接收器落后时开始丢弃数据包,反而会减少处理数据包的延迟,类似于bufferbloat缓解技术。

1 我无法在Linux或BSD上执行此操作;一些实时操作系统可能有办法实现