Linux网络编程(一)基础
一、数据存储顺序:大端和小端
大端模式: 地址的增长顺序与值的增长顺序相反
小段模式: 地址的增长顺序与值的增长顺序同样
为什么会有大小端模式之分呢?这是由于在计算机系统中,我们是以字节为单位的。每一个地址单元都相应着一个字节。一个字节为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网络编程(一)基础的更多相关文章
- 【深入浅出Linux网络编程】 “基础 -- 事件触发机制”
回顾一下“"开篇 -- 知其然,知其所以然"”中的两段代码,第一段虽然只使用1个线程但却也只能处理一个socket,第二段虽然能处理成百上千个socket但却需要创建同等数量的线程 ...
- 服务器编程入门(4)Linux网络编程基础API
问题聚焦: 这节介绍的不仅是网络编程的几个API 更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系. 这节主要介绍三个方面的内容:套接字( ...
- Linux 高性能服务器编程——Linux网络编程基础API
问题聚焦: 这节介绍的不仅是网络编程的几个API 更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系. 这节主要介绍三个方面的内容:套接字(so ...
- 第5章 Linux网络编程基础
第5章 Linux网络编程基础 5.1 socket地址与API 一.理解字节序 主机字节序一般为小端字节序.网络字节序一般为大端字节序.当格式化的数据在两台使用了不同字节序的主机之间直接传递时,接收 ...
- Linux网络编程基础API
第5章 Linux网络编程基础API 探讨Linux网络编程基础API与内核中TCP/IP协议族之间的关系,并未后续章节提供编程基础.从3个方面讨论Linux网络API. socket地址API.so ...
- linux高性能服务器编程 (五) --Linux网络编程基础api
第五章 Linux网络编程基础api 1.主机字节序和网络字节序 字节序是指整数在内存中保存的顺序.字节序分为大端字节序.小端字节序. 大端字节序:一个整数的高位字节数据存放在内存的低地址处.低位字节 ...
- linux网络编程基础--(转自网络)
转自 http://www.cnblogs.com/MyLove-Summer/p/5215287.html Linux下的网络编程指的是socket套接字编程,入门比较简单. 1. socket套接 ...
- Linux网络编程之套接字基础
1.套接字的基本结构 struct sockaddr 这个结构用来存储套接字地址. 数据定义: struct sockaddr { unsigned short sa_family; /* addre ...
- Linux网络编程基础
1. Linux网络模型 ① OSI七层模型和Linux四层模型 ② 各种协议之间的关系及在Linux模型中的位置 ③ 协议封装:各种协议处于一种层层封装的关系 (1)Ethernet (2)IP * ...
- 【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"
[深入浅出Linux网络编程]是一个连载博客,内容源于本人的工作经验,旨在给读者提供靠谱高效的学习途径,不必在零散的互联网资源中浪费精力,快速的掌握Linux网络编程. 连载包含4篇,会陆续编写发出, ...
随机推荐
- 有关fallback diffuse unity的神奇的事情
fallback diffuse 导致tris面片增加 double了 等于又画了一遍 很奇怪(只有一台机器是这样的) 这事情真坑我跟到最后 在一个最简测试场景 fallback diffuse替换成 ...
- Unity3D之高级渲染-Shader Forge增强版
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家.特邀编辑.畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...
- 基于Spark机器学习和实时流计算的智能推荐系统
概要: 随着电子商务的高速发展和普及应用,个性化推荐的推荐系统已成为一个重要研究领域. 个性化推荐算法是推荐系统中最核心的技术,在很大程度上决定了电子商务推荐系统性能的优劣,决定着是否能够推荐用户真正 ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何配置虚拟轴 TC2
右击NC- Configuration,然后Append Task,然后右击Axis,Append Axis 轴的类型可以分为:Continuous Axis,默认的类型,NC可以连续闭环控制该轴 ...
- Ubuntu(Debian)的aptitude与apt-get的区别和联系
Ubuntu(Debian)的aptitude与apt-get的区别和联系 aptitude 与 apt-get 一样,是 Debian 及其衍生系统中功能极其强大的包管理工具.与 apt-get 不 ...
- 关于 -webkit-line-clamp 详解
最近需要做个商品列表,在手机屏幕不太一样的市场里,如何做到列表中刚刚好显示2行,偶然间发现淘宝的手机版有用到-webkit-line-clamp来实现这种效果 限制在一个块元素显示的文本的行数. -w ...
- mui.ajax返回type为abort
最近在使用h5和mui开发app,发现mui.ajax有一个小bug 情况一: 参数和请求路径无误,但是总是调起失败的回调函数,打印出 type=abort (终止请求) 原因: mui.ajax默认 ...
- 获取 input 输入框的值
1.使用原生javascript: 方法一: <html> <head> <script language="javascript"> func ...
- Oracle 查询搜索字符串在哪些存储过程中包含
如下: select *from all_source where OWNER = 'LC0019999'and TEXT like '%insert into%d values(%'
- Android平台Native开发与JNI机制详解
源文链接: http://mysuperbaby.iteye.com/blog/915425 一个Native Method就是一个Java调用非Java代码的接口.一个Native Method是这 ...