一、服务端监听连接
- socket
- bind
- listen
- accept
服务端监听连接
1.socket
int socket(int domain, int type, int protocol)
domain
PF_INET、PF_INET6、PF_LOCAL
type
SOCK_STREAM(字节流,对应 TCP)、SOCK_DGRAM(数据报,对应 UDP)、SOCK_RAW(原始套接字)
protocol
已废弃,一般写 0 即可
2.bind
bind(int fd, sockaddr* addr, socklen_t len)
fd
套接字描述符,socket() 函数返回值
sockaddr
通用地址格式,可能传的是 IPV4、IPV6 或本地套接字格式,会根据第三个参数 len 判断第二个参数 addr 如何解析,len 表示传入的地址长度
3.listen
int listen (int socketfd, int backlog)
socketfd
套接字描述符,socket() 函数返回值
backlog
未完成连接队列的大小
- accept
int accept(int listensockfd, struct sockaddr *cliaddr, socklen_t *addrlen)
listensockfd
套接字(监听套接字),socket() 函数返回值
cliaddr
客户端地址
addrlen
地址的大小
返回值代表当前与客户端的连接的描述字(已连接套接字)
二、客户端发起连接
- socket
- connect
客户端发起连接
- socket
int socket(int domain, int type, int protocol)
- connect
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen)
sockfd
套接字(连接套接字)
servaddr
套接字结构体指针
addrlen
套接字结构体指针大小
套接字结构体包含服务器的 IP 地址和端口号
注:如果是 TCP 套接字,调用 connect 函数将激发 TCP 三次握手,而且仅在连接成功或出错时才返回
三、通配地址
通配地址
IPV4:INADDR_ANY
IPV6:IN6ADDR_ANY
四、地址格式
通用套接字地址格式
IPV4 套接字地址格式
IPV6 套接字地址格式
本地套接字格式
通用套接字地址格式
/* POSIX.1g 规范规定了地址族为 2 字节的值. */
typedef unsigned short int sa_family_t;
/* 描述通用套接字地址 */
struct sockaddr{
sa_family_t sa_family; /* 地址族. 16-bit*/
char sa_data[14]; /* 具体的地址值 112-bit */
};
IPV4 套接字地址格式
/* IPV4 套接字地址,32bit 值. */
typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};
/* 描述 IPV4 的套接字地址格式 */
struct sockaddr_in
{
sa_family_t sin_family; /* 16-bit */
in_port_t sin_port; /* 端口口 16-bit*/
struct in_addr sin_addr; /* Internet address. 32-bit */
/* 这里仅仅用作占位符,不做实际用处 */
unsigned char sin_zero[8];
};
IPV6 套接字地址格式
struct sockaddr_in6
{
sa_family_t sin6_family; /* 16-bit */
in_port_t sin6_port; /* 传输端口号 # 16-bit */
uint32_t sin6_flowinfo; /* IPv6 流控信息 32-bit*/
struct in6_addr sin6_addr; /* IPv6 地址 128-bit */
uint32_t sin6_scope_id; /* IPv6 域 ID 32-bit */
};
本地套接字格式
struct sockaddr_un {
unsigned short sun_family; /* 固定为 AF_LOCAL */
char sun_path[108]; /* 路径名 */
};