一、数据存储顺序:大端和小端

大端模式: 地址的增长顺序与值的增长顺序相反

        小段模式: 地址的增长顺序与值的增长顺序同样

为什么会有大小端模式之分呢?这是由于在计算机系统中,我们是以字节为单位的。每一个地址单元都相应着一个字节。一个字节为8bit。可是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看详细的编译器)。另外。对于位数大于8位的处理器。比如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必定存在着一个假设将多个字节安排的问题。

我们经常使用的X86结构是小端模式,而KEIL C51则为大端模式。非常多的ARM。DSP都为小端模式。

有些ARM处理器还能够由硬件来选择是大端模式还是小端模式。

所以,主机字节顺序是小端模式。网络字节顺序是大端模式。

在C语言中。不同于结构体,共用体(联合体)中的几种不同类型的变量存放在同一段内存单元中。

利用这一特点,能够用联合体变量推断ARM或X86环境下。存储系统是是大端还是小端模式。

#include "stdio.h"
int main()
{
union w
{
int a; //4 bytes
char b; //1 byte
} c;
c.a=1;
if (c.b==1)
printf("It is Little_endian!\n");
else
printf("It is Big_endian!\n");
return 1;
}

说明:

1 若是小端模式,由低地址到高地址c.a存放为0x01 00 00 00。c.b被赋值为0x01;

————————————————————————————

地址 0x00000000 0x00000001 0x00000002 0x00000003

  c.a 01                  00                00                00

  c.b 01                  

————————————————————————————

2 若是大端模式,由低地址到高地址c.a存放为0x00 00 00 01,c.b被赋值为0x0;

————————————————————————————

地址 0x00000000 0x00000001 0x00000002 0x00000003

  c.a 00                 00                 00                 01

  c.b 00                  

————————————————————————————

字节序的处理

由于存在大端小端的问题,所以就要进行统一的转换。

注意字符串是不用转换的,由于一个字符正好占一字节。存储顺序不影响值。

而浮点数也不用转换,由于浮点数的读取规则是在cpu中定义的,是一致的。

转换所用的函数为:

htons(),htonl();         主机转为网络字节序。s为short , l为long

ntohs(),ntohl();         网络转为主机字节序。

二、地址格式的转换

通常情况下。都是用点分十进制(如:202.134.23.145)来表示IP地址。是个字符串。可是程序中处理时用到的是一个二进制的值。所以要进行转换。

详细的有四个函数:

#include<stdio.h>
#include<stdlib.h>
#include<netinet/in.h> int main(){
//ip地址字符串
char* sa="202.30.45.11";
//记录ip地址的结构体
struct in_addr addr,ret;
//是网络地址类型
in_addr_t at;
//将点分十进制字符串转换为32位网络字节序的IP
at=inet_addr(sa);
//十六进制输出
printf("inet_addr:0x%x \n",at);
//将点分十进制字符串转换为32位主机字节序。与网络字节序应该是反过来的
printf("inet_network:0x%x \n",inet_network(sa));
//结构体中记录IP地址的数据成员
addr.s_addr=at;
//网络字节序转换为点分十进制数
printf("inet_ntoa:%s \n",inet_ntoa(addr));
//点分十进制数转换为网络字节序,參数为结构体
inet_aton(sa,&ret);
printf("inet_aton:0x%x \n",ret.s_addr);
}

执行结果:

[localhost 400]$ ./addr
inet_addr:0xb2d26ca
inet_network:0xca262d0b
inet_ntoa:202.30.45.11
inet_aton:0xb2d26ca
[localhost 400]$

