小编Jon*_*onS的帖子

服务器可以在单个线程中处理多个套接字吗?

我正在编写一个需要模拟虚拟机之间多个连接的测试程序,出于各种原因,似乎最好的方法是使用 Unix 域套接字。我是使用 SOCK_STREAM 还是 SOCK_DGRAM 并不重要,但看起来 SOCK_STREAM 对我来说更容易/更简单。

我的问题似乎与典型场景有点倒退。我想让一个客户端通过 4 个不同的套接字与服务器通信。(我可以有 4 个客户端,每个客户端有一个套接字,但这种区别应该无关紧要。)现在,我正在模拟的东西没有多个线程,并且每当通过“套接字”之一接收到数据包时都会得到中断”。有没有一些简单的方法可以用 Unix 套接字模拟这个?

我认为我必须做的socket()bind()listen()所有4个插槽第一,然后做一个accept()对所有4个,并做fcntl( fd, F_SETFF, FNDELAY )了每个人,使他们非阻塞,这样我可以检查每一个数据read()在一个循环的方式. 有什么方法可以使它成为中断驱动或事件驱动,以便我的主循环仅在套接字中有数据时才检查套接字中的数据吗?或者像这样对他们进行投票是否更好?

sockets

6
推荐指数
1
解决办法
4334
查看次数

如何编译相同的源代码生成不同的目标文件?

经过长时间的调试后,我将问题缩小到一个文件.问题是,当其他所有目录相同时,文件在两个不同的目录中编译的方式不同.

我正在使用CodeSourcery的arm gcc编译器(gcc版本4.3.3,Sourcery G ++ Lite 2009q1-161)来编译一个简单的文件.我在一个模块中使用它没有任何问题,然后我将其复制到另一个模块使用.编译时,目标文件明显不同.编译这两个文件的命令行是相同的(我使用linux历史记录确保),3个包含文件也是相同的副本(用diff检查).

我对两个目标文件进行了二进制比较,并且它们分散了很多单独的字节差异.我做了两个objdump -D并对它们进行了比较,并且存在很多差异.这是dump1,dump2diff.命令行是"arm-none-eabi-gcc --std = gnu99 -Wall -O3 -g3 -ggdb -Wextra -Wno-unused -c crc.c -o crc.o".

这怎么可能?我还用-S而不是-c编译并查看了汇编器输出,除目录路径外,它们是相同的.那么目标文件怎么会有所不同呢?

我真正的问题是,当我尝试将dump2的目标文件链接到我的程序时,我得到未定义的引用错误,因此对象中的某些内容是错误的,而dump1的对象没有得到这样的错误和链接.

c linux compiler-construction gcc arm

5
推荐指数
1
解决办法
1669
查看次数

在C中获取双字的高位字的最有效方法是什么?

假设我有一个dword.

uint32_t var1 = 0xABCD1234;
Run Code Online (Sandbox Code Playgroud)

我需要获得高位字,因为它是自己的价值.在C中有几种不同的方法可以在32位处理器/ OS上最有效地编译哪一种?如果它是64位处理器/操作系统,它会有所作为吗?

1.转移

uint16_t var2 = var1 >> 16;
Run Code Online (Sandbox Code Playgroud)

2.铸造

这需要知道处理器的字节顺序,所以在这方面它是负面的,但假设你有正确的结束.

uint16_t var2 = *( (uint16*)&var1 );
Run Code Online (Sandbox Code Playgroud)

要么

uint16_t var2 = *( (uint16_t*)&var1 + 1 );
Run Code Online (Sandbox Code Playgroud)

3.划分

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)

c

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

标签 统计

c ×2

arm ×1

compiler-construction ×1

gcc ×1

linux ×1

sockets ×1