1

既に開いている UDP ポートを開こうとすると、ACE_SOCK_Dgram::open() が失敗しました。予想通り、strace は bind() が失敗し、errno が EADDRINUSE に設定されていることを示しています。

どのようなエラーが発生したかを確認するために ACE_OS::last_error() を使用しましたが、更新されていません。

一般的なエラーではなく、ポートが既に使用されているという有益なエラーをユーザーに提供したいと思います。

おまけの質問 - ACE_OS::last_error() はいつ使用できますか?

TNX

4

3 に答える 3

1

問題を見つけました。私はACE_OS::last_error()をマクロに使用しました(はい、マクロは悪いです)。これはいくつかのリンクに拡張されました。システムコールを実行した行の1つであるため、errnoの値が変更されました

于 2011-01-24T06:50:48.430 に答える
1

詳しく教えていただけると助かります。アプリケーションを実行していたプラットフォームは? 使用している ACE ライブラリのバージョンは何ですか? 1 ~ 1024 の範囲の UDP ポートでしたか? ブロードキャスト UDP ソケットを使用していますか?

GetLastError() ではなく "errno" をチェックしているため、Linux などの UNIX フレーバーで実行していると仮定しましょう。OS_S_errno.inl を見ると、異なる OS 間の動作の違いを説明するコメントが見つかります。

最初にUDPソケットのEADDRINUSEを取得する理由を尋ねていません。SO_REUSEADDR オプションを使用していますか? その場合、ソケットにバインドされた最後のプロセスのみが通知され、OS によって動作が異なる可能性があることに注意してください。

bind() の後に別のシステム関数呼び出しが発行される可能性はありますか? その場合、bind() によって返されたエラーは、後続のシステム コールによってリセットされる場合があります。last_error() の実装からわかるように、Windows では "errno = ::GetLastError()" を設定するだけで、UNIX では errno をそのまま返します。

于 2011-01-22T20:03:08.317 に答える
0

errno開くように電話した後、自分自身をチェックしてみましたか?errno == EADDRINUSEそこから好きなように扱えれば、エースの手を借りなくてもいいように思えます。

于 2011-01-22T19:24:31.613 に答える