如何在C中从/到不同的arch运行代码?
我开发了一个小型(非常小)ftp客户端和服务器。如何在C中从/到不同的arch运行代码?,c,architecture,C,Architecture,我开发了一个小型(非常小)ftp客户端和服务器。 这两个程序只有在使用相同的arch时才能编译并运行良好。 如果客户端是Ubuntu amd64,服务器是Ubuntu i386,我就遇到了一个segfault(我认为这是指针问题) 如果客户端是Ubuntu amd64,服务器是Ubuntu amd64,一切正常 如果客户端是Ubuntu i386,服务器是Ubuntu i386,一切正常 如何使这两个程序在不同的拱门上工作? 这是一个代码问题?如果是,我该怎么办? 提前谢谢 可能是不同类型的大小
这两个程序只有在使用相同的arch时才能编译并运行良好。
这是一个代码问题?如果是,我该怎么办?
提前谢谢 可能是不同类型的大小不同,您通过网络发送和接收它们。由于大小不匹配,协议将失去同步 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