我开发了一个小型(非常小)的ftp客户端和服务器.
这两个程序只有在使用相同的arch时才能编译和运行.
我怎样才能使这两个程序在不同的拱门上工作?
这是一个代码问题?如果是这样我必须做什么?
提前致谢!
它可能是各种类型的大小不同,您通过网络发送和接收它们.由于大小不匹配,协议将变得不同步.
Linux使用x86_64 的LP64数据模型,因此int
仍然是32位但是long
64位.在x86上long
是32位.
幸运的是,C标准在stdint.h
头文件中定义了几种固定宽度的整数类型.如果您包括您可以使用无符号类型和符号类型与ň为8,16,32或64.你必须考虑到网络协议的另一件事是字节顺序.POSIX提供的功能,,,和其转换32位和16位整数从主机顺序到网络顺序,反之亦然,分别.uintn_t
intn_t
htonl
htons
ntohl
ntohs
编辑:
正如可变长度编码器所指出的那样,发送整个结构也不可移植(尽管它位于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)
获取有关这些标头中定义的类型,宏和函数的更多信息.