主要涉及到大端小端模式

    关于大小端,网络字节序什么的,搜索一下,相关资料很多的

    这里主要给之前主要思考的问题做个收尾,记录一下,同时若有错,也希望给予纠正

    

     问题:网络传输的过程中使用的是大端模式,我在建立socket时,目的方的ip地址和port的表示都要转化成大端模式,那么我一般在发送数据的时候都没有调用htonl之类的函数,这是为什么呢?是socket在里面已经自动帮我们把数据转化成大端模式了吗?

     

      答: 在传输数据的时候,我们一般传的都是char数组,或者byte数组,也就是一般我们在传输数据的时候都是先把int,float等类型的数据转化成char数组然后再进行发送的。

      假如我们要传一个int a = 1;

       在c++里面,也许我们会这样做, memcpy(buf,a,sizeof(int)); 把a转化成buf数组,然后再将buf数组通过

socket发送到接收端。假如buf里面的数据依次是2,3,4  那么 接收端收到的数据也是2,3,4。 所以传输数据根本就没涉及到是大小端的问题,因为它都不需要去解释你数据的含义。

 

     但是我们在将数据转化成char数组,再将char数组转化成数据的时候就要考虑大小端问题,这里与传输过程无关了。

    一边都于出现在接收端和发送端两边采用的字节序模式有关。

    假设你要在小端系统里面传输数据 Ox12345678 (内存地址中表示0:78,1:56,2:34,3:12),那么首先将它用memcpy拷贝到char数组buff中得到:buff[0] = Ox78,     buff[1] = Ox56,    buff[2]=Ox34    ,    buff[3]=Ox12; 

     通过socket传输到大端系统那么得到的buff数组和原来的一样,buff[0]=Ox78.......但是

     这时候你还要用memcpy把它还原回去,内存地址表示(0:78,1:56,2:34,3:12)这时候按照大端模式解释

     得到的应该就是Ox78563412  也就出现了数据传输不一致的问题。

 

    如果在小端系统里面事先进行大端转换,那么原来的数据就会在小端系统变成Ox78563412(内存地址0:12 1:34 2:56 3:78) 然后进行传输 大端系统收到数据然后memcpy回去之后得到的变量的内存地址表示就是0:12 1:34 2:56 3:78 ,按照大端模式进行解释即可得到 Ox12345678  这样传输就正确了。

 

            

  

     懒得画图 都是文字 看起来比较吃力 见谅:)