gpt4 book ai didi

c - sin_addr.s_addr = INADDR_ANY;需要 htonl 吗?

转载 作者:太空狗 更新时间:2023-10-29 23:18:02 26 4
gpt4 key购买 nike

我遇到了两个线程:

Socket with recv-timeout: What is wrong with this code?

Reading / Writing to a socket using a FILE stream in c

一个使用 htonl 而另一个不使用。

哪个是对的?

最佳答案

因为像 INADDR_LOOPBACK 这样的其他常量是按主机字节顺序排列的,我认为这个系列中的所有常量都应该应用 htonl,包括 INADDR_ANY.

(注意:我在@Mat 编辑时写了这个答案;他的答案现在也说最好保持一致并始终使用 htonl。)

基本原理

如果你这样写代码,对 future 的代码维护者来说是一种危险:

if (some_condition)
sa.s_addr = htonl(INADDR_LOOPBACK);
else
sa.s_addr = INADDR_ANY;

如果我正在审查这段代码,我会立即质疑为什么其中一个常量应用了 htonl 而另一个没有应用。我会将其报告为错误,无论我是否碰巧知道 INADDR_ANY 始终为 0,因此无法进行转换。

您编写的代码不仅要具有正确的运行时行为,还应该在可能的情况下显而易见并且容易让人相信它是正确的。出于这个原因,您不应删除 INADDR_ANY 周围的 htonl。我能看到的不使用 htonl 的三个原因是:

  1. 使用 htonl 可能会冒犯有经验的套接字程序员,因为他们知道它什么都不做(因为他们知道常量的值)。
  2. 省略它需要更少的输入。
  3. 虚假的“性能”优化(显然这无关紧要)。

关于c - sin_addr.s_addr = INADDR_ANY;需要 htonl 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15366764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com