UDP 套接字读取最后一个传入字节
UDP Socket reading last incoming byte
我有一个在字节中发送大量内容的套接字,它经常重复相同的信息,但接收器无法一次获得所有这些字节。我有办法减慢发送端的速度,但现在我有延迟,因为没有足够的字节。我需要实时转账。
有没有办法让接收器读取最后一个传入字节并丢弃其他字节,然后在程序中追求?
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上没有办法做到这一点;一些实时操作系统可能有办法做到这一点。
相关文章:
- lower_bound()返回最后一个元素
- 获取向量C++中第一个值和最后一个值的和
- 获取用C/C++打印的最后一个字符串
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 为什么这个程序返回最后一个单词而不是最长的单词?
- 为什么我的最后一个 ELSE 条件无法正确执行
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 仅显示链表的最后一个元素
- 测试迭代器是否位于列表中的最后一个
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- UDP 套接字读取最后一个传入字节
- 处理Huffman压缩/减压中的最后一个字节
- C RLE BMP压缩跳过了最后一个字节
- Qt串行端口有时会丢失最后一个字节
- 写入类的最后一个字节
- 查找数组中给定索引的第一个和最后一个字节的地址
- 在Arduino上使用sscan()对最后一个字节进行归零
- 使用fstream从文件中获取最后一个字节的最佳方法