- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 unix 套接字来测试将一些 udp 数据包发送到本地主机。
据我了解,在设置 ip 地址和端口以发送数据包时,我会将转换为网络字节顺序的值填充到我的 sockaddr_in
中。我在 OSX 上,我很惊讶这个
printf("ntohl: %d\n", ntohl(4711));
printf("htonl: %d\n", htonl(4711));
printf("plain: %d\n", 4711);
打印
ntohl: 1729232896
htonl: 1729232896
plain: 4711
所以这两个函数实际上都没有返回普通值。我本来希望看到结果不同,因为 x86 是小端 (afaik),或者与实际数字 4711 相同且相同。显然我不明白什么是 htonl
和 ntohl
及其变体。我错过了什么?
相关代码是这样的:
int main(int argc, char *argv[])
{
if (argc != 4)
{
fprintf(stderr, "%s\n", HELP);
exit(-1);
}
in_addr_t rec_addr = inet_addr(argv[1]); // first arg is '127.0.0.1'
in_port_t rec_port = atoi(argv[2]); // second arg is port number
printf("Address is %s\nPort is %d\n", argv[1], rec_port);
char* inpath = argv[3];
char* file_buf;
unsigned long file_size = readFile(inpath, &file_buf); // I am trying to send a file
if (file_size > 0)
{
struct sockaddr_in dest;
dest.sin_family = AF_INET;
dest.sin_addr.s_addr = rec_addr; // here I would use htons
dest.sin_port = rec_port;
printf("ntohs: %d\n", ntohl(4711));
printf("htons: %d\n", htonl(4711));
printf("plain: %d\n", 4711);
int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (socket_fd != -1)
{
int error;
error = sendto(socket_fd, file_buf, file_size + 1, 0, (struct sockaddr*)&dest, sizeof(dest));
if (error == -1)
fprintf(stderr, "%s\n", strerror(errno));
else printf("Sent %d bytes.\n", error);
}
}
free(file_buf);
return 0;
}
最佳答案
正如其他人所提到的,htons
和 ntohs
在小端机器上反转字节顺序,并且在大端机器上是空操作。
没有提到的是这些函数采用 16 位值并返回 16 位值。如果要转换 32 位值,则需要使用 htonl
和 ntohl
。
这些函数的名称来自某些数据类型的传统大小。 s
代表short
而l
代表long
。 short
通常是 16 位,而在旧系统上 long
是 32 位。
在您的代码中,您不需要在 rec_addr
上调用 htonl
,因为该值是由 inet_addr
返回的,并且该函数以网络字节顺序返回地址。
但是您确实需要在 rec_port
上调用 htons
。
关于c - 理解 htonl() 和 ntohl(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36924598/
在以下关于小端和大端的程序中: char *s = "1234"; printf("%08X\n",*(int *)s); //big endian int little = ntohl(*s); p
我正在 Windows 上寻找一个头文件,我可以用它来获取 C 中的 ntohl 函数,但 Winsock2.h 对我不起作用。有谁知道其他什么头文件可以提供这个? 以下是我尝试包含 Winsock2
我一直在想,为什么我在使用write/read的时候不用htons/ntohl呢? (至少到目前为止我看到的所有例子都没有。) 我怎么知道接收到的字节具有正确的字节顺序? 最佳答案 好吧,如果您打算在
ip=ntohl(*(uint32_t*)PQgetvalue(result, i, 0)); 这段代码是什么意思? 我的猜测是此代码从 PostgreSQL 数据库(其类型为 uint32_t)获取
我正在编写一个跨平台客户端,在提取使用的文件中,它对每个文件使用 IEEE 802.3 以太网 CRC-32 校验和。我像这样对所有文件运行此检查: if(s3d_meta_block.crc !=
编辑:老实说,我不知道错误发生在哪里,所以我只添加大部分相关代码,不确定这是否有帮助 所以基本上我有两个基本的服务器和客户端进程。用户指定命令,客户端进程将消息长度发送给服务器,服务器执行命令并返回响
如果我对一个已经在主机字节顺序中的整数使用 ntohl() 会导致任何问题吗? 如果不是,ntohl() 函数如何知道它的参数已经在主机字节顺序中? 最佳答案 你的问题没有任何意义。对于 ntohl
我正在尝试使用适当字节交换的值来初始化一个全局范围的 const 变量。 #include #include #include const uint32_t a = ntohl(0x112233
我有一个项目需要在 Windows、Linux 和 VxWorks 上构建。该项目建立在 Linux 和 Windows 上,但为 VxWorks 交叉编译。为了处理跨多个平台的字节序,它使用 nto
我需要将网络字节顺序的结构 s1 复制到主机字节顺序的另一个结构 s2 我看到以下两种方法给出了不同的输出。我认为 method2 是正确的做法。我对么 ?如果是,我不明白为什么会有不同的输出。可能
我在某些主机上遇到了 socket.ntohl() 函数的问题。它在所有类似的主机上都是可重复的;使用 Python 2.4.2 的 32 位机器。 >>> socket.ntohl(16777215
我正在编写一个将保存和加载数据的小程序,它将是命令行(而不是交互式),因此没有必要包含我不需要包含的库。 当直接使用套接字时,我只是通过包含套接字来获得ntohl 函数,但是在这里我不需要套接字。我没
我正在尝试使用 unix 套接字来测试将一些 udp 数据包发送到本地主机。 据我了解,在设置 ip 地址和端口以发送数据包时,我会将转换为网络字节顺序的值填充到我的 sockaddr_in 中。我在
我尝试在 C 语言的服务器应用程序中打印客户端端口。但是我得到客户端端口的负数,这是什么奇怪的行为:-/任何人都知道哪里可能有问题吗? 导致问题的部分代码: struct sockaddr_in cl
C# 中是否有网络到主机的转换函数?谷歌搜索并没有找到太多。 :P 最佳答案 IPAddress.HostToNetworkOrder和 IPAddress.NetworkToHostOrder ?
关于htonl和ntohl。这两行代码中的任何一行何时将计算为false。 htonl(x) == ntohl(x); htonl(ntohl(x)) == htonl(htonl(x)); 换句
当我查找 htonl 的示例时,它总是返回一个 uint32_t。但是,当我使用 Winsock2.h 在 VS2015 中调用 htonl 时,它返回一个 u_long。 在我的机器上,当我为 32
我需要在可能位于不同平台的服务器和客户端之间发送一个枚举缓冲区。 但是枚举的大小取决于平台,我应该调用哪个函数? (htons() 或 htonl()),例如以下枚举: typedef enum f_
函数 ntohl 为我提供了一个链接器错误: error LNK2001: unresolved external symbol _ntohl@4 fatal error LNK1120: 1 unr
我在小端 [LE] 机器 [Linux,英特尔处理器] 上运行了以下程序。我无法解释下面代码片段中的 3 个输出。由于机器是 LE,a 的值存储为 0x78563412。打印时,它显示的是它的实际值。
我是一名优秀的程序员,十分优秀!