Linux网络编程(一)基础的更多相关文章

  1. 【深入浅出Linux网络编程】 “基础 -- 事件触发机制”

    回顾一下“"开篇 -- 知其然,知其所以然"”中的两段代码,第一段虽然只使用1个线程但却也只能处理一个socket,第二段虽然能处理成百上千个socket但却需要创建同等数量的线程 ...

  2. 服务器编程入门(4)Linux网络编程基础API

      问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字( ...

  3. Linux 高性能服务器编程——Linux网络编程基础API

    问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字(so ...

  4. 第5章 Linux网络编程基础

    第5章 Linux网络编程基础 5.1 socket地址与API 一.理解字节序 主机字节序一般为小端字节序.网络字节序一般为大端字节序.当格式化的数据在两台使用了不同字节序的主机之间直接传递时,接收 ...

  5. Linux网络编程基础API

    第5章 Linux网络编程基础API 探讨Linux网络编程基础API与内核中TCP/IP协议族之间的关系,并未后续章节提供编程基础.从3个方面讨论Linux网络API. socket地址API.so ...

  6. linux高性能服务器编程 (五) --Linux网络编程基础api

    第五章 Linux网络编程基础api 1.主机字节序和网络字节序 字节序是指整数在内存中保存的顺序.字节序分为大端字节序.小端字节序. 大端字节序:一个整数的高位字节数据存放在内存的低地址处.低位字节 ...

  7. linux网络编程基础--(转自网络)

    转自 http://www.cnblogs.com/MyLove-Summer/p/5215287.html Linux下的网络编程指的是socket套接字编程,入门比较简单. 1. socket套接 ...

  8. Linux网络编程之套接字基础

    1.套接字的基本结构 struct sockaddr 这个结构用来存储套接字地址. 数据定义: struct sockaddr { unsigned short sa_family; /* addre ...

  9. Linux网络编程基础

    1. Linux网络模型 ① OSI七层模型和Linux四层模型 ② 各种协议之间的关系及在Linux模型中的位置 ③ 协议封装:各种协议处于一种层层封装的关系 (1)Ethernet (2)IP * ...

  10. 【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"

    [深入浅出Linux网络编程]是一个连载博客,内容源于本人的工作经验,旨在给读者提供靠谱高效的学习途径,不必在零散的互联网资源中浪费精力,快速的掌握Linux网络编程. 连载包含4篇,会陆续编写发出, ...

随机推荐

  1. jenkins结合docker

    参考:https://m.aliyun.com/yunqi/articles/80459?spm=5176.mtagdetail.0.0.vJJ8Gj 上面这篇文章讲述了一种工作思路:CICD(持续集 ...

  2. 通过python脚本查看端口

    [root@zabbix-server alertscripts]# cat check_port1.py #!/usr/bin/env python #coding:utf-8 import os, ...

  3. 【算法导论C++代码】归并排序

    一个归并排序卡了一天最后还是归并算法有问题,最初是为了把算法导论的伪代码转到c++而加了一些东西,其中在对左右数组的赋值那里出了问题.因为进行测试时不完全,就是只用书上的数组进行测试时,归并算法部分还 ...

  4. java.lang.IllegalThreadStateException异常原因解析

    前几天写了个小程序,运行的时候发现在循环第二遍的时候出现了java.lang.IllegalThreadStateException异常 通过上网查询发现同一个Thread不能重复调用start方法, ...

  5. python 推导式(Comprehensions)

    一.介绍 列表推导(list comprehensions) 这是一种将for循环.if表达式以及赋值语句放到单一语句中的一种方法.换句话说,你能够通过一个表达式对一个列表做映射或过滤操作. 一个列表 ...

  6. Spring AOP实现拦截转发控制

    import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import ...

  7. 在Dell XPS 13安装WIN10和ubuntu双系统

    新入了Dell的XPS 13超级本,之所以买这个本子,就是看中它轻便且续航持久.这款本子也是为数不多的能够和苹果的13'' mac book air一较高下的本子.在重量上,占地面积和综合性价比上,还 ...

  8. C语言循环中降低推断——————【Badboy】

    为了让编译器更好地优化循环,应该尽量让循环中降低推断,方法之中的一个是将推断语句整合进表达式.还是这个样例: for (int i = 0; i < 1000*10; i++) { sum += ...

  9. hibernate 悲观锁乐观锁

    悲观锁和乐观锁是:在事务隔离机制中设置了ReadCommited的情况下,两种可以避免不可重复读的方式.   设置成读已提交是考虑到安全和处理速度,保证并发效率,但是在这个情况下仍然需要避免不可重复读 ...

  10. MATLAB 的字符串分析

    MATLAB的字符串分析. 字符串实际上是指1Xn 的字符数组. MATLAB软件具有强大的字符串处理功能,提供了很多的字符或字符串处理函数,包括字符串的创建.字符串的属性.比较.查找以及字符串的转换 ...