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

如何在C中从/到不同的arch运行代码?,c,architecture,C,Architecture,我开发了一个小型(非常小)ftp客户端和服务器。 这两个程序只有在使用相同的arch时才能编译并运行良好。 如果客户端是Ubuntu amd64,服务器是Ubuntu i386,我就遇到了一个segfault(我认为这是指针问题) 如果客户端是Ubuntu amd64,服务器是Ubuntu amd64,一切正常 如果客户端是Ubuntu i386,服务器是Ubuntu i386,一切正常 如何使这两个程序在不同的拱门上工作? 这是一个代码问题?如果是,我该怎么办? 提前谢谢 可能是不同类型的大小

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

  • 如果客户端是Ubuntu amd64,服务器是Ubuntu i386,我就遇到了一个segfault(我认为这是指针问题)
  • 如果客户端是Ubuntu amd64,服务器是Ubuntu amd64,一切正常
  • 如果客户端是Ubuntu i386,服务器是Ubuntu i386,一切正常
  • 如何使这两个程序在不同的拱门上工作?
    这是一个代码问题?如果是,我该怎么办?

    提前谢谢

    可能是不同类型的大小不同,您通过网络发送和接收它们。由于大小不匹配,协议将失去同步

    Linux使用x86_64的int仍然是32位,但是
    long
    是64位。在x86上,long是32位

    幸运的是,C标准在
    stdint.h
    头文件中定义了几种固定宽度的整数类型。如果包括,则可以使用无符号类型
    uintn\t
    和有符号类型
    intn\t
    ,其中n为8、16、32或64。网络协议需要考虑的另一件事是字节顺序。POSIX提供函数
    htonl
    htons
    ntohl
    ntohs
    ,分别将32位和16位整数从主机顺序转换为网络顺序,反之亦然

    编辑:

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

    编辑2:

    size\t
    也不是可移植的数据类型。您应该选择适合协议的显式大小的类型。可能
    uint32\t
    是一个不错的选择

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

    #include <inttypes.h>
    
    /* ... */
    
    int32_t signed32;
    uint16_t unsigned16;
    
    printf("Signed 32 is %"PRIu32" and unsigned 16 is %"PRId16"\n", signed32, unsigned16);
    


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

    我将确定SEGFULT的根本原因,而不是推测。我必须发布所有代码吗?:)不使用调试器(或其他调试技术)找出出现segfault的原因。一个可能的问题是:在执行网络协议时,您没有按照自己的意愿在流中填充局部变量;您必须输入协议所需的位数。还有一些类型(int,但不仅仅是int)在32/64位中有不同的大小。事实上,我认为这才是真正的问题!(就像是4或8字节的指针)结构填充也是一个问题,尽管不是在x86/x86_64上。因此,例如,我必须做:
    typedef int int32_t
    typedef uint32_t
    ?@polslinux,不,只是
    ,包括
    并使用
    int32_t
    。标题为您提供了适当的typedef。因此,我必须用
    int32\t
    替换我所有的
    int
    ,对吗?和size\u t(未签名)如何声明?
    man stdint.h
    
    man inttypes.h