zPr*_*mer 5 c c++ sockets endianness
我有一个关于字节序的一般概念性问题,以及它如何影响使用C/C++的tcp套接字通信.这是一个例子:
您有两个与tcp套接字通信的服务器,一个使用大端和另一个小端.如果你通过套接字从一个服务器向另一个服务器发送一个整数,我理解字节排序是相反的,整数将不会打印预期的内容.正确?我看到某个地方(我找不到哪里),如果你在套接字上发送一个字符串,则不会改变该值并按预期打印.它是否正确?如果是这样,为什么?我觉得我以前做过这个,但我可能会妄想.
有人可以为我清楚吗?
谢谢.
编辑:是因为char只有1个字节?
考虑每种数据类型的大小.
整数通常是四个字节,您可以将其视为四个单独的字节并排.体系结构的字节顺序决定了最重要的字节是四个字节中的第一个字节还是最后一个字节.但是,char只有一个字节.据我所知,字节顺序不会影响每个字节中位的顺序(请参阅维基百科关于Endianness的页面上的图像).
但是,char只有一个字节,因此没有替代顺序(假设我是正确的,不通过字节序修改位).
如果通过套接字发送一个字符,它将在两台机器上都是一个字节.如果你通过套接字发送一个int,因为它是四个字节,根据字节顺序,一台机器可能会以不同的顺序解释字节.您应该设置一种简单的方法来测试它并获得一些结果!
您可以通过 TCP 套接字发送的唯一内容是字节。如果不先为该整数创建一些字节表示,就不能通过 TCP 套接字发送整数。C/C++ 类型integer可以以平台喜欢的任何方式存储在内存中。如果这恰好是您需要通过 TCP 套接字发送它的形式,那么没问题。但如果不是,那么您必须在发送之前将其转换为协议要求的格式,并在收到之后转换为您的本机格式。
有点草率的比喻,请考虑一下我与您交流的方式。我的母语可能是西班牙语,谁知道我脑子里在想什么。在内部,我可能将数字 3 表示为“tres”或某种奇怪的神经元模式。谁知道?但是,当我与您交流时,我必须将数字 3 表示为“3”或“3”,因为这是您和我已同意的协议,即英语。因此,除非我是一个糟糕的英语使用者,否则我如何在内部存储数字 3 不会影响我与您的交流。
由于该组需要我生成英文字符流来与您交谈,因此我必须将内部数字表示转换为英文字符流。除非我不擅长这样做,否则我在内部存储数字的方式不会影响我生成的英文字符流。
所以除非你做愚蠢的事情,否则这永远不会重要。由于您将通过 TCP 套接字发送和接收字节,因此integer类型的内存格式无关紧要,因为您不会发送或接收 C/C++integer类型的实例,而是逻辑整数。
例如,如果您通过 TCP 发送的数据的协议规范说您需要以小端格式发送一个四字节整数,那么您应该编写代码来执行此操作。如果代码考虑了您平台的字节序,那将纯粹是一种不应影响代码行为的优化。