套接字概念 Socket本身有“插座”的意思,在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。...既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。与管道类似的,Linux系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作一致。...区别是管道主要应用于本地进程间通信,而套接字多应用于网络进程间数据的传递。 套接字的内核实现较为复杂,不宜在学习初期深入学习。...套接字通信原理如下图所示: 在网络通信中,套接字一定是成对出现的。一端的发送缓冲区对应对端的接收缓冲区。我们使用同一个文件描述符索发送缓冲区和接收缓冲区。...一般其默认的存储位置:/usr/include/linux/in.h 文件中。
在Linux中,这一层通常与特定的网络接口卡(NIC)驱动程序相关联。 网络层:提供IP地址管理和路由功能,确保数据包能够正确地从一个网络传输到另一个网络。...Linux支持IPv4和IPv6两种IP协议版本。 传输层:提供端到端的通信服务,确保数据的可靠传输或快速、不可靠的传输。...3、端口号 端口号(port)是传输层协议的内容,是一个2字节16位的整数,端口号标识唯一进程,一个端口号只能被一个进程占用。 IP地址+端口号能够标识网络中的唯一进程。...IP + port 叫做套接字socket。...TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。 为使网络程序具有可移植性,使用样的C代码在大端和小端机器上编译后都能正常运行,可以调用下面库函数做网络字节序和主机字节序的转换。
*p); p++; } return 0; } 参考:http://zh.wikipedia.org/wiki/字节序
在刚刚结束的佛职院实训项目中,涉及有关网络编程的概念,有一两个同学在Q上问到字节序的问题,今天就这个话题,来详细聊聊字节序这个小鬼究竟是啥意思。...首先,所谓的字节序有两种情况:大端序和小端序,怎么个意思呢? 先来背两个单词:big endian 和 little endian。正是他们,分别被翻译为专业术语大端序和小端序。...注意到,对一个多字节变量的权位的不同解释方式,就是所谓字节序。...既然我们无法得知对方的的字节序,我们就做出如下规定:凡是向网络发送数据,一律转成大端序。 有了这个规定,通信双方就心里有谱啦!看我的手绘图: ?...例如,htons( )就是专门用来将本地主机16位短整型数据转化为网络字节序的。 现在,该明白什么是字节序,以及单机编程不需要考虑它,而网络编程需要考虑了吧。
1 字节序 字节顺序是指占用内存多于一个字节类型的数据在内存中的存放顺序,有小端、大端两种顺序。 BIG-ENDIAN:大端,将高字节数据存放在低地址处,低字节数据存放在高地址处。...注意:字节序是面向多字节类型定义的,比如2字节、4字节、8字节整型、长整型、浮点型等,单字节的字符串一般不用考虑。...3 网络字节序 网络字节序是指数据在网络上传输时是大端还是小端的,在Internet的TCP/IP协议规定了一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释...网络字节顺序采用 大端 字节序。 4 Java字节序 JAVA字节序指的是在JAVA虚拟机中多字节类型数据的存放顺序,JAVA字节序也是 大端 字节序。...、ByteBuffer等于字节序相关的类,我们也可以改变JVM中默认的字节序。
1.网络字节序与主机字节序 在Linux网络编程中,经常碰到网络字节序与主机字节序的相互转换。说到网络字节序与主机字节序需要清晰了解以下几个概念。 字节序,顾名思义,指字节在内存中存储的顺序。...下面以32位位宽数值0x12345678为例,小端字节序与大端字节序具体的存储区别如下所示: image.png 主机字节序,即CPU存储数据时采用的字节顺序。...不同的CPU设计时采用的字节序是不同的,谈到字节序的问题,必然牵涉到两大CPU派系。...2.网络字节序与主机字节序的相互转换 2.1常用系统调用 Linux socket网络编程中,经常会使用下面四个C标准库函数进行字节序间的转换。...高低位 [2]htonl(3) - Linux man page [3]如何在C ++中的big-endian和little-endian值之间进行转换?
超过一个字节的数据在内存中存储时,就有存储顺序的问题,按照不同的存储顺序分为大端字节序存储和小端字节序存储。 大端(存储)模式: 是指数据的低位存储在高地址处,高位存低地址处....VS中的存储模式 int main() { int n = 0x11223344; return 0; } 调试这行代码: 由图中可以看出VS是小端字节序存储 3.设计一段代码判断当前机器的字节序
查看这些函数的解析,会发现这些函数其实是与主机字节序和网络字节序之间转换有关。就是什么网络字节序,什么是主机字节序呢?...,htonl函数的作用是把一个主机字节序转换为网络字节序,也就是上面转换过程中第二步转换为第三步的作用,127.0.0.1的主机字节序是2130706433,把主机字节序2130706433转换为网络字节序就是...下面再看端口的主机字节序与网络字节序的转换。以6000端口为例。...更多字节序介绍,请参见: 字节序问题--大端法小端法 字节序(Endian),大端(Big-Endian),小端(Little-Endian) API SOCKET基础 (一) TCP建立连接并通信 (...二) UDP通信 (三) 网络字节序与主机字节序的转换 (四) TCP SOCKET recv的内存情况 (五) 异步套接字 (六) CAsyncSocket 与 CSocket 转载声明: 本文转自
思路 知识点分析:大端字节序和小端字节序 大端字节序(Big Endian)和小端字节序(Little Endian)是计算机系统中两种不同的字节序(Byte Order)排列方式,用于表示多字节数据(...字节序的应用场景 硬件层面: 大端字节序:许多早期的计算机架构(如IBM 360系列、Motorola 68000系列)以及一些嵌入式系统采用大端字节序。...网络通信: 网络协议(如TCP/IP)通常使用大端字节序来传输数据,以保证不同字节序的设备之间能够正确解析数据。因此,小端字节序的设备在发送或接收网络数据时,需要进行字节序转换。...使用库函数:如在C语言中,可以使用ntohl(网络字节序转主机字节序)和htonl(主机字节序转网络字节序)等函数。 硬件支持:某些处理器(如ARM架构)支持在硬件层面切换字节序模式。...总结 大端字节序和小端字节序是计算机系统中两种重要的字节序排列方式。 大端字节序更符合人类的阅读习惯,常用于网络协议; 小端字节序则在某些硬件架构中效率更高,常用于现代个人计算机。
一、字节序计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)比如数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11。...大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。...二、为什么会有小端字节序答案是,计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。但是,人类还是习惯读写大端字节序。...如果是大端字节序,先读到的就是高位字节,后读到的就是低位字节。小端字节序正好相反。四、总结"只有读取的时候,才必须区分字节序,其他情况都不用考虑。"...处理器读取外部数据的时候,必须知道数据的字节序,将其转成正确的值。然后,就正常使用这个值,完全不用再考虑字节序。即使是向外部设备写入数据,也不用考虑字节序,正常写入一个值即可。
在跨平台和网络编程中我们经常会提到网络字节序和主机字节序,如果没有正确对两者进行转换,从而导致两方产生了不同的解释,就会出现意想不到的bug。...目录 0x01 概念 0x02 分类 0x03 两种字节序之间的区别 0x01 概念 字节序,就是大于一个字节类型的数据在内存中的存放顺序。...注:网络字节序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释,网络字节序采用大端排序方式。...0x02 分类 字节序经常被分为大端和小端两种 Big-Endian(大端):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。...0x03 两种字节序之间的区别 通常我们的主机字节序是小端字节序,网络字节序是大端字节序,但是为什么要进行转换呢,如果不转换的话会发生什么,我们这里用一个不是很恰当的方式来解释一下。
计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。...同理,0x1234567的大端字节序和小端字节序的写法如下图。 ? 2. 我一直不理解,为什么要有字节序,每次读写都要区分,多麻烦!统一使用大端字节序,不是更方便吗?...但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。 4. 计算机处理字节序的时候,不知道什么是高位字节,什么是低位字节。...如果是大端字节序,先读到的就是高位字节,后读到的就是低位字节。小端字节序正好相反。 理解这一点,才能理解计算机如何处理字节序。 5....字节序的处理,就是一句话: "只有读取的时候,才必须区分字节序,其他情况都不用考虑。" 处理器读取外部数据的时候,必须知道数据的字节序,将其转成正确的值。
字节序 字节序分为大端字节序(big endian)和小端字节序(little endian)....大端字节序是指一个整数的高位字节存储在内存的低地址处, 小端字节序是指一个整数的高位字节存储在内存的高地址处....我们可以通过下面的方式去查看本机的字节序. union { char a[4]; int b; } 现在的PC大多采用小端字节序, 因此小端字节序也被称为主机字节序....所以我们约定在网络中传递的时候都是使用大端字节序, 因此大端字节序也被称为网络字节序, 他给所有接受数据的主机提供了一个正确解释收到的格式化数据的保证....Linux提供了如下的四个函数来完成主机字节序和网络字节序之间的转换: #include unsigned long int htonl(unsigned long int
字节序这前后颠倒的问题 涉及到 一个东西叫做字节序byte order添加图片注释,不超过 140 字(可选)这些可选的修饰字符 暗示字节的次序字节次序有两种符号英文名称中文名称节序>big-endian大字节序添加图片注释,不超过 140 字(可选)把这个修饰字节序的字符放在类型h(short)前面 h : big-endian...最低有效位(least significant byte)放在低地址 a添加图片注释,不超过 140 字(可选)这是目前常用的指令集架构 ($x86、x86-64$) 用的字节序 CISC(复杂指令集...)落在高地址添加图片注释,不超过 140 字(可选)这是目前 RISC 指令集架构 (RISC、MIPS) 用的字节序 也是我们看起来比较顺的字节序这两个单词怎么来的呢?...python默认字节序添加图片注释,不超过 140 字(可选)python默认用 小端字节序添加图片注释,不超过 140 字(可选)生活细节除了磕鸡蛋之外 鸡蛋放置也很有讲究添加图片注释,不超过
linux因此设计了一个结构体 如下代码 /** * struct sk_buff - socket buffer * @next: Next buffer in list * @prev...unsigned char *head, *data, *tail, *end; }; 套接字换从区在各个层交换数据
字节序列操作函数 字符串是以\0(即NUL)结尾的一串字符指针。所以一个字符串内部不可能包括任何NUL字符,但是,非字符串数据内部包含NUL的并不罕见。...不过"mem"家族的函数给了我们几大帮助,它们能处理任意的字节序列,是对内存的直接操作。
sample = '1\xbc\xb2\u0969\u136b\u216b\u2466\u2480\u3285'
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节.不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据;如果当前发送主机是小端, 就需要先将数据转成大端...为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。...例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。...如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回; 如果主机是大端字节序,这些 函数不做转换,将参数原封不动地返回。...,type表示套接字的服务类型,第三个参数填0,参数填好就能确定是udp套接字。
各种socket地址结构体的开头都是相同的,对于unix 的某些实现来说 前8位表示整个结构体的长度,后8位表示地址类型,而Linux就没有长度字段,前2个字节都是地址类型。...printf("%x %x %x %x\n", p[0], p[1], p[2], p[3]); return 0; } 输出为: simba@ubuntu:~/Documents/code/linux_programming... addr; printf("%s\n", inet_ntoa(ipaddr)); return 0; } 输出为: simba@ubuntu:~/Documents/code/linux_programming...四、套接字类型 流式套接字(SOCK_STREAM) 提供面向连接的、可靠的数据传输服务,数据无差错,无重复的发送,且按发送顺序接收。 数据报式套接字(SOCK_DGRAM) 提供无连接服务。...原始套接字(SOCK_RAW) 参考: 《Linux C 编程一站式学习》 《TCP/IP详解 卷一》
: 0x" << setfill('0') << setw(8) << wp_ori.ID << endl; cout 节序后: 0x" <...<setfill('0') << setw(8) << wp.ID <<endl; cout << endl; cout 节序前:...0x" << setfill('0') << setw(8) << wp_ori.Num << endl; cout 节序后: 0x" <<...setfill('0') << setw(8) << wp.Num << endl; cout << endl; cout 节序前...: 0x" << setfill('0') << setw(8) << wp_ori.Type << endl; cout 节序后: 0x"
领取专属 10元无门槛券
手把手带您无忧上云