要创建packet socket
,以下socket()
函数调用被使用(插座类型和协议可以是不同的):为什么在创建包套接字时使用htons()指定协议?
socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
而创建stream socket
,下面的调用用于:
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
我的问题是为什么在创建packet socket
时使用htons()
指定协议,而不是在创建AF_INET or AF_INET6
家族的套接字时指定协议?为什么不使用
socket(AF_INET, SOCK_XXX, htons(IPPROTO_XXX))
创建一个流或数据报套接字作为创建packet socket
或反之亦然时使用。在socket()函数的两个调用中使用协议有什么不同,因为这两个调用都用于创建套接字,一个用于数据包套接字,另一个用于TCP层的套接字?
Ethernet *和* IP *标头的在线格式*称为网络字节顺序(正如我在第二段中所解释的)。你可以把你想要的任何顺序“在电线上”。 –
对于第1段,考虑到ETH_P_XXX值是“与传入数据包的比较”,那么为什么IPPROTO_XXX值没有转换为网络字节顺序。我明白第二段给出了上述问题的原因,即不同的协议族可以选择以对其有意义的形式来解释协议。那么这是否意味着它是功能开发人员的决定,因为他可以选择将函数内部的协议转换?对于第三段,协议号是作为int传递的,所以字节顺序确实有意义。如果我错了,请纠正。 – rht
这样想:如果你在小端机器上比较两个16位值。有两种比较方法:(a)逐字节比较它们在存储器中出现的顺序,(b)将16位单元加载到寄存器中,然后进行比较。另一方面,对于单字节值,这两种方式都是相同的。 –