我正在编写一个需要模拟虚拟机之间多个连接的测试程序,出于各种原因,似乎最好的方法是使用 Unix 域套接字。我是使用 SOCK_STREAM 还是 SOCK_DGRAM 并不重要,但看起来 SOCK_STREAM 对我来说更容易/更简单。
我的问题似乎与典型场景有点倒退。我想让一个客户端通过 4 个不同的套接字与服务器通信。(我可以有 4 个客户端,每个客户端有一个套接字,但这种区别应该无关紧要。)现在,我正在模拟的东西没有多个线程,并且每当通过“套接字”之一接收到数据包时都会得到中断”。有没有一些简单的方法可以用 Unix 套接字模拟这个?
我认为我必须做的socket(),bind()和listen()所有4个插槽第一,然后做一个accept()对所有4个,并做fcntl( fd, F_SETFF, FNDELAY )了每个人,使他们非阻塞,这样我可以检查每一个数据read()在一个循环的方式. 有什么方法可以使它成为中断驱动或事件驱动,以便我的主循环仅在套接字中有数据时才检查套接字中的数据吗?或者像这样对他们进行投票是否更好?
经过长时间的调试后,我将问题缩小到一个文件.问题是,当其他所有目录相同时,文件在两个不同的目录中编译的方式不同.
我正在使用CodeSourcery的arm gcc编译器(gcc版本4.3.3,Sourcery G ++ Lite 2009q1-161)来编译一个简单的文件.我在一个模块中使用它没有任何问题,然后我将其复制到另一个模块使用.编译时,目标文件明显不同.编译这两个文件的命令行是相同的(我使用linux历史记录确保),3个包含文件也是相同的副本(用diff检查).
我对两个目标文件进行了二进制比较,并且它们分散了很多单独的字节差异.我做了两个objdump -D并对它们进行了比较,并且存在很多差异.这是dump1,dump2和diff.命令行是"arm-none-eabi-gcc --std = gnu99 -Wall -O3 -g3 -ggdb -Wextra -Wno-unused -c crc.c -o crc.o".
这怎么可能?我还用-S而不是-c编译并查看了汇编器输出,除目录路径外,它们是相同的.那么目标文件怎么会有所不同呢?
我真正的问题是,当我尝试将dump2的目标文件链接到我的程序时,我得到未定义的引用错误,因此对象中的某些内容是错误的,而dump1的对象没有得到这样的错误和链接.
假设我有一个dword.
uint32_t var1 = 0xABCD1234;
Run Code Online (Sandbox Code Playgroud)
我需要获得高位字,因为它是自己的价值.在C中有几种不同的方法可以在32位处理器/ OS上最有效地编译哪一种?如果它是64位处理器/操作系统,它会有所作为吗?
uint16_t var2 = var1 >> 16;
Run Code Online (Sandbox Code Playgroud)
这需要知道处理器的字节顺序,所以在这方面它是负面的,但假设你有正确的结束.
uint16_t var2 = *( (uint16*)&var1 );
Run Code Online (Sandbox Code Playgroud)
要么
uint16_t var2 = *( (uint16_t*)&var1 + 1 );
Run Code Online (Sandbox Code Playgroud)
uint16_t var2 = (uint16_t)( var1 / ( 1ULL << 16 ) );
Run Code Online (Sandbox Code Playgroud)
我是否想念其他任何方式?
编辑:是的,我错过了工会.
union { uint32_t v32; uint16_t v16[2]; } u;
uint32_t var1 = 0xABCD1234;
u.v32 = var1;
uint16_t var2 = u.v16[1]; // or u.v16[0] depending on endianess
Run Code Online (Sandbox Code Playgroud)