Linux C——网络编程基础知识

一、网络模型

1.TCP网络模型

 Linux C——网络编程基础知识_第1张图片

2.UDP网络模型

 Linux C——网络编程基础知识_第2张图片

二、网络基础——套接字

是一种特殊的IO接口,是一种文件描述符;

是一种常用的进程之间的通信,本地,不同主机之间通信;

Socket可用网络地址结构

{协议,本地地址,本地端口}表示。

1.套接字的类型

①流式套接字SOCK_STREAM

提供可靠的、面向连接的通信流,保证数据传输的可靠性和按序收发。TCP属于流式;

②数据报套接字SOCK_DGRAM

不可靠,无连接的服务。UDP

③原始套接字SOCK_RAM

对底层协议进行访问,不方便,对一些协议开发。

 

2.IP地址转换

两种形式:十进制点分形式,32位二进制形式。

IPV4地址转换函数:

Inet_aton(),inet_addr(),  inet_ntoa()

IPV4 ,IPV6兼容:

Inet_pton(), inet_ntop();

十进制点分形式转换成二进制形式:

Inet_addr(),  inet_pton();

二进制地址转换成十进制点分形式:

Inet_ntop()

 

inet_addr函数

函数作用:十进制转换成二进制

函数原型:Int inet_addr(const char *strptr);

参数:Strptr:要转换的IP地址字符串

返回值:成功:32位二进制IP地址(网络字节序)

        出错:-1

inet_pton函数

作用:十进制转换成二进制

函数原型:Int inet_pton(int family, const char *Src,void *dst);

参数:FamilyAF_INETIPV4协议;    AF_INET6IPV6协议;

      Src:要转换的IP地址字符串;

      Dst:存放转换后的地址的缓冲区

返回值:成功:0

        出错:-1

 

3.地址及处理顺序

地址结构处理

struct sockaddr

{

     unsigned short sa_family; /*地址族*/

     char sa_data[14]; /*14字节的协议地址,包含该socketIP地址和端口号。*/

};

struct sockaddr_in

{

     short int sa_family; /*地址族*/

     unsigned short int sin_port; /*端口号*/

     struct in_addr sin_addr; /*IP地址*/

     unsigned char sin_zero[8]; /*填充0 以保持与struct sockaddr同样大小*/

};

这两个数据类型是等效的,可以相互转化,通常sockaddr_in数据类型使用更为方便。在建立socketaddsockaddr_in后,就可以对该socket进行适当的操作了。

sa_family字段可选的常见值:

Linux C——网络编程基础知识_第3张图片

数据存储优先顺序

计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式,PC机通常采用小端模式)。Internet上数据以高位字节优先顺序在网络上传输,因此在有些情况下,需要对这两个字节存储优先顺序进行相互转化。

htonl()4字节主机字节序转换为网络字节序

ntohl()4字节网络字节序转换为主机字节序

htons()2字节主机字节序转换为网络字节序

ntohs()2字节网络字节序转换为主机字节序

Linux C——网络编程基础知识_第4张图片

地址格式转化

用户在表达地址时通常采用点分十进制表示的数值字符串(或者是以冒号分开的十进制IPv6地址),而在通常使用的socket编程中所使用的则是二进制值(例如,用in_addr结构和in6_addr结构分别表示IPv4IPv6中的网络地址),这就需要将这两个数值进行转换。

这里在IPv4中用到的函数有inet_aton()inet_addr()inet_ntoa(),而IPv4IPv6兼容的函数有inet_pton()inet_ntop()inet_pton()函数是将点分十进制地址字符串转换为二进制地址而inet_ntop()inet_pton()的反操向作,将二进制地址转换为点分十进制地址字符串。

 

三、套接字编程

使用TCP时的socket编程

 Linux C——网络编程基础知识_第5张图片

使用UDP时的套接字编程

Linux C——网络编程基础知识_第6张图片

与套接字编程的相关函数在下一篇中介绍

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Linux系统基础)