套接字创建的过程
头文件
#include<sys/socket.h>
创建套接字
int socket(int domain, int type, int protocol);
domain:表示协议族,常用的有AF_INET(IPv4)、AF_INET6(IPv6)等。
type:表示套接字的类型,常用的有SOCK_STREAM(流式套接字,基于TCP协议实现)和SOCK_DGRAM(数据报套接字,基于UDP协议实现)。
SOCK_STREAM(面向连接的套接字)
该种传递方式下具有缓冲区,收到数据后在缓冲区未满之前可能不会立马读取数据。如果数据的读取慢于输入,缓冲区将被填满,但并不会发生数据的丢失。因为传输端会阻塞等待。如果发生上传错误还会提供重传服务
更适合对数据可靠性和完整性有较高要求的应用场景
SOCK_DGRAM(面向消息的套接字)
protocol:表示具体的协议,一般设置为0,系统会根据domain和type自动选择合适的协议。
绑定套接字与IP地址
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd:表示要进行绑定操作的套接字文件描述符。
addr:表示要绑定的本地地址,它是一个指向sockaddr结构体的指针,不同的协议族对应的结构体类型不同。例如,对于IPv4协议族,结构体类型为sockaddr_in。
sockaddr结构体
struct sockaddr {
sa_family_t sa_family; //地址族(地址类型)
char sa_data[14]; //存放地址数据的缓冲区
};
addrlen:表示addr结构体的长度。
设置为被动状态
int listen(int sockfd, int backlog);
sockfd:表示要进行操作的套接字文件描述符。
backlog:表示内核中用于存放已完成三次握手的连接请求队列的最大长度。一般情况下,该值设置为5~10之间即可;如果该值被设置得过大,则可能会影响系统性能。
同意申请
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
使用该函数同意连接的请求
sockfd:表示要进行操作的套接字文件描述符。
addr:用于存放客户端的地址信息。它是一个指向sockaddr结构体的指针,不同的协议族对应的结构体类型不同。例如,对于IPv4协议族,结构体类型为sockaddr_in。
addrlen:表示addr结构体的长度。