CC BY 4.0 (除特别声明或转载文章外)
如果这篇博客帮助到你,可以请我喝一杯咖啡~
一、TCP服务器端的默认函数调用顺序
1.TCP服务器端默认的函数调用顺序
socket():调用socket函数创建套接字,声明并初始化地址信息结构体变量,调用bind函数向套接字分配地址。
2.进入等待连接请求状态
前面调用了bind函数给套接字分配了地址,下一步通过调用listen函数进入等待连接请求状态。
只有调用了listen函数,客户端才能进入可发出连接请求的状态,即客户端才能调用connect函数。
#include<sys/socket.h>
int listen(int sock ,int backlog);
//成功时返回0,失败返回-1
sock:希望进入等待连接请求的套接字文件描述符
backlog:连接请求等待队列的长度
服务器的等待连接请求状态:客户端请求连接时,服务器在受理连接前一直使客户端的请求处于等待状态
3.受理客户端连接请求
调用listen函数后,若有新的连接请求,则应按序受理。受理请求意味着进入可接受数据的状态。
#include <sys/socket.h>
int accept(int sock,struct sockaddr *addr,socklen_t *addrlen);
成功时返回创建的套接字文件描述符,失败时返回-1
sock:服务器套接字的文件描述符
addr:保存发起连接请求的客户端地址信息的变量地址值,调用函数后向传递进入函数的地址
变量参数填充客户端地址信息
addrlen:第二个参数addr结构体的长度,这里是存有长度的变量地址。函数调用完成后,
该变量即被填入客户端地址长度。
进入这种 可以接收数据的状态所需参数中sock是服务器套接字,但是服务器端套接字之前已经做了门卫,如果 还用一个套接字的话,既要用来接收客户端的连接请求,一会又要和客户端进行数据传输。
accept函数会自动创建一个新的套接字,并连接到发起请求的客户端,并作为返回值返回。 accept 函数受理连接请求等待队列中 待处理的客户端连接请求。 函数调用成功时,accept函数内部将产生用于数据I/O的套接字,并返回其文件描述符。
二、 TCP客户端的默认函数调用顺序
客户端的IP地址和端口在调用 connect函数时自动分配,无需调用标记的bind函数进行分配。