gpt4 book ai didi

c++ - Sockaddr union 和 getaddrinfo()

转载 作者:行者123 更新时间:2023-11-28 01:39:29 26 4
gpt4 key购买 nike

我正在编写一个从命令行提供地址的 UDP 套接字程序。

为了使发送和写入更容易,我使用 getaddrinfo 将地址转换为 sockaddr 结构:sockaddr_in 或 sockaddr_in6。现在我明白我应该使用 sockaddrs 的 union :

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 放入这个 union ?我使用 sockaddr_storage 还是 sockaddr_ins?

编辑:为清晰起见和附加代码信息而进行编辑。

最佳答案

您需要取消对指针的引用。

addr->s4 = *(sockaddr_in*) serv->ai_addr;

关于c++ - Sockaddr union 和 getaddrinfo(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47846444/

26 4 0
文章推荐: c++ - 指定应调用非成员函数而不是成员函数
文章推荐: c++ - 从函数返回一个 std::Vector 需要一个默认值