Joh*_*nck 35
由于其他常量类似于INADDR_LOOPBACK主机字节顺序,我提交此系列中的所有常量应该已htonl应用于它们,包括INADDR_ANY.
(注意:我在@Mat编辑时写了这个答案;他的答案现在也说最好是保持一致并且总是使用htonl.)
合理
如果您这样编写代码,则对代码的未来维护者构成危害:
if (some_condition)
sa.s_addr = htonl(INADDR_LOOPBACK);
else
sa.s_addr = INADDR_ANY;
Run Code Online (Sandbox Code Playgroud)
如果我正在审查这段代码,我会立即质疑为什么其中一个常量已htonl应用而另一个未应用.而且我会将其报告为一个错误,无论我是否碰巧拥有INADDR_ANY始终为0 的"内部知识",因此将其转换为无操作.
您编写的代码不仅仅是关于具有正确的运行时行为,还应该在可能的情况下显而易见,并且容易相信它是正确的.出于这个原因,你不应该剥离htonl周围INADDR_ANY.不使用htonl我可以看到的三个原因是:
htonl因为他们知道它什么都不做(因为他们知道心脏的常数值).Mat*_*Mat 18
INADDR_ANY是IPV4中的"任何地址".该地址0.0.0.0以点分表示,因此0x000000在任何字节序的十六进制中.通过它htonl没有任何影响.
现在,如果您想了解其他宏常量,请查看INADDR_LOOPBACK它是否在您的平台上定义.有可能是这样的宏:
#define INADDR_LOOPBACK 0x7f000001 /* 127.0.0.1 */
Run Code Online (Sandbox Code Playgroud)
(来自linux/in.h,等效定义winsock.h).
因此INADDR_LOOPBACK,有htonl必要.
为了保持一致性,因此可以更好地htonl在所有情况下使用.
无论是正确的,因为有义INADDR_ANY和htonl被弃用,导致复杂的,丑陋的代码仅适用于IPv4.切换到getaddrinfo用于满足所有套接字地址创建需求:
struct addrinfo *ai, hints = { .ai_flags = AI_PASSIVE|AI_ADDRCONFIG };
getaddrinfo(0, "1234", &hints, &ai);
Run Code Online (Sandbox Code Playgroud)
替换"1234"为您的端口号或服务名称.
| 归档时间: |
|
| 查看次数: |
41845 次 |
| 最近记录: |