我正在尝试执行基本操作,例如使用SOCKADDR C Union进行复制和相等性比较。

#ifdef AF_INET6

#define SOCKADDR        union { \
                            struct sockaddr_in him4; \
                            struct sockaddr_in6 him6; \
                        }

#define SOCKADDR_LEN    (ipv6_available() ? sizeof(SOCKADDR) : \
                         sizeof(struct sockaddr_in))

#else

#define SOCKADDR        union { struct sockaddr_in him4; }
#define SOCKADDR_LEN    sizeof(SOCKADDR)

#endif

假设我的堆栈上有一个SOCKADDR sa,它是用下面的UDP recvfrom方法创建的:
void *buf = (void *)jlong_to_ptr(address);
SOCKADDR sa;
socklen_t sa_len = SOCKADDR_LEN;
jint n = recvfrom(fd, buf, len, 0, (struct sockaddr *)&sa, &sa_len);

太好了,到目前为止一切顺利!
  • 如果我想重复自己的sa,我可以只做SOCKADDR newSA = sa吗?
  • 是否对所有UNION都适用,换句话说,我只能分配给副本?
  • 为什么我必须将联合强制转换为(struct sockaddr*),而且由于在联合声明中看不到sockaddr,这怎么可能进行强制转换?
  • 关于相等性,我可以只为逻辑等效性做sa1 == sa2吗?
  • 最佳答案



    是的你可以。



    如果union包含指针,则需要小心一点。 “分配给副本”将创建两个联合副本,并带有指向公共(public)内存的单独指针。



    您必须进行强制转换以使其与'recvfrom'函数签名匹配。

        ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                 struct sockaddr *src_addr, socklen_t *addrlen);
    



    “recvfrom”所需的包含文件也包含“struct sockaddr”的定义



    'C'中为No(在C++中可能带有运算符重载)。
    此操作在'C'中没有意义。即使sa1和sa2的内容可以相同,但是它们是位于独立内存位置的两个独立结构,并且'C'中的'=='运算符仅了解内置类型(int,char等)。在C++中,情况有所不同,因为运算符可能会过载,并且您可以定义比较标准。

    关于c - 使用C UNIONS的基本操作,例如SOCKADDR。如何复制?还是比较?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48220292/

    10-12 17:05