2011-01-20 8 views
0

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

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

私は、何らかの一般的なエラーではなく、ポートが既に使用中であることをユーザーに通知したいと思います。

ボーナスに関する質問 - ACE_OS :: last_error()を使用することができますか?

TNX

+0

@baris_a答えがありますか?私はそれを受け入れる:) – dimba

答えて

1

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

0

はあなただけ開くように呼び出した後errnoを自分でチェックしてみましたがありますか? errno == EADDRINUSEなら、あなたはACEの助けを必要とせずにそこから好きなように扱うことができます。

1

詳細を入力していただいた場合は助かりました。アプリケーションを実行しているプラ​​ットフォームはどれですか?どのバージョンのACEライブラリを使用していますか? 1〜1024の範囲のUDPポートですか?ブロードキャストUDPソケットを使用していますか?

LinuxなどのUNIX風味で動作しているGetLastError()を "errno"にチェックしているとしましょう。 OS_S_errno.inlを見ると、異なるOS間の動作の違いを説明するコメントを見つけることができます。

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

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

関連する問題