本文主要记录网络编程中经常用到的函数,作为学习的笔记
1、winsocket地址结构
一般的sockaddr地址结构:
typedef struct sockaddr {
u_short sa_family; //协议族
CHAR sa_data[14]; //IP地址和端口号
} SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR;
除了以上的不常用的地址结构外,还有一个常用的地址结构:
typedef struct in_addr {
union {
struct { UCHAR s_b1, s_b2, s_b3, s_b4; } S_un_b;
struct { USHORT s_w1, s_w2; } S_un_w;
ULONG S_addr;
} S_un;
} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
typedef struct sockaddr_in {
short sin_family; //协议族
u_short sin_port; //端口号
IN_ADDR sin_addr; //IP地址
CHAR sin_zero[8]; //填充数据
} SOCKADDR_IN, *PSOCKADDR_IN;
以上两种地址结构用法相似,作为相同;相比于sockaddr,sockaddr_in的数据段更为详细,可以使用sockaddr_in来初始化然后强制转化为sockaddr,然后将其作为套接字函数的参数。sockaddr_in为了保证与sockaddr相同的长度,还增加了8字节的填充数据。
此外winsocket还提供了对ipv6的支持。
typedef struct in6_addr {
union {
UCHAR Byte[16];
USHORT Word[8];
} u;
} IN6_ADDR, *PIN6_ADDR, FAR *LPIN6_ADDR;
typedef struct sockaddr_in6 {
ADDRESS_FAMILY sin6_family; // ipv6协议族
USHORT sin6_port; // 端口号
ULONG sin6_flowinfo; // ipv6流信息
IN6_ADDR sin6_addr; // ipv6地址
union {
ULONG sin6_scope_id;
SCOPE_ID sin6_scope_struct;
};
} SOCKADDR_IN6_LH, *PSOCKADDR_IN6_LH, FAR *LPSOCKADDR_IN6_LH;
除了以上地址类型外,winsocket2还增加了addrinfo结构用于描述地址信息,该结构在getaddrinfo函数中使用,以链表的形式保存地址信息
addrinfo结构的结构如下:
typedef struct addrinfo
{
int ai_flags; // getaddrinfo函数的调用选项
int ai_family; // 地址族
int ai_socktype; // 套接字类型
int ai_protocol; // 协议
size_t ai_addrlen; // ai_addr指向的sockaddr结构缓冲区字节长度
char * ai_canonname; // 主机的正规名称
_Field_size_bytes_(ai_addrlen) struct sockaddr * ai_addr; // 以sockaddr结构描述的地址信息
struct addrinfo * ai_next; // 指向下一个addrinfo结构
}ADDRINFOA, *PADDRINFOA;
参数1(ai_flags):指定如何处理地址和名字,常见的参数值如下:
AI_PASSIVE 0X00000001 // 套接字地址将用于监听绑定
AI_CANONNAME 0x00000002 // 返回一个规范名
AI_NUMERICHOST 0x00000004 // 以数字形式返回主机地址
AI_NUMERICSERV 0x00000008 // 以端口号返回服务
AI_ALL 0x00000100 // 查找IPv4和IPv6地址
AI_ADDRCONFIG 0x00000400 // 查询配置的地址类型(IPv4或是IPv6)
AI_V4MAPPED 0x00000800 // 如果没有找到IPv6地址,则返回映射到IPv6格式的IPv4地址
参数2(ai_family):指定地址族,常见的地址族如下:
AF_INET 2 //IPv4:
AF_INET6 23 //IPv6
AF_UNSPEC 0 //协议无关
参数3(ai_socktype):指明套接字的类型,套接字类型如下:
SOCK_STREAM 1 /* 流式套接字 (TCP)*/
SOCK_DGRAM 2 /* 数据包套接字(UDP)*/
SOCK_RAW 3 /* 原始套接字 */
SOCK_RDM 4 /* 可靠传输套接字*/
SOCK_SEQPACKET 5 /* 在UDP的基础上提供伪数据包 *
参数4(ai_protoco