Shenanigans将sockaddr_storage转换为sockaddr

问题描述 投票:0回答:1

我有一个对象以这种方式返回垃圾inet地址,尽管from有效:

public:
     const sockaddr* getFromAddr () { return reinterpret_cast<const sockaddr*>(&from); }
private:    
     sockaddr_storage from;

原来返回的地址是160个字节。整理一下以使调试更容易:

const sockaddr* getFromAddr () { 
    auto sa = reinterpret_cast<const sockaddr*>(&from);
    return sa; 
}

然后在gdb中,在返回处中断:

(gdb) p sa
$1 = (const sockaddr *) 0x6130000000f0
gdb) p &from
$2 = (sockaddr_storage *) 0x613000000050

更让我感到困惑的是,如果我在返回之前添加它:

fprintf(stderr, "&from %p sa %p", &from, sa);

我得到:

&from 0x6130000000f0 sa 0x6130000000f0

但是调试输出再次显示sa指向from下方160个字节。

此行为无法以这种方式再现:

sockaddr_storage ss;
auto sa = reinterpret_cast<const sockaddr*>(&ss);
printf("%p %p\n", &ss, sa); 

而且这与我一直使用sockaddr_storage投射sockaddr*的唯一位置相去甚远。这只是第一次出现问题,这让我非常恐惧。

我也尝试过普通的C语言转换。我使用过memchecking,但未显示任何问题(而且,由于在强制转换中地址似乎有错误,并且该程序是一个线程,因此,除非它是一个库,否则我看不出有什么不好的地方。错误)。

c++ sockets posix
1个回答
0
投票
我将向您展示代码库中处理套接字地址的示例。它尤其可以处理IPV4和IPV6连接。

代码在等待传入连接时在Reactor中运行。连接请求将被接受。

© www.soinside.com 2019 - 2024. All rights reserved.