我正在尝试执行基本操作,例如使用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
吗? (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/