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

pol*_*nux -2 c architecture

我开发了一个小型(非常小)的ftp客户端和服务器.
这两个程序只有在使用相同的arch时才能编译和运行.

  1. 如果客户端是Ubuntu amd64而服务器是Ubuntu i386我得到了一个段错误(我认为这是一个指针问题)
  2. 如果客户端是Ubuntu amd64而服务器是Ubuntu amd64都可以
  3. 如果客户端是Ubuntu i386而服务器是Ubuntu i386都可以

我怎样才能使这两个程序在不同的拱门上工作?
这是一个代码问题?如果是这样我必须做什么?
提前致谢!

Geo*_*edy 5

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

Linux使用x86_64 的LP64数据模型,因此int仍然是32位但是long64位.在x86上long是32位.

幸运的是,C标准在stdint.h头文件中定义了几种固定宽度的整数类型.如果您包括您可以使用无符号类型和符号类型与ň为8,16,32或64.你必须考虑到网络协议的另一件事是字节顺序.POSIX提供的功能,,,和其转换32位和16位整数从主机顺序到网络顺序,反之亦然,分别.uintn_tintn_thtonlhtonsntohlntohs

编辑:

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

编辑2:

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

此外,由于所有大小修饰符printf都基于标准short/ int/ long类型,因此您需要使用宏<inttypes.h>来生成格式字符串.例如:

#include <inttypes.h>

/* ... */

int32_t signed32;
uint16_t unsigned16;

printf("Signed 32 is %"PRIu32" and unsigned 16 is %"PRId16"\n", signed32, unsigned16);
Run Code Online (Sandbox Code Playgroud)

您的系统可能在这些头文件(我的fedora系统)上有手册页,因此在命令提示符下您可以使用

man stdint.h
Run Code Online (Sandbox Code Playgroud)

man inttypes.h
Run Code Online (Sandbox Code Playgroud)

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