2016-11-02 12 views
0

getaddrinfo()の動作について質問があります。これはサービス引数の指定方法に依存するようです。サービスを名前として指定すると、getsaddrinfo()はgetservbyname()を使用して/ etc/servicesデータベースを照会しますが、数値的に明らかにこのような照会は行われません。getaddrinfo - 数値と名前付きサービスの結果が異なる

たとえば、service = "5672"(amqpのポート)を指定すると、service = "amqp"を指定して、プロトコルIPPROTO_TCP、IPPROTO_UDP、およびIPPROTO_IPのaddrinfo構造体のリストを返し、addrinfo構造体のリストを返しますプロトコルIPPROTO_TCP、IPPROTO_UDP、およびIPPROTO_SCTPの場合

サービスが数値で指定されている場合、getaddrinfo()が/ etc/servicesデータベースを照会しないのはなぜですか?助けてくれてありがとう。

更新:
これは、単にgetaddrinfo()がサービスパラメータを処理するように設計されていることを示しています。あなたがポート番号を知っていれば、素晴らしい。あなたがサービス名だけを知っているなら、getaddrinfo()はあなたのためにポート番号を検索します。

SCTPが私のシステム(Ubuntu 16.04)にインストールされていても、getaddrinfo()はIPPROTO_SCTPを使ってaddrinfo構造体を返しません。 getaddrinfo()のソースを見ると、それはそれが知られていたすべてのプロトコルのaddrinfo構造体を返すように見えますが、その時にはが呼び出された時点でが呼び出されました。

私はSCTPをサポートするgetaddrinfo()のバージョンを取得するためにglibcを再構築する必要があるかもしれないと思います。誰でも私の理解を確認したり修正したりできますか?

答えて

0

明らかに、プロトコル= 0とタイプ= SOCK_STREAMと仮定するコードが多くあります。は、を意味します。 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データベースを参照させ、結果に指定されたプロトコルはそこに見つかったものに基づいています。

関連する問題