如何填写sockaddr_storage?

unr*_*nal 6 c++ sockets

我想sockaddr_storage在我的应用程序中使用struct.我很好奇如何填补它.例如,我有以下代码:

sHostAddr.sin_family = AF_INET;
sHostAddr.sin_addr.s_addr = inet_addr (cpIPAddress);
Run Code Online (Sandbox Code Playgroud)

如果我使用sockaddr_storagestruct,如何替换它?我知道有一些char数组,我想我可以使用一些数组索引偏移得到一个等效的代码?

谢谢你提前.

Ste*_*e-o 8

名称是提示,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;
Run Code Online (Sandbox Code Playgroud)

或者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));
Run Code Online (Sandbox Code Playgroud)


Bra*_*don 4

你需要投射它。例如,如果您的sin_familyis AF_INET6,您可以将sockaddr_storage指针转换为sockaddr_in6指针,然后填写您需要的任何内容。

它只是一个通用的套接字地址保存结构,足够大以保存 数据struct sockaddr_instruct sockaddr_in6任何未来sockaddr_xxx..

您可以在这里找到一个示例用法:http://www.kame.net/newsletter/19980604/

请注意,有时开发人员会重新定义此结构以使用联合。这可能会产生一些副作用,并且不跨平台。