URL 中使用的端口字节顺序是什么?
What port byte order is used in URL?
当你想绑定到 C 中的端口时,你必须使用 htons(port)
将端口从主机字节顺序转换为网络字节顺序。发生这种情况是因为端口号被直接复制到 TCP 数据包,因此它们必须在小端和大端机器上匹配。
考虑以下 C:
中的示例
int port = 5000;
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(port);
注意 htons
的使用。现在,如果您 运行 netstat -anp --tcp
(在 Linux 上),您会看到正在收听 0.0.0.0:5000
。看起来端口号使用主机字节序。
现在,一个问题出现了:如果端口号在URL中是host-endian,这是否意味着big-endian客户端不能使用http://a.b.c.d:5000
URL连接监听 0.0.0.0:5000
?
的小端服务器
不,您几乎可以肯定在错误的抽象级别错误地应用了规则。
本地浏览器很可能会抓取 URL 末尾的 :5000
字符串 并使用它来创建整数 5000
格式为 host。然后它会将其传递给 htons
作为构建会话的一部分,其方式与您的代码片段完全相同。
而且,瞧,这些结构包含正确的网络顺序。
当你想绑定到 C 中的端口时,你必须使用 htons(port)
将端口从主机字节顺序转换为网络字节顺序。发生这种情况是因为端口号被直接复制到 TCP 数据包,因此它们必须在小端和大端机器上匹配。
考虑以下 C:
中的示例int port = 5000;
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(port);
注意 htons
的使用。现在,如果您 运行 netstat -anp --tcp
(在 Linux 上),您会看到正在收听 0.0.0.0:5000
。看起来端口号使用主机字节序。
现在,一个问题出现了:如果端口号在URL中是host-endian,这是否意味着big-endian客户端不能使用http://a.b.c.d:5000
URL连接监听 0.0.0.0:5000
?
不,您几乎可以肯定在错误的抽象级别错误地应用了规则。
本地浏览器很可能会抓取 URL 末尾的 :5000
字符串 并使用它来创建整数 5000
格式为 host。然后它会将其传递给 htons
作为构建会话的一部分,其方式与您的代码片段完全相同。
而且,瞧,这些结构包含正确的网络顺序。