2017-08-09 6 views
-1

私は現在、自分用のソフトウェアプラットフォームを作っています。私はクライアントとサーバーの両方のソフトウェアを持っています。私は非同期ソケットを使用しており、接続にいくつか問題があります。これが私の接続機能です。何らかの理由で非同期ソケットに接続できませんでした

private bool ConnectSocket() 
{ 
    try 
    { 
     if((this.soket != null) && this.soket.Connected) 
     { 
      this.soket.Shutdown(SocketShutdown.Both); 
      Thread.Sleep(10); 
      this.soket.Close(); 
      return false; 
     } 
     this.soket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     System.Net.IPAddress adresa = System.Net.IPAddress.Parse(Properties.Settings.Default.server_ip); 
     IPEndPoint EndPoint = new IPEndPoint(adresa, 0x9de); 
     this.soket.Blocking = false; 
     AsyncCallback callback = new AsyncCallback(this.OnSocketConnect); 
     this.soket.BeginConnect(EndPoint, callback, this.soket); 
     if(this.soket.Connected) Console.WriteLine("Uspesno je konektovan socket"); 
     return true; 

    } 
    catch(SocketException ex) 
    { 
     MessageBox.Show("Dogodila se greska prilikom povezivanja na server"); 
     Console.WriteLine(ex.ToString()); 
    } 
    return false; 
} 

私のサーバーに接続していなくても、接続を認識(接続)していますが、何らかの接続があります。問題は、この時点から続行できないことです。接続されていないという例外が発生しているため、データを送信できません。また、このif文を過ぎていません。

if(this.soket.Connected) Console.WriteLine("Uspesno je konektovan socket"); 

この問題を解決する方法についてのご意見はありますか?

答えて

1

あなたは何を達成しようとしていますか?if文でキャッチしようとしていることを確認していませんか?既存のものが既に存在する場合は接続を閉じようとしていますか?ここに私が試してみたい簡単な提案があります。

private bool ConnectSocket() 
    { 
     try 
     {     
      this.soket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      System.Net.IPAddress adresa = System.Net.IPAddress.Parse(Properties.Settings.Default.server_ip); 
      IPEndPoint EndPoint = new IPEndPoint(adresa, 0x9de); 
      this.soket.Blocking = false; 
      AsyncCallback callback = new AsyncCallback(this.OnSocketConnect); 
      this.soket.BeginConnect(EndPoint, callback, this.soket); 
      if(this.soket.Connected) Console.WriteLine("Uspesno je konektovan socket"); 
      return true; 

     } 
     catch(SocketException ex) 
     { 
      MessageBox.Show("Dogodila se greska prilikom povezivanja na server"); 
      Console.WriteLine(ex.ToString()); 
     } 
     return false; 
    } 

上記の解決策は、if文で発生したように以前のものを閉じずに接続をリセットしようとしています。それだけ近い接続がnullの場合、ダブルチェックは、あなたが持っていることを確認します!= ==する場合にはnullので

private bool ConnectSocket() 
     { 
      try 
      {     
       this.soket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
       System.Net.IPAddress adresa = System.Net.IPAddress.Parse(Properties.Settings.Default.server_ip); 
       IPEndPoint EndPoint = new IPEndPoint(adresa, 0x9de); 
       this.soket.Blocking = false; 
       AsyncCallback callback = new AsyncCallback(this.OnSocketConnect); 
       this.soket.BeginConnect(EndPoint, callback, this.soket); 
       if(this.soket.Connected) Console.WriteLine("Uspesno je konektovan socket"); 
       return true; 
       if((this.soket == null) && this.soket.Connected == false)<-- or what ever the evaluation for not connection would be. 
        { 
         this.soket.Shutdown(SocketShutdown.Both); 
         Thread.Sleep(10); 
         this.soket.Close(); 
         return false; 
        } 

       } 
      catch(SocketException ex) 
      { 
       MessageBox.Show("Dogodila se greska prilikom povezivanja na server"); 
       Console.WriteLine(ex.ToString()); 
      } 
      return false; 
     } 

上記soltuionはちょうどchanesすべての権利IPアドレスなどなど作るために必要な接続

これは役に立ちます。私に知らせていない場合、私は答えを取り除きます(私は50人未満のコメントをすることはできないので、答えを使用しなければなりませんでした)乾杯!

+0

私は注意を払わなかったし、論理演算子で誤った発言をした。しかし、それでも私はそれを修正することができませんでした。私は[ManualResetEvent](https://docs.microsoft.com/en-us/dotnet/framework/network-programming/using-an-asynchronous-client-socket)で修正することができます –

+0

それを人に理解させるために!あなたが解決策を見つけた場合は、私の答えを受け入れるか、スレッドを閉じて、それを理解した後に開いていないようにしてください。あなたのプロジェクトに幸運を祈る! – Chase

関連する問題