连接服务器
#include
int connect(intsockfd , const struct sockaddr *addr,
socklen_t addrlen);
功能: 连接服务器
sockfd: socket套接字
addr: ipv4套接字结构体的地址
addrlen: ipv4套接字结构体的长度
监听套接字就是判断是否有新的套接字请求,监听套接字和已连接套接字不一样,
给套接字绑定固定的端口和ip
#include
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
sockfd: 套接字
addr: ipv4套接字结构体地址
addrlen: ipv4套接字结构体的大小
返回值:
成功返回0 失败返回;-1
#include
int listen(int sockfd, int backlog);
参数:
sockfd : 套接字
backlog : 已完成连接队列和未完成连接队里数之和的最大值 128
#include
int accept(int socket, struct sockaddr *restrict address,
socklen_t *restrict address_len);
如果连接队列没有新的连接,accept会阻塞
功能: 从已完成连接队列提取新的连接
参数:
socket : 套接字
address : 获取的客户端的的ip和端口信息 iPv4套接字结构体地址
address_len: iPv4套接字结构体的大小的地址
socklen_t len = sizeof(struct sockaddr );
返回值: 新的已连接套接字的文件描述符
1 创建套接字 socket
2 绑定 bind
3 监听 listen
4 提取 accept
5 读写
6 关闭
netstat查看端口占用
三次握手和四次握手的报文有14个字节mac头20字节ip还有20字节tcp还有标志位,三次握手用到的标志位有SYN和ACK,四次握手用到的标志位是ACK和FIN,三次握手SYN信号是询问,之后服务端回复SYN+ACK,询问+应答,客户端ACK应答,四次握手,客户端FIN我要关闭了,服务端ACK应答,服务端过了一会再发送FIN我也关闭了,客户端应答ACK,等待2MSL时间,服务端没有数据发,就关闭。切记文件描述符创建了需要手动贯关闭
最大报文长度: 一般出现在三次握手的前两次,用来告知对方发送数据的最大长度
MTU: 最大传输单元 网卡
每一次读取数据之后,回ack报文,报文中会携带当前缓冲区大小,用来告知对方
流程:
创建套接字
绑定
监听
while(1)
{
提取连接(创建cfd)
fork创建子进程
子进程中,关闭lfd,服务客户端
父进程关闭cfd,回收子进程的资源
}
关闭
connect函数了解需要传入的参数,套接字文件描述符,ipv4结构体(自定义),ipv4结构体长度
客户端需要创建套接字,连接套接字,写,读,关闭,服务端需要创建套接字,绑定,监听,接收,读,写,关闭,要注意监听套接字的文件描述符lfd和接收文件描述符cfd不一样, 监听套接字就是判断是否有新的套接字请求
绑定bind函数传入的参数套接字,ipv4结构体(自定义),ipv4结构体长度,绑定ip和端口
监听listen 函数传入参数,套接字和队列最大值128
accept函数传入的参数套接字,ipv4结构体(自定义),ipv4结构体长度,从已完成连接队列完成连接,返回新的文件描述符
tcp服务端步骤:创建,绑定,监听,提取,读,写,关闭
三次握手和四次握手的报文有14个字节mac头20字节ip还有20字节tcp还有标志位,三次握手用到的标志位有SYN和ACK,四次握手用到的标志位是ACK和FIN,三次握手SYN信号是询问,之后服务端回复SYN+ACK,询问+应答,客户端ACK应答,四次握手,客户端FIN我要关闭了,服务端ACK应答,服务端过了一会再发送FIN我也关闭了,客户端应答ACK,等待2MSL时间,服务端没有数据发,就关闭。
最大报文长度mss和最大传输单元mtu 一般1500
多进程实现高并发服务器,首先需要创建套接字,绑定,监听(创建lfd),循环 循环体里提取创建cfd,创建子进程fork(),文件描述符也创建,子进程需要关闭lfd,服务客户端,父进程需要关闭cfd,回收子进程的资源
tcp的三次握手和四次握手整体流程:客户端和服务端都处于关闭状态最开始,客户端发起连接请求,处于SYN_SENT状态,发送信号SYN给客户端,客户端接收信号变为SYN_RECV状态,再给客户端发送SYN+ACK信号,这时候客户端变为ESTABLISHED状态,再给服务端发送ACK信号,此时服务端也变成ESTABLISHED状态,下面说四次握手状态,客户端接收到一个信号close,此时客户端变为FIN_WAIT1状态,然后发送一个FIN信号给服务端,服务端变为CLOSE_WAIT状态,然后向客户端发送一个ACK信号,这时候客户端变为FIN_WAIT2状态,过了一会,服务端变为LAST_ACK状态,发送一个FIN信号给客户端,客户端变为TIME_WAIT状态,再向服务端发送ACK信号,这时候服务端变为CLOSE状态,过了2MSL时间,客户端自动变为CLOSE状态