我已经阅读了关于htons
、htonl
、ntohl
和ntohs
的用法的this explanation和this manual page,但是我仍然不完全理解它们的用法(我对socket API和网络编程基本上是新手)。我确实了解小端和大端以及字节顺序,但我不确定如何在聊天应用程序代码中正确实现这些功能,以便它在不同的机器上一致地工作(其中一台机器使用大端,另一台使用很少)。
与我的具体情况有关;我有一个(几乎)完全工作的聊天应用程序,刚刚使用了htons
,但经过一些研究,这似乎是不可靠的。我意识到this question看起来很相似,但是在这里我要问一个实现示例,我已经知道这些调用的基本功能。
最佳答案
其思想是对整数类型有一些通用的表示。TCP/IP使用NBO,网络字节顺序。不管它是什么(大的或小的尾数或更奇异的)发送16位整数或32位整数的方法是在发送这样的数据之前使用htons
或htonl
。然后在接收时,您必须用ntohs
和ntohl
将其转换回主机表示:
发送方希望发送值uint32_t a
,然后发送由htonl(a)
返回的数据,例如d。
接收器获取d
,应用ntohl(d)
并获得正确的uint32_t
值。
这些只是编码/解码功能。发送方发送代码(v),然后接收方得到解码(代码(v))!你不必知道什么代码(v)等于(没有兴趣)。
如果你觉得它不可靠,那是因为你没有按原样使用它。