Linux 网络开发
Socket
Socket套接字 就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。 为了完成网络应用程序开发(局域网,广域网)系统提供的一组函数接口。
socket pair 标示网络中的多个socket链接和通信关系。
//socket创建 ip版本 传输协议 SOCKET_DGRAM|| SOCK_STREAM
int socketfd = socket(AF_INET6, SOCKET_STREAM, 0);
sockaddr_in
sockaddr 初始化网络信息
struct sockaddr_in addr 网络信息结构体
addr.sin_family = AF_INET or AF_INET6 // 协议族 ipv4 ipv6
addr.sin_port = 8000. //端口号
addr.sin_addr.s_addr = 192.168.1.1 //ip地址
bind(server端)
绑定网络信息和套接字
服务器端需要进行绑定 而客户端不需要(客户端使用connect直接进行连接)
bind(SOCKET socket, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
listen(server端)
**listen设置监听队列:**设置监听队列存储socket,对设置队列大小的socket进行监听。
listen(SOCKET sockfd, int size (128));
accept(server端)
服务器等待连接:让服务器处于阻塞状态,等待客户端socket连接之后才能继续运行。
返回服务器的socket 被连接服务器的套接字 传出服务器网络信息和网络信息大小
struct sockaddr_in clientaddr;
socklen_t clientsize = sizseof(clientaddr);
SOCKET clientfd = accept(SOCKET sockfd, (struct sockaddr *)&clientaddr, &clientsize);
connect(client端)
客户端请求连接服务器:根据设置的网络信息连接服务器。(无需bind)
connect(SOCKET clientfd, (struct sockaddr *)&sockaddr, sizseof(sockaddr));
recv send
向对方发送或接收信息: 根据传入的socket确定接受或发送方
//发送时一般为字符串真实大小
//接收时一般为定义的字符串的长度
int length;
length = recv(SOCKET socket, char * buf, int len, 0);
send(SOCKET, socket, char * buf, length, 0);
/*
为了防止TCP粘包问题
发送端 先发送包的大小 然后再发送包的内容
接收端 先接受包的大小 定义接受数据包偏移量 若数据包过大则需要多次接收
*/
I/O多路复用
select
经典的I/O多路复用模型
pool
类 select 模型
epool
较为高效的模型,使用红黑树作为遍历方式
//水平触发 默认方式 需要处理完所有的就绪信息才可以继续下一次的监听
//边沿触发 高效的工作方式 就绪只会通知用户一次 可以不处理