Linux软件编程--网络操作
1、套接字文件 socket
1.概述
- 套接字文件是Linux系统中一种特殊文件类型,用于进程间通信
- 支持同一主机上的进程高效通信,无需经过网络协议栈
2.分类
- 流式套接字(SOCK_STREAM):类似于TCP,提供可靠、有序的双向字节流通信,适用于对精度要求比较高的场景
- 数据报套接字(SOCK_DGRAM):类似UDP,提供无连接、不可靠的数据报服务,适用于实时性要求高的场景
2、TCP C/S模型
1.概述
- C/S模型是一种分布式架构,客户端主动发起请求,服务器被动响应并提供服务
- TCP通过三次握手建立连接,确保通信双方收发能力正常,连接建立后,双方可同时发送和接收数据
2.工作流程
服务器端
- 创建Socket :调用socket()创建监听套接字
- 绑定地址:使用
bind()
将套接字绑定到IP地址和端口 - 监听连接:通过
listen()
设置最大连接数、进入LISTEN
状态 - 接受连接:
accept()
阻塞等待客户端连接,返回新的通信套接字connfd
- 数据传输:调用read()、write()等函数实现数据交换
- 关闭连接:调用close()释放资源
客户端
- 创建Socket :调用socket()创建监听套接字
- 连接服务器:调用
connect()
指定服务器IP和端口 - 数据传输:同服务器端
- 关闭连接:同服务器端
3、相关函数接口介绍
下文中均为在Linux操纵系统下的网络函数
1.socket
原型:
int socket(int domain, int type, int protocol);
功能:
创建了通信的一端
参数:
domain:协议族(指定通信的地址类型,决定Socket的地址结构)
AF_INET:IPv4地址
AF_INET6:IPv6地址
AF_UNIX:本地进程间通信
AF_PACKET:底层数据包捕获,如原始套接字
type:套接字类型
SCOK_STREAM:面向连接的字节流(TCP),保证数据可靠、有序
SCOK_DGRAM:无连接的数据报(UDP),速度快但不可靠
protocol:协议类型
IPPRTOTO_TCP:强制使用TCP协议
IPPRTOTO_UDP:强制使用UDP协议
0:根据前两个参数自动选择协议类型
返回值:
成功返回文件描述符
失败返回-1
2.connect
原型:
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:通过 socket 创建的通信端连接到指定地址上
参数:
sockfd:socket创建的通信端
addr:目标服务器地址结构体(不同类型地址结构体不同)
addrlen:结构体的长度
返回值:
成功返回 0
失败返回 -1
ipv4地址结构体
struct sockaddr_in {
sa_family_t sin_family; //协议族
in_port_t sin_port; //端口号
struct in_addr sin_addr; //IP地址
};
3.bind
原型:
int bind (int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:
给 socket 创建的通信端绑定一个地址信息
参数:
sockfd:socket创建的通信端
addr:要绑定的地址
addrlen:要绑定的地址大小
返回值
成功返回 0
失败返回 -1
4.listen
原型:
int listen(int sockfd,int backlog);
功能:
用于将套接字从主动模式转换为被动模式,使其能够监听并接受客户端的连接请求
参数:
sockfd:socket创建的通信端
backlog:处理连接队列的最大长度
返回值:
成功返回 0
失败返回 -1
5.accept
原型:
int accept (int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:从监听的地址中提取连接请求,完成连接(三次握手)
参数:
sockfd:监听到的地址端
addr:用来存放,客户端的地址信息
addrlen:值结果参数
返回值:
成功返回已连接端的文件描述符
失败返回 -1