struct sockaddr 结构体,早期网络编程函数都是基于该结构体,但是随着技术的发展,ipv4协议诞生,为了向前兼容,现在sockaddr退化成了void * 作用的指针,内部会强制类型转换为所需的地址类型(sockaddr_in或者sockaddr_un或者scokaddr_in6)
sockaddr_in代表AF_INET,ipv4协议,sockaddr_un代表AF_UNIX,scokaddr_in6代表AF_INET6
定义的时候,应该定义成struct sockaddr_in,,而在实际使用时,传递参数需要强制转换一下struct sockaddr *。
bind函数,accept函数,connect函数调用时会遇到这个问题。
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
sin_port端口号,注意网络字节序与本机字节序的转换。
sin_addr ip地址,注意网络字节序与本机字节序的转换。它是个结构体,成员只有一个是
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};