2014-02-19 72 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));