套接字描述符
所谓套接字描述符是用于 网络进程间的通信。套接字是通信端点的抽象,正如进程使用文件描述符访问文件,应用程序用套接字描述符访问套接字。
为调用一个套接字,调用socket。
int socket(int domain,int type,int protocol)
返回值:成功返回文件描述符,失败返回-1;
参数:
domain(域):确定通信的特性,包括地址格式,每种域都有自己的地址格式。
域 | 描述 |
---|---|
AF_INET | IPv4英特网域 |
AF_INET6 | IPv6英特网域 |
AF_UNIX | UNIX域 |
AF_UPSPEC | 未指定 |
type:确定套接字的类型,进一步确定通信特征:
类型 | 描述 |
---|---|
SOCK_DGRAM | 固定长度的、无连接的、不可靠的报文传递 |
SOCK_RAW | IP协议的数据报接口 |
SOCK_SEQPACKET | 固定长度的、有序的、可靠的、面向连接的报文传递 |
SOCK_STREAM | 有序的、可靠的、双向的、面向连接的字节流 |
protocol:通常是0,表示为给定的域和套接字类型选择默认协议。
int close(int sockfd)
作用:关闭一个套接字。
返回值:成功返回0,失败返回-1;
int shutdown(int sockfd,int how)
作用:用来禁止一个文件描述符的IO
返回值:成功返回0,失败返回-1
参数how:
SHUT_RD(关闭读端)
SHUT_WR(关闭写端)
SHUT_RDWR(关闭读写端)
将套接字与地址关联
int bind(int sockfd,const struct sockaddr *addr,socklen_t len);
返回值:成功返回0,失败返回-1。
参数: addr 地址族 len :地址族大小
建立连接
int connect(int sockfd,const struct sockaddr *addr,socklen_t len)
返回值:成功返回0,失败返回-1。
作用:如果要处理一个面向连接的网路服务(SOCK_STREAM或SOCK_SEQPACKET),那么在开始交换数据之前,需要在请求服务的套接字和提供服务的套接字之间建立一个连接,使用connect来建立连接。
参数:sockfd:请求服务的套接字,addr:为提供服务的套接字bind地址
int listen(int sockfd,int backlog)
返回值:成功返回0,失败返回-1。
作用:服务器需要调用listen来宣告它愿意接受连接请求。
参数:backlog的作用是决定等待被accept的连接队列的大小,例如当backlog为10的时候,此时有11个客户端发起连接请求,但是服务器都未及时处理,所以前十个请求就会进入等待对列,且最后一个连接请求不会进入到等待对列。
int accept(int sockfd,struct sockaddr*restrict addr,socklen_t *restrict len)
返回值:成功返回套接字描述符,失败返回-1;
作用:处理调用connect的客户端的连接请求,并且返回一个能与之通信的套接字描述符。
如果服务器调用accept且sockfd处于阻塞状态,那么该线程将会阻塞直到有连接请求发来。如果sockfd处于非阻塞状态,那么accept会立即返回-1,并将error设为EWOULDBLOCK。
数据传输
ssize_t send(int sockfd,void*buf,size_t bytes,int flags)
返回值:成功返回发送字节数,失败返回-1
作用:与write功能基本相同但是多了一个flags参数,可用来控制如何发送数据
## ssize_t recv(int sockfd,const void*buf,size_t bytes,int flags)
返回值:成功返回读取字节数,失败返回-1
作用:与read功能基本相同但是多了一个flags参数,可用来控制如何读取数据