我正在尝试在我的应用程序中使用sockaddr_storage
结构。我很好奇如何填补它。例如,我有以下代码:
sHostAddr.sin_family = AF_INET;
sHostAddr.sin_addr.s_addr = inet_addr (cpIPAddress);
如果使用sockaddr_storage
结构,如何替换它?我知道有一些char数组,我想我可以使用一些数组索引偏移得到一个等效的代码?
先谢谢。
答案 0 :(得分:4)
名称是提示,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));
答案 1 :(得分:0)
你需要施展它。例如,如果您的sin_family
为AF_INET6
,则可以将sockaddr_storage
指针强制转换为sockaddr_in6
指针,然后填写您需要的内容。
它只是一个通用的套接字地址保持结构,大到可以容纳
struct sockaddr_in
或struct sockaddr_in6
数据或任何未来sockaddr_xxx
..
您可以在此处找到一个示例用法:http://www.kame.net/newsletter/19980604/
请注意,有时开发人员会重新定义此结构以使用联合。这可能会产生一些副作用,并且不会跨平台。