我正在嘗試在我的應用程序中使用sockaddr_storage
結構。我很好奇如何填補它。例如,我有下面的代碼:如何填寫sockaddr_storage?
sHostAddr.sin_family = AF_INET;
sHostAddr.sin_addr.s_addr = inet_addr (cpIPAddress);
我怎麼能代替它,如果我用sockaddr_storage
結構?我知道有一些char數組,我想我可以使用一些數組索引偏移量來獲得等價的代碼?
提前致謝。
我正在嘗試在我的應用程序中使用sockaddr_storage
結構。我很好奇如何填補它。例如,我有下面的代碼:如何填寫sockaddr_storage?
sHostAddr.sin_family = AF_INET;
sHostAddr.sin_addr.s_addr = inet_addr (cpIPAddress);
我怎麼能代替它,如果我用sockaddr_storage
結構?我知道有一些char數組,我想我可以使用一些數組索引偏移量來獲得等價的代碼?
提前致謝。
你需要施放它。例如,如果您的sin_family
爲AF_INET6
,您可以將sockaddr_storage
指針指向指針,然後填寫您需要的任何內容。
,這只是一個一般的套接字地址控股結構,大到足以容納任何 struct sockaddr_in
或struct sockaddr_in6
數據或任何未來sockaddr_xxx
..
你可以找到一個例子用法這裏:有時http://www.kame.net/newsletter/19980604/
注開發人員將重新定義此結構以代替使用聯合。這可能會有一些副作用,並且不是跨平臺的。
請注意,強制轉換打破了別名規則,因此必須在編譯器中禁用嚴格的別名優化。 –
該名稱是提示,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));
「正確的」方法是根本不填充它。採取任何'getaddrinfo'給你,或者,採取任何'recvfrom'給你。無論您在調用其中一個函數後結果如何,都是正確的,您無需擔心。 – Damon