【发布时间】:2016-10-06 17:07:41
【问题描述】:
我正在编写一些套接字代码,并且基于一些参数,我正在使用 IPv4 或 IPv6。为此,我有这样的代码:
struct sockaddr final_addr;
...
struct sockaddr_in6 addr6;
...
memcpy(&final_addr, &addr6, size);
...
bind(fd, &final_addr, size);
这很好用。但是,如果我这样做(这是我最初的想法)
struct sockaddr final_addr;
...
struct sockaddr_in6 addr6;
...
final_addr = *reinterpret_cast<struct sockaddr*>(&addr6);
...
bind(fd, &final_addr, size);
然后它在bind 上失败并出现Cannot assign requested address 错误。
请注意,如果我切换到 IPv4 的 sockaddr_in,这个不正确的代码可以正常工作。
这里发生了什么?为什么我不能将sockaddr_in6 重新解释为sockaddr?
【问题讨论】:
-
sockaddr是一个不透明的指针,可以备份sockaddr_in(IPv4) 或sockaddr_in6(IPv6)。除了sin_family字段之外,这些结构完全不同。reinterpret_cast和memcpy()都不能正常工作以从一个转换为另一个。 -
sockaddr_in6 的定义中是否有 const 关键字?
-
我想你误会了。我已经删除了大部分初始化代码。该代码与 memcpy 一起工作正常(套接字绑定并正常工作)。但是 reinterpret_cast 失败了。
-
它可能是 sockaddr 定义的某种限定符。你能让你的 IDE 找到 sockaddr 的定义吗?
-
@πάνταῥεῖ 我不是专家,但我不认为你是正确的。我见过的每个资源都会在
bind上将sockaddr_in6*转换为sockaddr*(例如stackoverflow.com/questions/13504934/…)否则你怎么称呼bind?还是通过()进行的演员有什么不同?
标签: c++ sockets reinterpret-cast