2014-02-19 31 views
2

我正在尝试在我的应用程序中使用sockaddr_storage结构。我很好奇如何填补它。例如,我有下面的代码:如何填写sockaddr_storage?

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

我怎么能代替它,如果我用sockaddr_storage结构?我知道有一些char数组,我想我可以使用一些数组索引偏移量来获得等价的代码?

提前致谢。

+0

“正确的”方法是根本不填充它。采取任何'getaddrinfo'给你,或者,采取任何'recvfrom'给你。无论您在调用其中一个函数后结果如何,都是正确的,您无需担心。 – Damon

回答

0

你需要施放它。例如,如果您的sin_familyAF_INET6,您可以将sockaddr_storage指针指向指针,然后填写您需要的任何内容。

,这只是一个一般的套接字地址控股结构,大到足以容纳任何 struct sockaddr_instruct sockaddr_in6数据或任何未来sockaddr_xxx ..

你可以找到一个例子用法这里:有时http://www.kame.net/newsletter/19980604/

注开发人员将重新定义此结构以代替使用联合。这可能会有一些副作用,并且不是跨平台的。

+0

请注意,强制转换打破了别名规则,因此必须在编译器中禁用严格的别名优化。 –

2

该名称是提示,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));