一、套接字地址结构
说套接字编程,第一个就是套接字地址结构。通用的套接字地址结构定义如下:
#include <sys/socket.h> struct sockaddr{ uint8_t sa_len; sa_family_t sa_family; // address family : AF_XXX char sa_data[14]; }; |
我们在使用套接字编程时,需要往套接字结构中填入必要的信息,而这些信息根据协议族不同而不同,所以需要使用针对某个协议族的套接字地址结构sockaddr_xxx,而套接字函数为了能支持所有协议族,需要有一个形参能表示所有的sockaddr_xxx,当时C语言还不支持通用指针类型void *,因此用通用套接字地址结构sockaddr来代表所有协议族的套接字地址结构sockaddr_xxx。我们使用的是某个具体协议族的套接字地址结构sockaddr_xxx,而套接字函数的参数类型是sockaddr
*,这样我们在调用socket接口的时候需要把sockaddr_xxx对象的指针强制类型转换为sockaddr *类型。
最常用的sockaddr_xxx就是IPv4套接字地址结构sockaddr_in:
#include <netinet/in.h> struct in_addr{ in_addr_t s_addr; // 32-bit IPv4 address, network byte ordered }; struct sockaddr_in{ uint8_t sin_len; // length of structure sa_family_t sin_family; // AF_INET in_port_t sin_port; // 16-bit TCP or UDP port number, network byte ordered struct in_addr sin_addr; // 32-bit IPv4 address, network byte ordered char sin_zero[8]; }; |
其中,编程需要在意的只有三个:sin_family,虽然一定就是AF_INET,因为历史的原因还是需要在代码中写明。sin_port,端口号,常用htons()把16位数值转换成需要的network byte order二进制值。sin_addr,IP地址,常用inet_aton()将点分十进制地址字符串转换成32位的network byte order二进制值,推荐用更新的inet_pton()因为同时支持IPv4和IPv6跨协议。