エラーコード EADDRNOTAVAIL で connect() コールが失敗する
Issue
- アサインポートのソケットが TIME_WAIT で開いたままの場合に、ポートアドレスが 0 の bind() システムコールで SO_REUSEADDR を用いると、connect() システムコールが EADDRNOTAVAIL になります。
- マルチホーミングのサーバーを用いている場合、ソース IP アドレスを指定するために、connect() を発行する前に bind() システムコールを使う必要があります。connect() を呼び出した際に EADDRNOTAVAIL になります。
- bind() で自動的に割り当てられた一時ポートの使用は、connect() を発行する際に EADDRNOTAVAIL エラーになります。
- カーネル 2.6.32-279.2.1 または 2.6.18-348 で、connect() コールが EADDRNOTAVAIL のエラーコードで失敗したのはなぜですか?
- connect() コールを用いたアプリケーションが、EADDRNOTAVAIL [99] のエラーコードで失敗します。
- アプリケーションやエラー発生時にアプリケーションに実行した
strace
から、"Cannot assign requested address" のエラーメッセージの表示が見えます。 - ローカルアドレスの一時ポートへのアプリケーションバインドと特定ポートのリモートノードへの接続の生成で生じます。いくつかのソケットが開かれ、バインドが成功して接続した後、これ以上の connect コールは EADDRNOTAVAIL で失敗します。これは不定期に発生します。アプリケーションは多くの接続が可能な場合もありますが、すぐに失敗する場合もあります。このアプリケーションの場合、クライアント側で SO_REUSEADDR ソケットオプションが設定されています。
Environment
- Red Hat Enterprise Linux 6.3
- Red Hat Enterprise Linux 6.4
- Kernel:
2.6.32-279.2.1.el6
- Red Hat Enterprise Linux 5.9
- Kernel:
2.6.18-348.el5
Subscriber exclusive content
A Red Hat subscription provides unlimited access to our knowledgebase, tools, and much more.