如何填充sockaddr_storage?

9

我想在我的应用程序中使用sockaddr_storage结构体。我想知道如何填充它。例如,我有以下代码:

sHostAddr.sin_family = AF_INET;
sHostAddr.sin_addr.s_addr = inet_addr (cpIPAddress);

如果我使用sockaddr_storage结构体,如何替换它?我知道有一些char数组,我想我可以使用一些数组索引偏移来获得等效的代码吗?

提前谢谢。


“正确”的方法是根本不要填写它。接受getaddrinfo提供给你的任何内容,或者接受recvfrom提供给你的任何内容。在调用这些函数之后,在结构中出现的任何内容都是正确的,你不需要担心。 - Damon
2个回答

9

名称是提示,sockaddr_storage仅用于存储,不能用于访问。请与特定协议结构的联合使用:

union {
  struct sockaddr         sa;
  struct sockaddr_in      s4;
  struct sockaddr_in6     s6;
  struct sockaddr_storage ss;
} addr;
memset (&addr.s4, 0, sizeof(struct sockaddr_in));
addr.s4.sin_family = AF_INET;
addr.s4.sin_addr.s_addr = INADDR_ANY;

或者 memcpy,例如。

struct sockaddr_storage storage;
struct sockaddr_in sin;

memset (&sin, 0, sizeof (sin));
sin.sin_family = AF_INET
sin.sin_addr.s_addr = inet_addr ("127.0.0.1");
memcpy (&storage, &sin, sizeof (sin));

4
您需要进行类型转换。例如,如果您的 sin_familyAF_INET6,则可以将 sockaddr_storage 指针转换为 sockaddr_in6 指针,然后填写您需要的内容。
它只是一个通用的套接字地址结构,足够大,可以容纳 struct sockaddr_instruct sockaddr_in6 数据或任何未来的 sockaddr_xxx
您可以在此处找到一个示例用法:http://www.kame.net/newsletter/19980604/ 请注意,有时开发人员会重新定义此结构以使用 union。这可能会产生一些副作用,并且不跨平台。

1
请注意,强制类型转换会破坏别名规则,因此必须在编译器中禁用严格别名优化。 - Steve-o

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接