一、网络编程
Linux 下的网络编程,核心是基于 TCP/IP 协议栈,通过操作系统提供的 Socket(套接字)API 实现网络通信,支持客户端与服务器间的数据传输,广泛用于开发服务器、客户端、网络工具等应用。
1.目的
不同主机,进程间通信;
2.问题
(1)主机与主机之间物理层面必须互联互通;
(2)进程与进程在软件层面必须互联互通;

广域网与局域网
广域网:覆盖范围广(如城市、国家、全球),依赖运营商专线、卫星等长途传输技术,连接多个局域网,传输速度相对较慢、延迟较高,典型代表是互联网,用于跨区域的数据交互;
局域网:覆盖范围小(如家庭、办公室、校园),采用交换机、路由器等设备连接,传输速度快、延迟低、安全性较高,常用于局部区域内设备(电脑、打印机等)的互联。
交换机与互联网
IP地址:计算机的软件地址,用来标识计算机设备;
MAC地址:计算机的硬件地址;
网络的端口号:标记同一主机上的不同网络进程;
3.网络协议
网络通信标准
1) 0SI七层模型:开放系统互联模型(open system interconnect)【理论模型】
不同设备间的网络通信的通信标准;
|-------|
| 应用层 |
| 表示层 |
| 会话层 |
| 传输层 |
| 网络层 |
| 数据链路层 |
| 物理层 |
(1)应用层:要传输的数据信息,如文件传输,电子邮件;
(2)表示层:数据加密,解密,压缩,解压缩;
(3)会话层:建立数据传输通道----->会话;
(4)传输层:传输的方式 UDP TCP 端口号;
(5)网络层:实现数据路由 路径规划 路由器 ip;
(6)数据链路层:封装成帧,点对点通信(居于网内通信),差错检测 交换机 ARP;
(7)物理层:定义物理设备标准,电气特性,比如网线、光纤等传输介质 比特流: bit 0、1
2)TCP/IP模型:【应用模型】
五层:
<1>应用层:
HTTP:超文本传输协议
HTTPS:超文本传输协议(SSL加密算法)
FTP:文件传输协议(TCP)
TFTP:简单文件传输协议(UDP)
MQTT:消息队列遥测传输协议(物联网协议)(节省带宽)
DNS:域名解析服务,域名转为成IP地址
<2>传输层:
TCP:传输控制协议(确定唯一路径)
UDP:用户数据报协议(数据丢失)
<3>网络层:
IP协议
192.168.1.128
IPV4:32位
IPV6:128位
192.168.0.142(用户表示形式)点分十进制
IP地址 = 网络位 + 主机位
子网掩码:
如:255.255.255.0
11111111.11111111.11111111.00000000
用来区分IP地址的网络位和主机位,搭配IP地址使用。
子网掩码是1的部分对应IP地址的网络位
子网掩码是0的部分对应IP地址的主机位
网段号:
ip地址网络位不变,主机位全为0,则该IP地址的网段号
广播号
192.168.1.255
ip地址网络位不变,主机位全为1,则该IP地址的广播号
网关地址 : 192.168.1.1
IP地址划分:(A)同于管理大规模网络;
(B)用于管理中大规模网络;
(C)用于管理中小规模网络;
(D)组播与广播;
(E)用来实验;
<4>数据链路层:
ARP:地址解析协议
<5>物理层:设备特征等
四层:
应用层:同上;
传输层:同上;
网络层:同上;
网络接口层:合并数据链路层和物理层;
5.网络端口号
端口号:16位的整型数据(unsigned short)0--65535
端口号功能:标记同一主机的不同网络进程
分类:
(1)任何TCP/IP实现所提供的服务都用1-1023之间的端口号;
http:80;
FTP:20/21
TFTP:69
HTTPS:443
(2)端口号从1024-49151是被注册的端口号,被LANA指定为特殊服务使用;
MQTT:1883/8883

6.网络配置
(1)ping ip地址/域名
查看当前主机和ip地址是否联通
(2)ifconfig
在linux下查看当前主机IP地址
在windows下查看当前主机IP地址
7.用户数据协议--UDP
UDP:传输层
用户数据报协议
1)网络编程模型
B/S:browser/server(浏览器/服务器)
1.客户端是一个通用的客户端;
2.只做服务器的开发;
3.客户端要加载的数据均来自服务器;
C/S:client/server(客户端/服务端)
1.客户端是一个专用的客户端;
2.服务器和客户端都需开发;
3.客户端可保存资源,本地加载,无需所有数据都请求服务器;
2)UDP编程
套接字:文件描述符
网络通信时,应用层可操作的端口
客户端 :sendto()--->recvfrom()----->close()
服务端 : bind()----->recvform----> sendto----->close()
UDP特点:UDP:无连接、不可靠、数据报协议(如 DNS、视频流),无需建立连接,传输效率高,但可能丢包或乱序。
UDP函数:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
i(1)nt socket(int domain, int type, int protocol);
功能·:创建通信的套接字;
参数:
domain:网络层使用什么协议族
AF_INET IPv4 Internet protocols
AF_INET6 IPv6 Internet protocols
type:规定传输层的协议
SOCK_DGRAM :UDP协议;
SOCK_STREAM:TCP协议;
SOCK_RAW:原始套接字
protocol:0 按照默认协议创建;
返回值:
成功:套接字
失败:-1
(2)ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
功能:向网络套接字发送数据;
参数:
sockfd:套接字;
buf:要发送的数据的首地址;
len:要发送的字节数;
flags:0:按照默认方式发送;
deat_addr:接收方的地址信息(IP+端口号);
addrlen:接收方地址的大小;
返回值:
成功:实际发送的字节数;
失败:-1;
下列函数是Linux 网络编程中核心的字节序转换函数,主要用于解决不同主机间数据传输的 "字节序不一致" 问题,确保数据在网络中正确解析:host:主机 network:网络
uint32_t htonl(uint32_t hostlong); 主机转网络 host ----->network 4
uint16_t htons(uint16_t hostshort); 主机转网络 host ----->network 2
uint32_t ntohl(uint32_t netlong); 网络转主机 network----->host 4
uint16_t ntohs(uint16_t netshort); 网络转主机 network----->host 2
其中
网络字节序:大端 network
主机字节序:小端 50000 host
(3)in_addr_t inet_addr(const char *cp);
功能:
将字符串IP地址转换成二进制IP地址形式
char *inet_ntoa(struct in_addr in);
功能:
将二进制ip转换成字符串
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
(4) int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:绑定自己的IP地址和端口号
参数:
sockfd:套接字;
addr:需要绑定的地址;
addrlen:绑定地址的大小;
返回值:
成功:0;
失败:-1
(5) ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
功能:从套接字上接收数据
参数:
sockfd:套接字;
buf:存放接受数据的内存首地址;
len:希望接受的字节数;
flags:0:按照默认方式收到(阻塞);
src_addr:发送发地址的指针;
返回值:
成功:接受的字节数;
失败:-1