【问题标题】:What is the purpose of GStack.HostToNetwork in Indy?Indy 中 GStack.HostToNetwork 的目的是什么?
【发布时间】:2021-06-03 13:46:28
【问题描述】:
我看到 Indy 默认情况下会隐藏必须以某种“网络格式”发送的数据,并在收到时将其转换回来。这样做有什么意义?在来自套接字的Write 和Read 之间,没有人使用那些只有“我”知道它们的含义的值。那么,位顺序有什么关系呢?我有自己的 TCP 服务器-客户端协议,我将命令的值和我发送的其他内容直接写入临时缓冲区。我想知道通过这些转换使我的协议复杂化是否有意义?
【问题讨论】:
标签:
delphi
indy
delphi-10.3-rio
【解决方案1】:
我看到 Indy 默认情况下会隐藏必须以某种“网络格式”发送的数据,并在收到时将其转换回来。这样做有什么意义?
并非所有平台都使用相同的字节序对多字节整数中的字节进行排序。有些平台是小端的,有些是大端的。为了促进跨平台共享整数,“网络字节顺序”被标准化为大端。因此,HostToNetwork() 会将多字节整数从调用平台的本地字节序转换为大字节序,NetworkToHost() 会将多字节整数从大字节序转换为调用平台的本地字节序。
在套接字的写入和读取之间,没有人使用那些只有“我”知道它们含义的值。那么,位顺序有什么关系呢?
如果您同时编写发送方和接收方,那么您当然可以使用任何您想要的字节序。但在通过网络连接传输整数时,习惯始终只使用大端序。也许有一天,您或其他人会为您的系统编写不同的发送者/接收者,甚至可能在另一个平台上。因此,如果您对整数使用标准化的字节序,则以后不必担心互操作性问题。
我有自己的 TCP 服务器-客户端协议,我将发送的命令和其他内容的值直接写入临时缓冲区。
当然,这只有在发送者和接收者使用相同的字节序表示内存中的整数时才有效。
我想知道通过这些转换使我的协议复杂化是否有意义?
进行字节序转换不会使任何事情复杂化,但确实可以保护它。