2011-10-18 293 views
0

我厭倦了弄清楚我的代碼出了什麼問題......請幫助我在這裏!TCP連接失敗

我想在局域網中的服務器客戶端之間創建一個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。

我會將catch中的異常類型更改爲Exception,並在左括號處設置我的斷點。下一次失敗時,您將確切知道發生了什麼問題,您可以從那裏抓住並處理它。

此外,我注意到,雖然您的客戶端作業在連接錯誤時確實返回此方法,但服務器作業不會;該異常被捕獲,消息顯示,然後繼續執行reading = new Thread(new ThreadStart(this.get_msg));。這可能會導致額外的例外,你不期望被拋出。除非你確定客戶的工作流程在這裏失敗,否則我會注意這種方法的另一方面。

至於多線程的幫助,有很多資源,包括其他關於SO的問題,可以幫助您入門。確切地說,你想要多線程,以及你需要如何控制它,這是不知道的,所以我試圖給出的任何答案可能會有錯誤,會進一步挫敗你,因爲它不是正確的方法。

+0

謝謝,你的建議是幫助完整。我發現它不是真正的連接東西創造問題......但它是線程......其實,我正在FORM LOAD上生成的事件中運行此功能。我想,我需要找到其他一些方法來運行這個功能......你有什麼想法嗎? –

+1

基本上,您應該重構事件處理程序以將所有繁重的操作放入方法中。然後,將該方法應用於某個將從處理程序啓動的線程構造;有一個Thread對象,ThreadPool,Delegate.BeginInvoke,BackgroundWorker組件等等。就像我說的,有很多方法來設置它,其中一個可能是最好的。 – KeithS

+0

感謝您提供的所有信息... –