Meh*_*dad 0 c sockets winapi ipv6 getaddrinfo
我不明白为什么getaddrinfo不返回有效的IPv6地址.
在我的系统上,下面的代码是打印22:B8:00:00:00:00:00:00:00:00:00:00:00:00,但我期望在01某个地方,因为localhost应该解决::1.
同时,sa_data只有14个字节,而IPv6地址是16个字节,所以似乎最后几个字节总是被切断,并且该函数不能返回IPv6地址?
有人可以解释发生了什么吗?我该如何在IPv6中使用此功能?
#include <stdio.h>
#include <WinSock2.h>
#include <WS2TCPIP.h>
#pragma comment(lib, "WS2_32")
int main(int argc, char *argv[])
{
WSADATA wsadata;
WSAStartup(0x0002, &wsadata);
addrinfo addr_hints = { 0, PF_INET6, SOCK_DGRAM, IPPROTO_UDP }, *addrs_out;
getaddrinfo("localhost", "8888", &addr_hints, &addrs_out);
fprintf(stderr,
"%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
static_cast<unsigned char>(addrs_out->ai_addr->sa_data[ 0]),
static_cast<unsigned char>(addrs_out->ai_addr->sa_data[ 1]),
static_cast<unsigned char>(addrs_out->ai_addr->sa_data[ 2]),
static_cast<unsigned char>(addrs_out->ai_addr->sa_data[ 3]),
static_cast<unsigned char>(addrs_out->ai_addr->sa_data[ 4]),
static_cast<unsigned char>(addrs_out->ai_addr->sa_data[ 5]),
static_cast<unsigned char>(addrs_out->ai_addr->sa_data[ 6]),
static_cast<unsigned char>(addrs_out->ai_addr->sa_data[ 7]),
static_cast<unsigned char>(addrs_out->ai_addr->sa_data[ 8]),
static_cast<unsigned char>(addrs_out->ai_addr->sa_data[ 9]),
static_cast<unsigned char>(addrs_out->ai_addr->sa_data[10]),
static_cast<unsigned char>(addrs_out->ai_addr->sa_data[11]),
static_cast<unsigned char>(addrs_out->ai_addr->sa_data[12]),
static_cast<unsigned char>(addrs_out->ai_addr->sa_data[13]));
freeaddrinfo(addrs_out);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
sockaddr 结构定义供参考:
struct sockaddr {
ushort sa_family;
char sa_data[14];
};
struct sockaddr_in6 {
short sin6_family;
u_short sin6_port;
u_long sin6_flowinfo;
struct in6_addr sin6_addr;
u_long sin6_scope_id;
};
Run Code Online (Sandbox Code Playgroud)
当ai_family == AF_INET6 ai_addr实际指向一个struct sockaddr_in6.您要打印的前几个字节是sin6_port和sin6_flowinfo.IPv6地址之后.
编辑添加:
您可以使用ai_addr具有类似功能直接bind()和getnameinfo().您通常不需要深入了解结构定义细节.例如,我会用getnameinfo()与NI_NUMERICHOST获得打印地址.
| 归档时间: |
|
| 查看次数: |
381 次 |
| 最近记录: |