我尝试用C编写IPv4 / IPv6不可知程序。getaddrinfo
的第3个参数设置为AF_UNSPEC
,因此结果可能是IPv4或IPv6。我想将结果保存到struct sockaddr_storage
,以便我以后可以重复使用它。这就是我正在做的事情:
static int init_server(const char *hostname, const char *proto, const char *port, struct sockaddr_storage *serv_addr)
{
struct addrinfo *addr;
struct addrinfo hints;
int rc;
memset(&hints, 0, sizeof(hints));
if (!strcmp(proto, "tcp")) {
hints.ai_socktype = SOCK_STREAM;
} else if (!strcmp(proto, "udp")) {
hints.ai_socktype = SOCK_DGRAM;
} else {
return 1;
}
hints.ai_family = AF_UNSPEC;
hints.ai_flags = AI_PASSIVE;
rc = getaddrinfo(hostname, port, &hints, &addr);
if (rc != 0) {
return 1;
}
memset(serv_addr, 0, sizeof(*serv_addr));
memcpy(serv_addr, addr->ai_addr, addr->ai_addrlen);
freeaddrinfo(addr);
return 0;
}
我是否正确复制了结果?我发现C socket相关的结构令人困惑,所以这可能完全是胡说八道。