accept函数
#include<sysy/socket.h>
int socket(int family,int type,int protocol);
使用这个函数创建一个套接字,函数执行成功返回一个套接字描述符,套接字描述符是一个小的整形数据,第一个参数表示地址族,第二个参数为套接字类型,第三个参数使用0来自适应前两个参数。
family的取值
- AF_INET表示IPv4
- AF_INET6表示IPv6
- AF_LOCAL表示unix域协议
- AF_ROUTE表示路由协议
- AF_KEY表示秘钥协议
type的取值
- SOCK_STREAM表示流式套接字
- SOCK_DGRAM表示数据报套接字
- SOCK_RAW表示原始套接字
函数成功返回文件描述符,失败返回-1。
connect函数
#include<sys/socket.h>
int connect(int sockfd,struct sockaddr *seraddr,socklen_t addrlen);
函数执行成功返回0,失败返回-1
如果使用的是TCP协议,则这个函数的执行动作是三次握手,主动和服务器进行连接,这个函数是阻塞的,当成功或者出错时返回。
当是一个TCP连接会出现以下几种错误情况
- 返回ETIMEDOUT错误,这个错误表示没有收到服务器端对SYN的响应,当客户端向服务器发送SYN时没有收到回应便会隔一段时间再发,如果每次都没有回应,这个函数便会返回这个错误,表示建立连接超时。
- 返回ECONNREFUSED错误,这个错误表示当客户端发送SYN时,收到的回应为RST,表示建立连接被拒绝,原因是服务器没有在指定的端口上监听。
产生RST的几个原因
- 目的端口上接收到SYN时,但是该端口上没有开启监听服务便会返回一个RST。
- TCP想要取消一个已连接时。
- 当一个没有连接的数据包到达时。
RST包的作用
- 表示强制关闭连接
bind函数
#include<sys/socket.h>
int bind(int sockfd,struct sockaddr *myaddr,socklen_t addrlen);
成功返回0,失败返回-1
这个函数的作用便是给指定的套接字绑定地址。
bind函数通常使用在服务器端,给一个服务器绑定ip和端口号,表示接收目的地址为特定ip和端口号的数据包。
客户端可以不绑定ip和端口号,会随机使用自身的ip地址和端口号,如果自身有多个ip也可以绑定的定的ip地址和端口号来作为数据包的源ip和源端口号。
服务器绑定ip可以使用通配地址INADDR_ANY表示服务器监听所有的ip地址。
listen函数
#include<sys/socket.h>
int listen(int sockfd,int backlog)
成功返回0,失败返回-1
这个函数做了两件事
- 将sockfd套接字设置为监听套接字,能够接受目的地址指向这个套接字的数据包。
- 设置了最多连接个数。
监听套接字维护两个队列

- 未完成连接的队列:表示已经接收到客户端的SYN处于SYN_RCVD状态,但是三次握手还没有完成的客户端。
- 已完成连接的队列:表示已经完成连接的客户。
来源:https://blog.csdn.net/qq_40148538/article/details/99058049