我开发了一个小型(非常小)的ftp客户端和服务器 如果他们使用相同的拱门,这两个程序都可以编译并运行良好 。
我如何让这两个程序在不同的拱门上工作? 这是一个代码问题?如果是这样我必须做什么? 提前谢谢!
答案 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提供的功能htonl
,htons
,ntohl
和ntohs
分别将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
获取有关这些标头中定义的类型,宏和函数的更多信息。