2017-03-31 37 views
1

我正在編寫一個客戶端,它既可以連接到IPv4地址,也可以連接IPv6地址,從而儘可能使代碼儘可能通用。 我用getaddrinfo函數傳遞IP地址的字符串,並從中獲得地址族(此時我知道它是IPv4還是IPv6)。現在我需要將該地址和端口綁定到sockaddr結構。我讀過,爲了使它通用,我應該使用sockaddr_storage,然後通過將其轉換爲sockaddr來使用它,但我不知道如何用連接所需的地址和端口填充sockaddr_storage。使用sockaddr_storage獨立於IP版本創建和連接套接字

感謝您的關注。

注意:我希望它能在UNIX上工作。

回答

1

POSIX specification只是說sockaddr_storage應該

  • 大到足以容納一個適當的邊界對齊,使指針它可以對所有支持的特定協議的地址結構

  • 作爲指向特定於協議的地址結構的指針並用於訪問那些沒有對齊問題的結構的字段

而且

的struct sockaddr_storage的結構應至少包含以下成員:

sa_family_t ss_family

有一些筆記說,所有sockaddr - 家庭結構family結構成員將在同一個地方,但就是這樣。

所以,我要說的是,「最好」的方式來使用它是對IPv4和IPv6的特殊情況下,在正確的sockaddr_in或結構填充,然後memcpy他們進入以後可以使用sockaddr_storage結構。

+0

謝謝!這解決了我的問題。 – Mdp11