7

現在、私の C# .net アプリケーションは次のことを行っています (とりわけ):

  1. 特定のポートでソケットを開き、命令を待つスレッドを作成します。
  2. メッセージが着信すると、ソケット スレッドがメッセージを読み取り、イベントを発生させます。
  3. イベント ハンドラーは、必要な関数を呼び出してメッセージを解析し、アプリケーションの起動などの必要なアクションを実行します。
  4. 指定された外部「アプリケーション」が非同期で起動します。

アプリケーションが再起動しても、外部アプリケーションが閉じない場合、ソケットが閉じないようです。その後、そのポートで再度通信を開始しようとすると、エラーが発生します。ただし、外部アプリケーションを閉じるとすぐに、そのポートでソケットを開くことができます。

プログラムが正しく終了していないようです。終了時にソケットを強制終了する必要がありますが、外部プロセスが実行されている場合、そのソケットは決して閉じません。

何か案は?

4

4 に答える 4

16

外部プロセスをどのように開始するかを見たので、これは単なる刺し傷です。Process オブジェクトを作成している場合、次のように設定していないと思います。

ProcessStartInfo.UseShellExecute = true;

UseShellExecute が false に設定されている場合、子プロセスは開いているソケット ハンドルを親プロセスから継承します。これにより、親アプリケーションが閉じられていても、ソケットは開いたままになります。

于 2012-04-19T19:26:21.310 に答える
1

ここで見つけたものから、これは新しいプロセスが親からハンドルを継承し、問題を引き起こしているという疑いが確認される可能性があります。

そのリンクからコードをコピーして貼り付けるだけで、ハンドルを継承しないようにフラグを設定して Windows CreateProcess API を直接呼び出すことができるようです。

もう 1 つの別のアイデアは、コマンド ライン情報を受け取り、起動して終了する中間ランチャー プログラムを作成することです。この余分な間接化により、必要な場所にほとんど労力をかけずに到達できる場合があります。

于 2012-04-19T19:23:34.913 に答える
0

using キーワードでこれを解決できるかもしれません

using (Socket socket = new Socket()) {
//The code
}

他のアプリケーションはソケットをまったく使用していませんか?

于 2012-04-19T19:15:33.390 に答える
0

最初に、アプリケーションが閉じられたときのソケットの状態を調べます。ソケットは TIME_WAIT 状態にある可能性があります。これは、他のメッセージが受信されないようにするためにしばらく待機することを意味します。ここでそれについて読むことができます: http://www.isi.edu/touch/pubs/infocomm99/infocomm99-web/ これで、どれが接続終了手順を開始したかに応じて、ソケットで TIME_WAIT 状態が生成されます。したがって、何らかの理由でソケットがサーバー サイトでクローズ アクションを実行し、次にサーバー サイト (サーバーのポート) でソケットが状態を TIME_WAIT に変更する場合、ソケットが TIME_WAIT である間にサーバー アプリケーションを再起動すると、新しいソケットはリッスン ポートへのバインドに失敗します。これがあなたが遭遇した問題だと思います。

于 2012-04-19T19:25:00.640 に答える