Linux网络编程|网络编程基础

网络编程基础

1. 套接字概述

1.1 套接字定义

套接字(Socket)是一种特殊的I/O接口,也是一种文件描述符。Socket是一种常用的进程之间通讯机制,不仅能实现本地不同进程之间的通讯,而且通过网络能够在不同主机的进程之间进行通讯
对于网络通讯而言,每个Socket都可用网络地址结构(协议、本地地址、本地端口)来表示。Socket通过一个专门的函数创建,并返回一个整型的Socket描述符,随后的各种操作都是通过Socket描述符来实现的

1.2 套接字类型

常见的Socket类型有如下3种:

  • 流式套接字(SOCK_STREAM):提供可靠的、面向连接的通讯流,保证数据传输的可靠性和按序收发,TCP通讯使用的就是流式套接字
  • 数据报套接字(SOCK_DGRAM):实现了一种不可靠的、无连接的服务,数据通过相互独立的报文进行传输,是无序的,且不保证可靠的传输,UDP通讯使用该套接字
  • 原始套接字(SOCK_RAW):允许对底层协议(如IP或ICMP)进行直接访问,它功能强大但使用较为不便,主要用于一些协议的开发

2. IP地址

2.1 IP地址的作用

IP地址用来标识网络中的一台主机。根据不同的协议版本,分为IPv4(32位)和IPv6(128位)。一个IP地址包含两部分:网络号和主机号。其中网络号和主机号根据子网掩码来区分。简单来说,有了源IP和目标IP,数据包就能在不同的主机之间传输

2.2 IP地址格式转换

IP地址有两种不同格式:十进制点分 (point) 形式和32位二进制形式,前者是用户所熟悉的形式,后者是网络传输中IP地址的存储方式。
IP地址转换函数:

  • 十进制点分形式转换为二进制形式:inet_addr(), inet_pton()(IPv4/IPv6兼容)
  • 二进制形式转换为十进制点分形式:inet_ntop()(IPv4/IPv6兼容)
/*****十进制点分形式转换为二进制形式*****/
/***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)
传 入 值:family --> AF_INET: IPv4协议
				--> AF_INET6: IPv6协议
		 src 要转换的IP地址字符串
		 dst 存放转换后的地址的缓冲区 
返 回 值:成功返回0;失败返回-1

/*****二进制形式转换为十进制点分形式*****/
/***inet_ntop()函数***/
函数原型:int inet_ntop(int family, void *src, char *dst, size_t len)
传 入 值:family --> AF_INET: IPv4协议
				--> AF_INET6: IPv6协议
		 src 要转换的二进制IP地址
		 dst 存放十进制地址字符串的缓冲区 
返 回 值:成功返回 dst;失败返回 NULL
2.3 地址结构相关处理

数据结构 sockaddr 和 sockaddr_in 都是用来表示地址信息的,通常用 sockaddr_in 来保存某个网络地址,在使用时强转换成 sockaddr 类型的指针,其定义如下:

/*****sockaddr*****/
struct sockaddr{
    
    
	unsigned short sa_family;	//地址族
	char sa_data[14];			//14字节的协议地址
}

/*****sockaddr_in*****/
struct sockaddr_in{
    
    
	short int sin_family;			//地址族
	unsigned short int sin_port;	//端口号
	struct in_addr sin_addr;		//IP地址
	unsigned char sin_zero[8];		//填充0以保持与sockaddr同样大小	
}
/***其中的struct in_addr结构体***/
struct in_addr{
    
    
	uint32_t s_addr;
}

sa_family字段可选的常见值

头文件 #include <netinet/in.h>
sa_family AF_INET:IPv4协议
AF_INET6:IPv6协议
AF_LOCAL:UNIX域协议
AF_LINK:链路地址协议
AF_KEY:密钥套接字

3. 端口

端口(号)是一个无符号短整型,取值范围从0到65535;端口号是系统的一种资源,0到1023范围的端口号,一般被系统程序所使用;TCP端口号和UDP端口号独立,互不影响;如果说IP地址可以表示网络中的一台主机,那么端口号可以用来代表主机内部的某个套接字。即当一个套接字创建好后,需要把它和某个IP地址及端口号绑定,这样双方才能实现端到端的通讯

4. 字节序

字节序又称为主机字节序(Host Byte Order, HBO),是指计算机中多字节整型数据的存储方式。字节序有两种:大端(高位字节存储在低位地址,低位字节存储在高位地址)和小端(与大端相反,PC通常采用小端模式)。在网络通讯中,发送方和接收方有可能使用不同的字节序,为保证数据接收后能被正确解析处理,统一规定:数据以高位字节优先顺序在网络上传输(网络字节序)。因此数据在发送前和接收后都需要在主机字节序和网络字节序之间转换
字节序转换包括4个函数:htons()、ntohs()、htonl()和ntohl(),这里的 h 代表 host,n 代表 network,s 代表 short,l 代表 long,通常16Bits的端口号用前两个函数处理,而IP地址用后两个函数来转换。

/*****字节序转换函数*****/
函数原型:uint16_t htons(uint16_t hostshort);
		 uint32_t htonl(uint32_t hostlong);
		 uint16_t ntohs(uint16_t netshort);
		 uint32_t ntohl(uint32_t netlong);
传 入 值:hostshort 主机字节序的16位数据 
		 hostlong 主机字节序的32位数据
		 netshort 网络字节序的16位数据
		 netlong 网络字节序的32位数据
返 回 值:成功 返回转换字节序后的数值;失败 返回-1

猜你喜欢

转载自blog.csdn.net/Chuangke_Andy/article/details/108422947