2016-07-10 17 views
0

TCP/IPリスナーを開こうとしていますが、以下のコードを実行するとクラッシュします。クラッシュするとフリーズして応答を停止するので、エラーは発生しません。単純なTCP/IPクライアントを起動できません

TcpListener server = new TcpListener(IPAddress.Any, 619); 
TcpClient client; 

private void button3_Click(object sender, EventArgs e) 
{ 
    server.Start(); 
    client = server.AcceptTcpClient(); 

    if (client.Connected) 
    { 
     MessageBox.Show("connected"); 
    } 
} 

私はこのポートが無料であることを知っています。それはそうではありません。次の行でクラッシュします。

client = server.acceptTcpClient(); 
+1

A「クラッシュ」は非常に具体的なものです警告なしでただ終了する)。あなたは本当にクラッシュしていますか?あなたがしていない場合、それは 'AcceptTcpClient()'メソッドが返されていないことだけです、あなたは**全く問題はありません**。そうした場合は、問題を確実に再現し、これまでデバッグするために行ったことを説明する良い[mcve]を提供してください。 –

答えて

0

あなたは「クラッシュ」のアプリケーションの外観を与えるUIスレッド上のブロッキング呼び出しを実行しています。

別のスレッドを使用するか、非同期で処理する必要があります。バックグラウンドワーカーは出発点かもしれません。

private BackgroundWorker bgw = new BackgroundWorker(); 

public MainWindow() 
{ 
    InitializeComponent(); 
    bgw.DoWork += Bgw_DoWork; 
    bgw.RunWorkerCompleted += Bgw_RunWorkerCompleted; 
    bgw.WorkerSupportsCancellation = true; 
} 

private void button3_Click(object sender, EventArgs e) 
{ 
    if (!bgw.IsBusy) 
    { 
     bgw.RunWorkerAsync(); 
     ((Button)sender).Content = "Cancel"; 
    } 
    else 
    { 
     bgw.CancelAsync(); 
    } 
} 

private void Bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    button.Content = "Start"; 
} 

private void Bgw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 
    var server = new TcpListener(IPAddress.Any, 619); 
    server.Start(); 
    while (true) 
    { 
     if (worker.CancellationPending) 
     { 
      e.Cancel = true; 
      server.Stop(); 
      break; 
     } 
     else 
     { 
      if (server.Pending()) 
      { 
       var client = listener.AcceptTcpClient(); 
       // handle client here or do something like below to return the client to the RunWorkerCompleted method in 
       // e.result 
       e.Result = client; 
       break; 
      } 
     } 
    } 
} 

は、他のそのようなserver.AcceptTcpClientAsyncを(使用などのオプション)の代わりにポーリングserver.Pending()プロパティがあります。また、この間にThread.Sleepを使用せずにこのようにポーリングを行うと、プロパティが頻繁にチェックされ、サイクルが浪費されてしまうという過酷な状態になる可能性があります。

これに続いて、アプリケーションに合った方法でクライアントを処理する方法を理解する必要があります。 1クライアントあたり1クリックは受け入れられますか?リスナをキャンセルするまで、新しい接続を永遠に処理しますか?プロセス_terminates_、一般的にスローされた例外のようなエラーメッセージのいくつかの特定の種類(とが、非常にまれ過程ます:など幸運

BackgroundWorker tutorial

AcceptTcpClientAsync MSDN

+0

ああ、ありがとう、それはより意味があります、もし両方が同じコンピュータにあるときにクライアントプログラムに接続できるかどうか知っていますか?私はあまりにも動作していないこのコンピュータ上にも仮想マシンがあります –

0

これは予想される動作です。あなたのプログラムがクラッシュしていない - 着信接続を待ってAccpetTcpClient()ブロックへの呼び出しを:

https://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.accepttcpclient(v=vs.110).aspx

また、あなたのプログラムを実行していきます、別のスレッドからポート619へのTCP接続を開く必要があります。

+0

私はそれを今修正しました。クライアントとサーバーを同じラップトップで実行できるかどうか分かりますか?私もここに仮想マシンを持っていますが、それはどちらでも動作しません –

+0

もちろん。 2つの.NETプロジェクトを作成し、それらを独立して実行するだけです。 –

+0

ええと私はそれを接続していない、私はそのプログラムやネットワークthats問題があるかどうかを伝えることはできません –

0

AcceptTcpClientブロッキング方法

https://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.accepttcpclient%28v=vs.110%29.aspx)です。

AcceptTcpClientを呼び出すと、接続が確立されるまで待機します。メインスレッド(GUIも実行中)で待機するため、プログラムがフリーズしているように見えます。 AcceptTcpClientAsyncを使用するか、受け入れ部分を別のスレッドに入れてみてください。それはあなたの問題を解決するはずです。

Desirius

+0

私はそれを今修正しました。クライアントとサーバーを同じラップトップで実行できるかどうか分かりますか?私もここに仮想マシンを持っていますが、どちらもうまく動作しません –

関連する問題