IPv4套接字地址结构:
套接字都需要有一个指向套接字地址结构的指针作为参数。每个协议簇都定义它自己的套接字地址结构。这些结构的名字均已sockaddr_开头,并以对应每个协议族的唯一后缀结尾。
windows引入了winsock2后,程序在link时需要的库文件也发生了变化。winsock.h对应的是wsock32.lib,而winsock2需要的是ws2_32.lib。这是需要注意的地方,否则连编会失败。同时,有些程序是include了<windows.h>。这个头文件本身包含了<winsock.h>,这是就需要注意include的顺序,<winsock2.h>必须在<windows.h>之前include,才能避免重复定义的问题。
#include <WINSOCK2.H>
#pragma comment(lib,"ws2_32.lib")
或
#include <WINSOCK.H>
#pragma comment(lib,“wsock32.lib”)
且
#include <WINSOCK2.H>
#include <WINSOCK.H>
--WINDOWS下的IPv4结构:<winsock2.h>
l in_addr是一个结构体表示地址信息,其中in_addr.s_addr表示一个网络序形式的IPv4地址,可以使用inet_addr()函数对点式地址进行转换。
l 其中sockadr_in表示IPv4的SOCKET地址结构,IPv6不能用;
--UNIX下的IPv4结构:<netinet/in.h>
struct in_addr { /* 32-bit IPv4 address */
in_addr_t s_addr; /* network byte ordered */
};
struct sockaddr_in {
uint8_t sin_len; /* length of structure(16) */
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]; /* unused */
}
--通用套接字地址结构:UNIX:<sys/socket.h>
当作为一个参数传递进任何套接字函数时,套接字地址结构总是以引用形式(也就是以指向该结构的指针)来传递。然而以这样的指针作为参数之一的任何套接字函数必须处理来自所有支持的任何协议簇的套接字地址结构。
于是定义了这样的地址结构:
于是套接字函数被定义为以指向某个通用套接字结构的一个指针作为其参数之一,这正如bind函数的ANSI C函数原型所示:
这就要求对这些函数的任何调用都必须要将指向特定于协议的套接字地址结构的指针进行强制类型转换,变成指向某个通用套接字地址结构的指针。
--UNIX下的IPv6结构:<netinet/in.h>
struct in6_addr { /* 128-bit IPv6 address */
unit8_t s6_addr; /* network byte ordered */
};
struct sockaddr_in {
uint8_t sin6_len; /* length of structure(28) */
sa_family_t sin6_family; /* AF_INET */
in_port_t sin6_port; /* 16-bit TCP or UDP port number */
/* network byte ordered */
unit32_t sin6_flowinfo; /* flow information, undifined */
struct in6_addr sin6_addr; /* 128-bit IPv6 address */
/* network byte ordered */
uint32_t sin6_scope_id; /* set of interface for a scope */
}
--WINDOWS下的IPv6结构:#include <ws2tcpip.h>
当我们创建SOCKET时,启用AF_INET则表示IPv4,启用AF_INET6则表示IPv6;