最后更新:2022-02-16 05:19:04 手机定位技术交流文章
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会阻塞
本文由 在线网速测试 整理编辑,转载请注明出处。