我想在UDP数据包丢失(或丢失)问题上获得SO同事的经验.
最初我的理解是,给定直接点对点连接,其中NIC通过交叉电缆和NIC上的充足缓冲器连接并及时处理所述缓冲区,应该没有丢包或数据包排序问题.我相信在这两点之间有一个好的/高端的开关也是如此.
排除上述情况,LAN上的平均UDP丢包率是多少
什么情况会导致UDP数据包排序问题?
在阅读了下面的1和2 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)