linux网络编程(一)基础

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

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

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

我们常用的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中,联合体(共用体)的数据成员都是从低地址开始存放。

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

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

地址 0x00000000 0x00000001 0x00000002 0x00000003

c.a 01                  00                00                00

c.b 01                  00

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

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

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

地址 0x00000000 0x00000001 0x00000002 0x00000003

c.a 00                 00                 00                 01

c.b 00                 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]$ 
时间: 2024-11-08 18:17:24

linux网络编程(一)基础的相关文章

嵌入式 Linux网络编程(一)——Socket网络编程基础

嵌入式 Linux网络编程一--Socket网络编程基础 一.Socket简介 1.网络中进程间通信 本机进程使用进程号区别不同的进程进程间通信方式有管道.信号.消息队列.共享内存.信号量等.网络中进程间的通信首先需要识别进程所在主机在网络中的唯一标识即网络层的IP地址主机上的进程可以通过传输层的协议与端口号识别. 2.Socket原理 Socket是应用层与TCP/IP协议族通信的中间软件抽象层是一种编程接口.Socket屏蔽了不同网络协议的差异支持面向连接(Transmission Cont

Linux网络编程------网络编程基础

Socket(套接字),类似文件描述符,三种 1.流式套接字(SOCK_STREAM):可以提供可靠的.面向连接的通讯流,它使用TCP协议.TCP保证了数据传输的正确性和顺序性. 2.数据报套接字(SOCK_DGRAM):定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错,它使用数据报协议(UDP). 3.原始套接字(SOCK_RAW):直接基于IP协议. 网络地址 struct sockaddr用于记录网络地址: struct sockaddr { u_s

Linux 网络编程基础(4) -- Ping 的C代码实现

1.背景 在进行网络编程的时候,通常使用的协议有TCP协议,UDP协议.这些协议在简历套接字之初需要制定套接字的类型,比如TCP应当设置为 SOCK_STREAM, UDP对应的套接字应当设置为SOCK_DGRAM.但是这些套接字并非能够提供网络所需的全部功能,我们还需要其他的套接字,比如原始套接字OCK_RAW.原始 套接字可以提供SOCK_STREAM和SOCK_DGRAM所不及的能力.比如: (1)有了原始套接字,进程可以读取ICMPV4.ICMPV6.IGMP等的分组.正如ping所使用

《Linux高性能服务器编程》学习总结(五)——Linux网络编程基础API

第五章      Linux网络编程基础API 对于网络编程,首先要了解的就是字节序的问题,字节序分为主机字节序和网络字节序,主机字节序又称小端字节序,是低字节存放在地地址,而网络字节序又称大端字节序,是低字节放在高地址.当数据在不同的机器上传播时,就需要统一字节顺序以保证不出现错误.在发送数据前,先将需要转变的数据转成网络字节序再发送,接收时先转成主机字节序再处理,要特别注意的是,即使是本机的两个进程通信,也要考虑字节序的问题,比如JAVA的虚拟机就使用大端字节序.使用如下代码可以查看本机的字

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

转自 http://www.cnblogs.com/MyLove-Summer/p/5215287.html Linux下的网络编程指的是socket套接字编程,入门比较简单. 1. socket套接字介绍 socket机制其实就是包括socket, bind, listen, connect, accept等函数的方法,其通过指定的函数实现不同的协议(IP4,IP6等)的数据在不同层之间的传输和获取等处理.其实个人理解socket就是处于应用层和TCP/IP协议之间的一个中间层,具体的数据分析

很全的linux网络编程技巧

注:作者王晓,本人认为总结得很好,故记之,绝无侵权之意. 1. LINUX网络编程基础知识 1 1.1. TCP/IP协议概述 1 1.2. OSI参考模型及TCP/IP参考模型 1 1.3. TCP协议 3 1.4. UDP协议 5 1.5. 协议的选择 6 2. 网络相关概念 6 2.1. socket概念 7 2.2. socket类型 8 2.3. socket信息数据结构 8 2.4. 数据存储优先顺序的转换 8 2.5. 地址格式转化 9 2.6. 名字地址转化 10 3. sock

Linux网络编程入门 (转载)

http://www.cnblogs.com/RascallySnake/archive/2012/01/04/2312564.html (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端        在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序. 比如我们使用ftp程序从另外一        个地方获取文件

Linux网络编程入门

(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍 客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端 在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序. 比如我们使用ftp程序从另外一 个地方获取文件的时候,是我们的ftp程序主动同外面进行通信(获取文件), 所以这个地方我们的ftp程序就是客户端程序. 服务端 和客户端相对应的程序即为服务端程序.被动的等待外面的程序来和自己通

linux网络编程之-----基础理论篇

1.学习linux网络编程首要掌握的基本概念 系统资源 是指CPU和内存等一些活动单元(除存储设备外) 程序 是指由编译好的二进制文件,存储在磁盘上,不占用系统资源 进程 由硬盘中的程序动迁起来,产生一个或多个进程调度 并发---->单道程序设计 同一时间内,多个进程同时运行,需要占用CPU运行资源,但同一时刻只有一个进程任务占用CPU资源.其它进程任务只能排队等待该占用CPU进程执行完 并发---->多道程序设计 同一时间内,多具进程同时运行,需要占用CPU运行资源,CPU采用时间片的形式,

Linux网络编程必看书籍推荐

首先要说讲述计算机网络和TCP/IP的书很多. 先要学习网络知识才谈得上编程 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的<计算机网络>第五版,这本书难易适中. <计算机网络(第5版)>是国内外使用最广泛.最权威的计算机网络经典教材. 目前已经是第五版,本书作者80年代就开发出MINIX,是一个用于操作系统教学的类UNIX(的小型操作系统.而linux就是受其影响.... 第五版是2012年出的,也比较新. 作 者: (美)特南鲍姆,(美)韦瑟罗尔 著 严伟,