WinSock 相关数据结构
struct sockaddr {
unsigned short sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
struct sockaddr_in {
short int sin_family; /* Address family AF_INET */
unsigned short int sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
unsigned char sin_zero[8]; /* Same size as struct sockaddr */
};
struct in_addr {
unsigned long s_addr; /* Internet address */
};
struct sockaddr_in6 {
sa_family_t sin6_family; /* AF_INET6 */
in_port_t sin6_port; /* transport layer port # */
uint32_t sin6_flowinfo; /* IPv6 traffic class & flow info */
struct in6_addr sin6_addr; /* IPv6 address */
uint32_t sin6_scope_id; /* set of interfaces for a scope */
};
struct in6_addr {
uint8_t s6_addr[16]; /* IPv6 address */
};
struct addrinfo{
int ai_flags; /* AI_PASSIVE,AI_CANONNAME,AI_NUMERICHOST */
int ai_family; /* AF_INET,AF_INET6 */
int ai_socktype; /* SOCK_STREAM,SOCK_DGRAM */
int ai_protocol; /* IPPROTO_IP, IPPROTO_IPV4, IPPROTO_IPV6 */
size_t ai_addrlen; /* Length */
char *ai_cannoname; /* */
struct sockaddr *ai_addr; /* struct sockaddr */
struct addrinfo *ai_next; /* pNext */
}
地址转换函数:
// 端口转换
u_long PASCAL FAR ntohl(u_long netlong);
u_short PASCAL FAR ntohs(u_short, netshort);
// 网络位转换成主机位
u_long PASCAL FAR htonl (u_long hostlong);
u_short PASCAL FAR htons (u_short hostshort);
// 主机顺序转换成网络顺序
// ip转换
unsigned long PASCAL FAR inet_addr (const char FAR * cp);
// inet_addr函数需要一个字符串作为其参数,
// 该字符串指定了以点分十进制格式表示的IP地址 例如:192.168.0.16
// 而且inet_addr函数会返回一个适合分配给S_addr的u_long类型的数值。
char FAR * PASCAL FAR inet_ntoa (struct in_addr in);
// Inet_ntoa函数会完成相反的转换,
// 它接受一个in_addr结构体类型的参数并返回一个
// 以点分十进制格式表示的IP地址字符串。