如何在C中从/向不同的arch运行代码?

时间:2012-07-03 20:11:50

标签: c architecture

我开发了一个小型(非常小)的ftp客户端和服务器 如果他们使用相同的拱门,这两个程序都可以编译并运行良好

  1. 如果客户端是Ubuntu amd64而服务器是Ubuntu i386我得到了一个段错误(我认为它是一个指针问题)
  2. 如果客户端是Ubuntu amd64而服务器是Ubuntu amd64都可以
  3. 如果客户端是Ubuntu i386而服务器是Ubuntu i386都可以
  4. 我如何让这两个程序在不同的拱门上工作? 这是一个代码问题?如果是这样我必须做什么? 提前谢谢!

1 个答案:

答案 0 :(得分:5)

各种类型的大小可能不同,您可以通过网络发送和接收它们。由于大小不匹配,协议将变得不同步。

Linux使用LP64 data model表示x86_64,因此int仍为32位,long为64位。在x86上long是32位。

幸运的是,C标准在stdint.h头文件中定义了几种固定宽度的整数类型。如果包含,则可以使用未签名类型uintn_t和带有 n 的签名类型intn_t为8,16,32或64.您考虑的另一件事是网络协议是字节顺序。 POSIX提供的功能htonlhtonsntohlntohs分别将32位和16位整数从主机顺序转换为网络顺序,反之亦然。 / p>

编辑:

正如可变长度编码器所说,发送整个结构也不可移植(尽管它在x86和x86_64之间)。如果您通过网络发送结构,您应该逐个成员发送一个成员,并分配到接收端的相应字段。

编辑2:

size_t也不是便携式数据类型。您应该选择适合该协议的显式大小类型。可能uint32_t可能是个不错的选择。

此外,由于printf的所有尺寸修饰符均基于标准short / int / long类型,因此您需要使用{{1}中的宏制作格式字符串。例如:

<inttypes.h>

您的系统可能在这些头文件上有手册页(我的fedora系统会这样做)所以在命令提示符下你可以使用

#include <inttypes.h>

/* ... */

int32_t signed32;
uint16_t unsigned16;

printf("Signed 32 is %"PRIu32" and unsigned 16 is %"PRId16"\n", signed32, unsigned16);

man stdint.h

获取有关这些标头中定义的类型,宏和函数的更多信息。