2016-11-02 32 views
0

我對getaddrinfo()的行爲有疑問,這似乎取決於如何指定服務參數。將服務指定爲名稱會導致getaddrinfo()使用getservbyname()查詢/ etc/services數據庫,但數字指定服務顯然不會導致此類查詢,並且這可能會導致結果的差異。getaddrinfo - 數字與命名服務的結果不同

例如,指定service =「5672」(amqp的端口),返回協議IPPROTO_TCP,IPPROTO_UDP和IPPROTO_IP的addrinfo結構列表,同時指定service =「amqp」,返回一個addrinfo結構列表對於協議IPPROTO_TCP,IPPROTO_UDP和IPPROTO_SCTP。

爲什麼getaddrinfo()在數字指定服務時查詢/ etc/services數據庫?謝謝你的幫助。原來,這只是getaddrinfo()的設計目的是如何處理服務參數。如果你知道端口號,太棒了。如果您只知道服務名稱getaddrinfo()將爲您查找端口號。

對我來說真正的問題是,即使SCTP安裝在我的系統(Ubuntu 16.04)上,getaddrinfo()也不會返回帶有IPPROTO_SCTP的addrinfo結構。查看getaddrinfo()的源代碼,它看起來像它返回的所有協議的addrinfo結構,它在構建它的時候知道的關於而不是當時被調用。

我想我可能需要重新編譯glibc來獲取支持SCTP的getaddrinfo()版本。任何人都可以確認或糾正我的理解?

回答

0

顯然有很多代碼假設protocol = 0,type = SOCK_STREAM 意味着 TCP。如果getaddrinfo()返回帶有IPPROTO_SCTP的addrinfo結構,則此代碼會中斷。妥協解決方案(至少對於FreeBSD和Linux)一直是繼續getaddrinfo()返回protocol = 0和type = SOCK_STREAM的IPPROTO_TCP addrinfo結構。任何想要getaddrinfo()返回帶有IPPROTO_SCTP的addrinfo結構的人都應該在提示中指定ai_protocol = IPPROTO_SCTP。這僅適用於將服務參數指定爲數字的情況;指定爲名稱的服務將導致getaddrinfo()查詢/ etc/services數據庫,並且結果中指定的協議將基於此處找到的內容。

相關問題