1.服务器通信模型
tcp服务器 接电话模型:创建套接字(服务器电话),绑定ip和端口在套接字上(绑定固定电话号码),监听有没有新在连接(监听),接受连接(接听电话),收发数据(读写对socket文件操作)(说话交流),关闭(挂电话)
说明:一台主机可能多个ip所以得绑定
说明:客户端不用绑定,系统随机分配一个端口给他
详细具体过程
说明: listen监听创建一个已完成队列和未完成队列,未完成队列经过三次握手到达已完成队列中,将服务器变成被动接收模式 accept从已完成队列中提取连接,得到一个新的已连接套接字,用这个已连接套接字和客户端通信,原来那个套接字只用来处理新的请求和接收新的连接,不用原来的那个通信了。
已连接套接字端口和ip和原来的监听套接字ip和端口一模一样同等复制 要服务很多客户端,不止一个 作用:专门分工,提高工作效率,避免一个套接字产生错乱
函数说明:
bind函数 功能:绑定ip和端口在服务器套接字上 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); sockfd: socket文件描述符,对应目标套接字 addr: 构造出IP地址加端口号,获取服务器ipv4套接字结构体地址 addrlen: sizeof(addr)长度,ipv4结构体的大小 返回值: 成功返回0,失败返回-1, 设置errno
listen函数 功能:监听是否有连接 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int listen(int sockfd, int backlog); sockfd: socket文件描述符,socket套接字 backlog: 排队建立3次握手队列和刚刚建立3次握手队列的链接数和 已完成连接数和未完成连接数之和的最大值(一般填128够用了)
说明: 查看系统默认backlog cat /proc/sys/net/ipv4/tcp_max_syn_backlog
返回值 listen()成功返回0,失败返回-1。
accept函数 功能:从已完成连接队列提取新的连接 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); sockdf: socket文件描述符,套接字 addr: 传出参数,返回链接客户端地址信息,含IP地址和端口号 获取到客户端ipv4套接字结构体地址 addrlen: 套接字结构体大小的地址 传入传出参数(值-结果),传入sizeof(addr)大小,函数返回时返回真正接收到地址结构体的大小 返回值: 成功返回一个新的socket文件描述符,理解成创建一个新的套接字,用于和客户端通信不用那个旧的套接字 失败返回-1,设置errno
说明:如果没有新的连接,accept会阻塞
|