IPv4
#include <netinet/in.h>
struct in_addr{
in_addr s_addr; // 32bit
};
struct sockaddr_in{
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port; // 16bit
struct in_addr sin_addr; // 32bit
char sin_zero[8];
};
POSIX规范只使用
sin_family
sin_addr
sin_port
三个字段
通用套接字地址结构
#include <sys/socket.h>
struct sockaddr[
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
};
使用ANSI C时需要将指向特定协议的套接字地址结构指针强制转换为通用地址结构
int bind(int sockfd, struct sockaddr *addr, socklen_t len);
struct sockaddr_in serv;
// 强制转换
bind(sockfd, (struct sockaddr *)&serv, sizeof(serv));
新的通用套接字地址结构 sockaddr_storage
#include <netinet/in.h>
struct sockaddr_storage{
uint8_t ss_len;
sa_family_t ss_family;
};
getpeername
值-结果 参数
struct sockaddr_un cli;
socklen_t len;
len = sizeof(cli);
getpeername(unixfd, (SA *)&cli, &len);
以上的 len 使用指针形式是因为,在内核态中可能更改 cli 中地址的数据大小.