我正在编写一个从命令行提供地址的 UDP 套接字程序。
为了使发送和写入更容易,我使用 getaddrinfo 将地址转换为 sockaddr 结构:sockaddr_in 或 sockaddr_in6。现在我明白我应该使用 sockaddrs 的联合:
typedef union address
{
struct sockaddr s;
struct sockaddr_in s4;
struct sockaddr_in6 s6;
struct sockaddr_storage ss;
} address_t;
据我了解,它们不能成为避免隐藏严格别名问题的指针。我无法将 getaddrinfo 的 addrinfo 中的信息无缝放入此 address_t 中:
struct addrinfo hint, *serv = NULL;
address_t addr;
hint.ai_family = AF_UNSPEC;
hint.ai_flags = 0;
hint.ai_socktype = SOCK_DGRAM;
hint.ai_protocol = IPPROTO_UDP;
ret = getaddrinfo(address_sr.c_str(), s_port.c_str(), &hint, &serv);
//address_sr and s_port are strings with the address and port
switch (serv->ai_addr) {
case AF_INET: {
addr->s4 = * (sockaddr_in*) serv->ai_addr;
//Here I want to fill the address_t struct with information
//This line causes a segfault
}
break;
case AF_INET6: {
addr->s6 = * (sockaddr_in6*) serv->ai_addr;
//Conversion here
}
break;
另外,复制内存:
memcpy(&addr, serv->ai_addr, serv->ai_addrlen);
也会导致段错误。
我应该怎么做?我尝试了十几种不同的方法,但我就是想不通。如何将 addrinfo 中的地址放入此联合?我使用 sockaddr_storage 还是 sockaddr_ins?
编辑:为清晰起见和其他代码信息进行编辑。