一、TCP流程
服务器端 客户端
二、函数格式
2.1 socket()函数
socket()函数 | 参数 |
---|---|
头文件 | #include <sys/socket.h> #include <sys/types.h> |
函数原型 | int socket(int domain, int type, int protocol); |
函数参数 | domain:AF_UNIX,AF_LOCAL:本地通信 AF_INET:IPv4协议 AF_INET6:IPv6协议 AF_PACKET:原始套接字 type:SOCK_STREAM:流式套接字TCP SOCK_DGRAM:数据报套接字UDP SOCK_RAW:原始套接字 protocol:0(如果type使用的是 SOCK_STREAM或SOCK_DGRAM) |
函数返回值 | 成功:套接字描述符 失败:-1 |
domain:指定通信域
type:指定套接字类型
protocol:附加协议,如果type使用的是 SOCK_STREAM 或者 SOCK_DGRAM此时该参数可以指定为 0
2.2bind()函数
bind()函数 | 参数 |
---|---|
头文件 | #include <sys/socket.h> #include <sys/types.h> |
函数原型 | int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen); |
函数参数 | sockfd: socket函数返回的文件描述符 addr:网络信息结构体 addrlen:网络信息结构体的大小 |
函数返回值 | 成功:0 失败:-1 |
网络信息结构体
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
上面的结构体不使用,只是为了强转防止编译器警告的
下面的才是我们使用的结构体
struct sockaddr_in {
sa_family_t sin_family; /* AF_INET */
in_port_t sin_port; /* 网络字节序的端口号 */
struct in_addr sin_addr; /* IP地址 */
};
struct in_addr {
uint32_t s_addr; /* 网络字节序的IP地址 */
};
2.3listen()函数
listen()函数 | 参数 |
---|---|
头文件 | #include <sys/socket.h> #include <sys/types.h> |
函数原型 | int listen(int sockfd, int backlog); |
函数参数 | sockfd: socket函数返回的文件描述符 backlog:允许 同时连接到服务器的客户端的个数(设置成 5 或者 10 都可以 只要不是0就行)。 |
函数返回值 | 成功:0 失败:-1 |
2.4accept()函数
accept()函数 | 参数 |
---|---|
头文件 | #include <sys/socket.h> |
函数原型 | int accept(int socket, struct sockaddr *restrict address,socklen_t *restrict address_len); |
函数参数 | sockfd: socket函数返回的文件描述符 address:用来保存客户端的网络信息结构体的地址,如果不需要,可以传NULL address_len:客户端的网络信息结构体的长度,如果不需要,可以传NULL |
函数返回值 | 成功:返回一个新的文件描述符,专门用于和该客户端通信 失败:-1 |
2.5connect()函数
connect()函数 | 参数 |
---|---|
头文件 | #include <sys/socket.h> #include <sys/types.h> |
函数原型 | int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); |
函数参数 | sockfd: socket函数返回的文件描述符 addr:服务器的网络信息结构体的地址 addrlen:addr的长度 |
函数返回值 | 成功:0 失败:-1 |