recv()和send()会自动转换网络顺序格式的消息吗?

Kin*_*ing 7 c sockets recv

我是套接字编程的新手.我发现在发送消息之前,我们必须将主机字节顺序转换为网络字节顺序.我已经看了很多站点上给出的例子,但是在发送消息之前没有人将消息更改为网络字节顺序.只有在struct sockaddr_in的变量中设置值时才使用此字节顺序更改(如果是端口号,则为ip地址).

例如: -

sock_addr.sin_port=htons(12000) 
Run Code Online (Sandbox Code Playgroud)

要么

sock_addr.sin_addr.s_addr=htonl(INADDR_ANY) 
Run Code Online (Sandbox Code Playgroud)

等等

为什么在send()或recv()发送或接收消息的情况下,他们不使用此hton或ntoh?这些函数是否自动执行字节顺序转换?

这个问题可能很愚蠢.但请帮助我,我完全糊涂了.

Joh*_*n C 4

有几个原因,其中大部分都是“他们很懒”的变体。

  • 首先,您可能不需要接触端口号和关联的整数。它们是整数。它们被处理器视为整数,并且只有主机使用该数字,因此它始终是正确的。事实上,如果两台具有不同字节顺序的计算机按照您引用的方式打开端口 12000,它们将无法连接,因为htons(12000)12000在一台计算机上 ( 0x2EE0) 而57390在另一台计算机上 ( 0xE02E)。

  • send()通常,示例使用和将 ASCII 字符串从客户端传递到服务器(反之亦然)recv(),不需要与网络字节顺序之间的转换,因为每个字符都适合一个字节;请记住,这些宏更改了字节顺序,因此一个字节就是一个字节。但是,如果您发送更大的数据,您绝对应该“外部化”您的数据。

  • 最后,如果您可以保证每个人都在具有相同架构的处理器上运行,那么从技术上讲您不需要网络排序,因为两个处理器都会读取相同的字节顺序。请不要依赖于此,但如果您在没有转换的情况下进行测试并且一切正常,那就是原因。

正确的行为是,如果您要在程序之外发送整数,则应该首先使用htons()or 。htonl()如果您收到整数,则应该使用ntohs()or ntohl()。程序中的任何内容或占用一个字节的内容,您都可以保留。

如果语言使用相同的编码(即类似 C 的、以 -NULL结尾的字符串或 IEEE 754 浮点数),则无需考虑其他任何内容。如果没有,您需要编写代码来外部化数据或使用 RPC 或 CORBA 等库。