IPV4 套接子结构
struct sockaddr_in{
uint8_t sin_len; //套接字长度,后来加入的参数,为了支持兼容和确定长度
sa_family_t sin_family; //协议类型
in_port_t sin_port; //端口号 16位
struct in_addr sin_addr; //地址 32位
char sin_zero[8]; //未使用
};
struct in_addr {
in_addr_t s_addr; //32位地址
};
POSIX 规范只需要这个结构中的三个,family ,addr ,port, 对与这个规范来说,这个大小是可以接受的,现在很多网际协议套接字大小至少都有16字节.
但是后来一个通用的结构出现了:
struct sockaddr {
uint8_t sa_len;
sa_family_t sa_family ;
char sa_data[14];
};
所以后来的bind 需要强制转换参数类型,仅仅因为如此罢了。
ipv6 的 结构:
struct in6_addr {
unit8_t s6_addr[16];
};
struct sockaddr_in6 {
uint8_t sin6_len;
sa_family_t sin6_family;
in_port_t sin6_port;
uint32_t sin6_addr;
uint32_t sin6_scope_id;
};
套接字的传递:
从进程到内核传递套接字地址结构的函数有3个,bind ,connect,sendto.
从内核到进程传递套接字地址结构的函数一共有4个,accept,recvfrom,getsockname,getpeername.