我正在研究C sockets中的connect()
和bind()
等函数,注意到它们需要一个指向sockaddr
结构的指针。阅读了一些资料后发现,为了让应用程序与AF无关,使用sockaddr_storage
结构体指针并将其转换为sockaddr
指针是有用的,因为它具有更大的地址空间。
我想知道的是,像connect()
和bind()
这样要求sockaddr
指针的函数如何访问来自指向比其预期的结构体更大的结构体的指针数据。当然,您会将提供给它的结构体的大小传递给它,但这些函数实际上使用的语法是什么,以便从您转换为struct * sockaddr
的较大结构体的指针中获取IP地址?
也许是因为我来自面向对象编程语言,所以这似乎有点像黑客技巧并且有点凌乱。
struct sockaddr_storage
的指针,名为sas
,并且结构中的所有字段都已经正确填充了地址和地址族。现在我执行以下操作:struct sockaddr *s = (struct sockaddr*)sas
。现在我要如何从s
中获取地址呢? - Matt Vaughanstruct sockaddr
。你需要将其强制转换回sockaddr_storage
或sockaddr_in
,然后再读取它。正如你在我的帖子中看到的那样,sockaddr
有足够的空间来容纳 IPv4 或 v6 地址。话虽如此,我不知道为什么你想要将其强制转换为struct sockaddr
,除了那些需要该类型参数的函数之外。struct sockaddr
不是用于“程序员使用”的。 - theprole