【发布时间】:2017-05-31 03:07:51
【问题描述】:
我正在学习套接字编程,我对我的学习材料中 htons() 和函数系列的使用不一致感到困惑。我目前正在阅读this site,它具有以下代码段:
001 1: struct sockaddr_in adr_inet;
002 2: int adr_len;
003 3:
004 4: memset(&adr_inet,0,sizeof adr_inet);
005 5:
006 6: adr_inet.sin_family = AF_INET;
007 7: adr_inet.sin_port = ntohs(0);
008 8: adr_inet.sin_addr.s_addr = ntohl(INADDR_ANY);
009 9: adr_len = sizeof adr_inet;
在同一个著名站点的下一个示例具有以下代码段:
030 30: struct sockaddr_in adr_inet;/* AF_INET */
...
042 42: /* Create an AF_INET address */
043 43: memset(&adr_inet,0,sizeof adr_inet);
044 44:
045 45: adr_inet.sin_family = AF_INET;
046 46: adr_inet.sin_port = htons(9000);
047 47: memcpy(&adr_inet.sin_addr.s_addr,IPno,4);
048 48: len_inet = sizeof adr_inet;
049 49:
050 50: /* Now bind the address to the socket */
051 51: z = bind(sck_inet,
052 52: (struct sockaddr *)&adr_inet,
053 53: len_inet);
问题:
为什么ntohs()第一次用在adr_inet.sin_port上,而htons()用第二次?
问题:
为什么adr_inet.sin_family 上既没有使用ntohs() 也没有使用htons()?
注明的网站没有解释为什么 ntohs() 或 htons() 在各自的示例中被使用;它只说“注意使用”所述功能。
我了解字节顺序,并且网络字节顺序是大端顺序。我的问题更多是关于您何时需要struct sockaddr_in 的网络成员与主机字节顺序?在第二个代码示例中,.sin_port 在传递给bind() 之前设置为网络字节顺序。我可以看到以网络或主机字节顺序将数据传递给该函数的情况:bind() 是一个“网络相关”函数,因此它可能需要以网络字节顺序的数据;另一方面bind()是在主机上执行的,那为什么不接受主机字节序的数据呢?
【问题讨论】:
-
((我建议你阅读
getaddrinfo()以编写更现代的C))
标签: c sockets endianness