小编Sam*_*jat的帖子

平均UDP数据包丢失和数据包重新排序

我想在UDP数据包丢失(或丢失)问题上获得SO同事的经验.

最初我的理解是,给定直接点对点连接,其中NIC通过交叉电缆和NIC上的充足缓冲器连接并及时处理所述缓冲区,应该没有丢包或数据包排序问题.我相信在这两点之间有一个好的/高端的开关也是如此.

  1. 排除上述情况,LAN上的平均UDP丢包率是多少

  2. 什么情况会导致UDP数据包排序问题?

statistics networking udp packet loss

11
推荐指数
1
解决办法
6191
查看次数

在C ++中序列化二进制数据的正确方法

在阅读了下面的12 Q / As并在带有GCC和MSVC的x86架构上使用了下面讨论的技术多年之后,没有看到问题,现在我对应该是正确的东西感到非常困惑,但是这也是使用C ++进行序列化然后反序列化二进制数据的重要“最有效”方法。

给出以下“错误”代码:

int main()
{
   std::ifstream strm("file.bin");

   char buffer[sizeof(int)] = {0};

   strm.read(buffer,sizeof(int));

   int i = 0;

   // Experts seem to think doing the following is bad and
   // could crash entirely when run on ARM processors:
   i = reinterpret_cast<int*>(buffer); 

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,据我所知,重新解释类型转换向编译器表明它可以将缓冲区中的内存视为整数,并且随后可以发出整数兼容指令,这些指令要求/假定所讨论的数据具有某些对齐方式-唯一的开销是当CPU检测到其试图执行面向对齐指令的地址实际上未对齐时,多余的读取和移位。

那就是说,上面提供的答案似乎表明,就C ++而言,这都是未定义的行为。

假定将从中进行强制转换的缓冲区位置的对齐方式不一致,那么,对于此问题,唯一的解决方案是将字节一乘一地复制吗?也许有一种更有效的技术?

此外,多年来,我已经看到很多情况,其中将完全由Pod组成的结构(使用特定于编译器的编译指示来删除填充)转换为char *,然后写入文件或套接字,然后再读回缓冲区并且将缓冲区转换回原始结构的指针(忽略机器之间的潜在字节序和浮点/双格式问题),这种代码是否也被视为未定义的行为?

以下是更复杂的示例:

int main()
{
   std::ifstream strm("file.bin");

   char buffer[1000] = {0};

   const std::size_t size = sizeof(int) + sizeof(short) + sizeof(float) + sizeof(double);

   const std::size_t weird_offset = …
Run Code Online (Sandbox Code Playgroud)

c c++ binary serialization undefined-behavior

2
推荐指数
1
解决办法
5541
查看次数