【发布时间】:2017-01-07 19:54:42
【问题描述】:
我已经阅读了this explanation 和this manual page 关于htons、htonl、ntohl 和ntohs 的用法,但是我仍然不完全了解它们的用法(我对套接字很陌生API 和一般的网络编程)。我确实了解大小端序和字节顺序,但我不确定如何在我的聊天应用程序代码中正确实现这些功能,以便它在不同的机器上始终如一地工作(其中一台使用大端序而另一台使用很少)。
我的具体情况的一点背景;我有一个(几乎)可以正常工作的聊天应用程序,并且刚刚使用htons,但经过一些研究,这似乎是不可靠的。我意识到this question 可能看起来很相似,但是我在这里询问一个实现示例,我已经知道这些调用的基本功能。
【问题讨论】:
-
“但经过一些研究,这似乎是不可靠的” 不确定您的意思。请解释一下。
-
我并不是说这个函数不可靠,我的意思是如果我不使用正确的函数,那么我的程序可能会发送意外数据(错误的字节顺序)。如果我错了,请纠正我,但在我提供的第一个链接上,它是这样说的:“结果是,如果您将一个两字节的短整数从 Intel 机器发送()到 Mac(之前它们也变成了英特尔盒子,我的意思是),一台计算机认为是数字 1,另一台计算机认为是数字 256,反之亦然。"
-
当您要通过网络从您的主机发送数据时,您可以使用 hton* 进行准备。当您从网络接收到主机的数据时,您使用 ntoh*。如果数据位于
short(或更准确地说,int16_t)中,则选择s版本;如果是long,则选择l变体。这有什么令人困惑的? -
感谢您解决这个问题。愚蠢的问题,但我应该将它用于所有传输(例如,当我发送任何数据时),因为目前我使用 htons 的唯一实例是将端口号(5000)放入我的 sockaddr_in 结构的 sin_port诠释?
-
所以如果我有一个结构体,声明如下:
sockaddr_in server;然后inet_pton(AF_INET, "127.0.0.1", &server.sin_addr.s_addr);分配IP,然后server.sin_port = 5000分配端口,我想更改IP 参数吗在inet_pton到htonl("127.0.0.1"),端口设置到htons(5000)?如果是这样,为什么该结构完全通过网络发送?知道服务器详情不只是供客户端使用吗?
标签: c sockets network-programming