2009-04-29 19 views
0

のクラッシュが、私は私のコードC#の:ManualResetEvent

主要なヘルパーとして this article at msdnを使用して、私のコードを書いた:

private ManualResetEvent _AllDone = new ManualResetEvent(false); 

    internal void Initialize(int port,string IP) 
    { 
     IPEndPoint _Point = new IPEndPoint(IPAddress.Parse(IP), port); 
     Socket _Accpt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     _Accpt.Bind(_Point); 
     _Accpt.Listen(2); 

     while (true) 
     { 
      _AllDone.Reset(); 
      _Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt); 
      _AllDone.WaitOne(); <<crash here 
     } 

    } 

これは何が起こるかですが、私は(私は問題があると思った)BeginAcceptにブレークポイントを設定しましたしかし、それは通常の手順です。しかし、私は "_AllDone.WaitOne()"を実行しようとすると、サーバーがクラッシュします。

_allDoneをwin32フォームアプリケーションで使用できない場合 - プロジェクトを作成するにはどうすればよいですか?

EDITは私を言及するのを忘れてしまった

は_AllDone.Resetを()で(受け入れ)を書いたが、それは私がそこにブレークポイントを設定し、そこに行くしませんが、それは行くことはありません。私は右のそれを取得する場合

private void Accept(IAsyncResult async) 
    { 
     _AllDone.Set(); 
     Socket _Accpt = (Socket)async.AsyncState; 
     Socket _Handler = _Accpt.EndAccept(async); 

     StateObject _State = new StateObject(); 
     _State.workSocket = _Handler; 

     _Handler.BeginReceive(_State.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), _State); 

    } 
+0

例外の詳細が役に立ちます – Crippledsmurf

+0

例外はありませんが、フリーズ(クラッシュ)のみです。 –

+0

これはどのような「サーバー」ですか? Windowsサービス、または単にテストするサーバーとして動作するコンソールアプリケーション? –

答えて

1

だから、あなたはAcceptが完了するまで待つソケット接続が受信されるとすぐにAcceptを再起動し、しないようにしたい、とあなたがの同期バージョンを使用していない理由ですAccept

ソケットを指定されたアドレスとポートに接続するときにAcceptメソッドが起動しないと言っていますか?これはAcceptのことです。クライアントが接続するまで新しい着信接続を受け入れます。だから、なぜあなたはそれが "クラッシュ"し、なぜあなたのAcceptメソッドであなたのコードに到達しないと思っているのかもしれません。

ヒント:多分またSocket.AcceptAsyncを見て

編集:

internal void Initialize(int port,string IP) { 
    IPEndPoint _Point = new IPEndPoint(IPAddress.Parse(IP), port); 
    Socket _Accpt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    _Accpt.Bind(_Point); 
    _Accpt.Listen(2); 
    _Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt); 
} 

private void Accept(IAsyncResult async) { 
    Socket _Accpt = (Socket)async.AsyncState; 
    Socket _Handler; 
    try { 
     _Handler = _Accpt.EndAccept(async); 
    } finally { 
     _Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt); 
    } 

    StateObject _State = new StateObject(); 
    _State.workSocket = _Handler; 

    _Handler.BeginReceive(_State.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), _State); 
} 

注:は、着信接続を聴い非同期サーバを設定するには、あなたがどんなManualWaitEventは必要ありません。 BeginAcceptが呼び出されないように(たとえば、サーバーをシャットダウンする場合など)、終了条件も必要です。

+0

あなたの最初の声明は正しい - これは私が欲しいものです。 しかし、2番目のステートメントは間違っています。私はTCP Clientで接続しませんでした。ちょうどそのコードを呼び出してサーバーをセットアップしました。 –

+0

これまでのところ、何もクラッシュしていません。サーバーは受信クライアント接続を待機し、そのような接続が受信されたときにのみAcceptメソッドを呼び出します。 – Lucero

+0

私はあなたが私の問題を誤解していると思います。どうやってクラッシュすることなく待ちますか? –

0

私はLuceroがアプリケーションが正常に動作すると言っていると思っていると思いますが、どのように来るのか尋ねることがあります。

サーバーサイドソケットアプリケーションを使用しているときは、基本的にはサーバーにポートに接続し、接続が到着するまで待つようにします。接続が到着したら、残りのコードを実行します。

Luceroが言っていたことは、サーバーにメッセージが到着していないのに、サーバーが停止して待機しているように見えて、それが凍っているかのように見える可能性があるということです。

あなたのコードではそうですか?

関連する問題