首页 > 编程语言 >【c&c++】socket编程中的 htons()

【c&c++】socket编程中的 htons()

时间:2023-01-10 17:11:06浏览次数:55  
标签:socket 主机 c++ 内存 序号 htons 数据 字节


  在刚刚接触 socket 时,遇到了 htons() 函数,就直接懵逼了,这是什么东西,有什么用?就查了一些资料。
  htons() 是网络字节序与主机字节序之间转换的函数。用生活中的例子来说,有一串数字 12345678 现在我们是从左往右读的,以前的人是从右往左读的。当你要给以前的人读的话就要把这串数据写成 87654321 。htons() 就是类似要完成这个转换的功能

1.内存存储数据的方式

  大于一个字节的数据在内存中有存放的顺序,一个字节的数据没有顺序的问题。存放的顺序就叫做字节顺序。

  那么在内存中存放大于一个字节的数据的方式有哪些?或者说顺序有哪些。内存中存储的方法有两种:小端字节序(little-endian)和大端字节序(big-endian)

1.1 数据字节序号

  低序字节,就是一个数据的低序号字节。比如说一个数据是这样的 0x12345678 ,它是一个32位(4个字节)的整数数据。就是把这个数据放在4个字节里面。如下图

 

 

  12 是放在第一个字节里面的,第一个字节是高序号。第二个,第三个,第四个字节的序号依次降低。存放 78 的字节是最低序号。

 

1.2 小端字节序

  小端字节序——将低序字节存储在内存起始地址。用这个数据来说就是先存 78 ,然后存 56 ,接着存 34 ,最后存12。

 

 

1.3 大端字节序

 先将高序号的字节数据存入内存的起始地址。12 是存在高序号的字节里面,先将 12 存入内存的起始位置,接着是 34 ,56 ,78。

 

 

2. 转换顺序

  这两种字节序之间没有标准可循,两种格式都有系统使用。比如,Inter x86、ARM核采用的是小端模式,Power PC、MIPS UNIX和HP-PA UNIX采用大端模式。

2.1 网络字节序

  网络字节序:网络字节序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节序采用大端(big endian)排序方式。

2.2 主机字节序

  主机字节序:不同的机器主机字节序不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。

2.3 转换函数

  由于不同的机器主机字节序不同原因不同体系结构的机器之间无法通信,所以要转换成一种约定的字节序,也就是网络字节序。即使是同一台机器上的两个进程(比如一个由C语言,另一个由Java编写)通信,也要考虑字节序的问题(JVM采用大端字节序)。

  网络字节序与主机字节序之间的转换函数: htons()…ntohs)…htonl()、ntohl).htons和ntohs完成16位无符号数的相互转换,htonl和ntohl完成32位无符号数的相互转换。host to network short long

【参考链接】

htons(ntohs)再分析

htons/ntohs、inet_aton/inet_ntoa、inet_pton/inet_ntop函数详解

   

 

标签:socket,主机,c++,内存,序号,htons,数据,字节
From: https://www.cnblogs.com/opensmarty/p/17040812.html

相关文章

  • C++ 中的 const 限定符
    const需要与“常量”这个说法做一个区分。const就是const,常量是常量,有时候可以通用,但有时候又不能混淆。const限定符const修饰的对象的值不能被改变。可以用来提......
  • C++笔试题汇总二
    C++笔试题一1.以下三条输出语句分别输出什么?[C易]charstr1[]="abc";charstr2[]="abc";constcharstr3[]="abc";constcharstr4[]="abc";constchar*str5......
  • 为什么C++难?
    C++难就难在:在C++中你找不到任何一件简单的事。C++学习经历:1个月:都说C++难,但聪明如我,一个月就读完了C++primer,我看这C++也不过如此.3个月:原来之前一直在用C++语......
  • C++ 图进阶系列之纵横对比 Bellman-Ford 和 Dijkstra 最短路径求解算法
    1.前言因无向、无加权图的任意顶点之间的最短路径由顶点之间的边数决定,可以直接使用原始定义的广度优先搜索算法查找。但是,无论是有向、还是无向,只要是加权图,最短路径长......
  • C和C++的相似而又不同(基础篇)
    前言C语言是C++的基础,在学习C语言的时候我们可以很自然地过渡到C++中,但是尽管它们如此相似,但在某些方面如果搞不清楚可能会引发致命的问题。由标题可知,这一篇我们来讨论C......
  • 【c&c++】C语言 带参数的#define中#和##的基本用法
    1、单#的作用是把参数变成字符串;2、##的作用是连接组合参数名字;废话不多说,看个简洁的例子就明白了#include<iostream.h>usingnamespacestd;#defineTEST0(arg)cou......
  • [C++] std::thread 使用重载函数
    出错代码#include<thread>#include<iostream>#include<utility>#include<vector>#include<string>charreadProcTask(conststd::string&cmd,structtimespe......
  • bzip2 C/C++ 库bzlib.h使用案例:使用实用函数进行压缩/解压缩
    bzip2提供了底层接口,高级接口以及两个实用函数(Utilityfunctions),这两个实用函数在无stdio的环境中也可以使用,它们分别是BZ2_bzBuffToBuffCompress和BZ2_bzBuffToBuffDecomp......
  • Python socket详解
    目录网络编程1.基本概念Python中的网络编程网络编程1.基本概念1.什么是客户端/服务器架构?服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”......
  • java socket通信
    1.socket通信模型2.代码示例2.1服务端packagecom.java4all.controller;importjava.io.*;importjava.net.ServerSocket;importjava.net.Socket;/***Author:yunqing*......