2014-05-21 125 views
1

我的代碼通過一個開放的套接字。此套接字可以是TCP套接字(AF_INET)或Unix域套接字(AF_UNIX)。如何確定打開的套接字是TCP還是unix域套接字?

根據套接字的域,它需要以不同的方式處理。特別是如果套接字綁定到一個地址,那麼我可能想要以不同的方式傳入連接。

確定我傳遞的套接字是否是unix域套接字或TCP套接字的最佳方法是什麼?該解決方案至少需要在OS X和Linux上運行。

getsockopt似乎允許獲得插座的類型(例如SOCK_STREAM等),但不是域。

getsockname將爲OSX上的unix域套接字返回零長度,但這是正式的bug,而Linux的行爲是different

回答

1

getsockname返回的struct sockaddr的第一個成員是sa_family,只是針對符號常量進行測試。 OSX上的錯誤可讓您在返回的地址結構爲零字節時假定unix域,對於其他平臺和域,只需檢查返回的結構。

1

getsockname()是唯一的跨平臺套接字API來查詢套接字的本地綁定地址,因此它的地址系列。

在Windows上,至少可以使用getsockopt(SOL_SOCKET, SO_PROTOCOL_INFO)檢索WSAPROTOCOL_INFO結構,該結構具有iAddressFamily字段。也許在其他操作系統上有類似的平臺特定的API。