2011-10-18 39 views
0

私のコードに何が間違っているかを知ることに疲れています...私を助けてください!TCP接続に失敗しました

LANのサーバークライアント間にTCP接続を作成しようとしています。何が起こるかは、クライアントが接続しようとするとプログラムがクラッシュすることです。 コードを参照してください。

public void Go() 
     { 
      if (whatjob == true) 
      { 
       IPEndPoint server_ipEndPoint = new IPEndPoint(IPAddress.Any, PortNum); 
       server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
       server_socket.Bind(server_ipEndPoint); 
       try 
       { 

        server_socket.Listen(1); 
        server_GotClient = server_socket.Accept(); 
       } 
       catch (SocketException e) 
       { 
        MessageBox.Show("Unable to listen..."); 
        MessageBox.Show(e.ToString()); 
       } 


       reading = new Thread(new ThreadStart(this.get_msg)); 
       reading.Start(); 
      } 

      if (whatjob == false) 
      { 
       IPEndPoint client_ipEndPoint = new IPEndPoint(IPAddress.Parse(IpAddress), PortNum); 
       client_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
       try 
       { 
        client_socket.Blocking = true; 
        client_socket.Connect(client_ipEndPoint); //here it stops execution 
        //client_socket.BeginConnect(client_ipEndPoint, new AsyncCallback(NowConnected), client_socket); 
       } 
       catch (SocketException e) 
       { 
        MessageBox.Show("Unable to connect..."); 
        MessageBox.Show(e.ToString()); 
        return; 
       } 
       reading = new Thread(new ThreadStart(this.get_msg)); 
       reading.Start(); 
      } 

whatjobがブール値である...本当の意味は、サーバー・ジョブと偽の手段は、クライアントの仕事を行う

この機能は、チャットウィンドウの内部のWindowsフォームです。それはclient_socket.connect(ipendpoint)まで到達したとき、それがクラッシュしても、チャットウィンドウdeformatedさ...

スレッド機能

public void get_msg() 
     { 
      byte[] byte_message = new byte[1000]; 
      string string_message = null; 
      int x = 0; 
      while (true) 
      { 
       if (server_GotClient != null) 
       { 
        x = server_GotClient.Receive(byte_message); 
       } 
       if (client_socket != null) 
       { 
        x = client_socket.Receive(byte_message); 
       } 

       if (x != 0) 
       { 
        string_message = Encoding.ASCII.GetString(byte_message); 
        this.richTextBox_GetMessage.Invoke(new MethodInvoker(delegate 
        { 
         richTextBox_GetMessage.Text = richTextBox_GetMessage.Text + "\nFriend: " + string_message; 

        })); 
       } 
       x = 0; 
      } 
      server_socket.Close(); 
     } 

このコードについて助けてください。 さらに追加するには、私は非同期技術の知識がない、簡単な方法で私を助けてください。

+1

例外はありますか? –

答えて

2

完全なエラーメッセージを知るのに役立ちます。

あなたが示したことから、私の考えは、スローされる例外はSocketExceptionではないということです。 Socket.ConnectのMSDNドキュメントは、SocketExceptionを含む4つの例外をスローできることを示しています。

catchの例外の種類をExceptionだけに変更し、開始ブラケットにブレークポイントを設定します。次に失敗すると、間違っていることを正確に知り、そこからキャッチして処理できます。

また、クライアントジョブが接続エラーでこのメソッドから復帰しても、サーバージョブは返されません。例外がキャッチされ、メッセージが表示されてから、実行がreading = new Thread(new ThreadStart(this.get_msg));で続行されます。これにより、期待していない追加の例外がスローされる可能性があります。ここでクライアントのジョブフローが失敗していると確信していない限り、この方法の反対側に注意を払います。

マルチスレッドの助けとして、開始に役立つその他の質問など、多くのリソースがあります。あなたがマルチスレッドにしたいことと、それを制御できるようにする必要がある方法は分かっていないので、私がしようとする答えにはおそらく正しいアプローチではないので、さらにあなたを苛立たせるエラーがあります。

+0

ありがとうございました、あなたのアドバイスは完全に助けになりました。私はそれが本当に問題を作成する接続のものではないことがわかりました...しかし、それはスレッドです...実際には、私はフォームの負荷で生成されたイベントでこの関数を実行しています。私は、私はこの機能を実行するためのいくつかの他の方法を見つける必要があると思います...あなたは何か考えていますか? –

+1

基本的には、メソッドハンドラをすべてリファクタリングして、すべての重労働をメソッドに入れる必要があります。次に、そのメソッドをハンドラから起動するいくつかのスレッド構造に渡します。スレッドオブジェクト、ThreadPool、Delegate.BeginInvoke、BackgroundWorkerコンポーネントなどがあります。私が言ったように、これを設定するための多くの方法がありますが、そのうちの1つはおそらく「ベスト」でしょう。 – KeithS

+0

すべての情報をありがとう... –

関連する問題