2009-03-30 10 views
0

C#のlan-messengerのシミュレーションでは、コードの機能をチェックするためにスターターだけでループバックアドレスを使用しています。しかし、いくつかのメッセージを送信した後、エンド接続を使用しているときにソケット例外が発生しますメソッドを呼び出し、データを送信する際にソケット例外を発生させます。この例外の背後には何らかの理由がありますか?ソケットプログラミング

private void button1_Click(object sender, EventArgs e) 
    { 

     HideCaret(this.textBox1.Handle); 
     StringBuilder sb = new StringBuilder(this.textBox1.Text); 
     str = this.textBox2.Text; 
     Socket newsock = new Socket(AddressFamily.InterNetwork,socketType.Stream, ProtocolType.Tcp); 
     IPEndPoint ip = new IPEndPoint(localaddress, 5555); 
     newsock.BeginConnect(ip, new AsyncCallback(connected), newsock); 
     if (str != "") 
     { 
      sb.AppendLine(this.textBox2.Text); 
      this.textBox1.Text = sb.ToString(); 
      this.textBox2.Text = "\0"; 
      send = Encoding.ASCII.GetBytes(str); 
      try 
      { 
       newsock.BeginSend(send, 0, send.Length, SocketFlags.None, new AsyncCallback(sent), newsock); 
      } 
      catch (ArgumentException) 
      { 
       MessageBox.Show("arguments incorrect in begin-send call", "Error", MessageBoxButtons.OK); 
      } 
      catch (SocketException) 
      { 
       MessageBox.Show("error in accessing socket while sending", "Error", MessageBoxButtons.OK); 
      } 
      catch (ObjectDisposedException) 
      { 
       MessageBox.Show("socket closed while sending", "Error", MessageBoxButtons.OK); 
      } 
      catch (Exception) 
      { 
       MessageBox.Show("error while sending", "Error", MessageBoxButtons.OK); 
      } 

     }         

    } 

+0

一般的なヒント:例外ハンドラでは、より具体的な情報が含まれているため、表示する内容にException.Message文字列を組み込みます。 –

答えて

4

データを送信する前にソケットが接続されるのを待っていない可能性があります。 2つのオプションがあります。

  1. connectedコールバックメソッドからデータを非同期で送信します。
  2. 接続するまでこのスレッドをブロックすることにより、データを同期的に送信します。

その後、BeginConnectへのお電話でのstateようことを渡して、新しいクラスに送信し、ソケットにデータを組み合わせることにより、1位を達成。次に、送信コードをコールバックメソッドに移動します。

System.Threading.ManualResetEventを設定し、BeginConnectの後にWaitOneを呼び出して、#2を達成します。その後、connectedコールバックメソッドでEndConnectと、ManualResetEventSetを呼び出します。上記のように送信してください。


あなたが取得しているSocketExceptionの種類を調べる場合にも、おそらく多くを学びます。 MSDNのドキュメントから

:あなたはSocketExceptionを受け取った場合

、 は、特定のエラー コードを取得するためにSocketException.ErrorCode プロパティを使用します。この コードを取得した後、エラーの詳細な の説明については、MSDNライブラリのWindowsソケット バージョン2 APIエラーコードのドキュメント を参照してください。

0

はあなたが別のスレッドのソケットからの読み取りを持っていますか助けてください?そうでなければ、あなたのソケットバッファーがいっぱいになっているでしょう。

+0

私はメッセージを受信するための非同期呼び出しを行いました。 – Avik

0

また、.Net Socket.Connectメソッドを使用すると、接続するまでコードがブロックされます。したがって、ManualResetEventを使用してWaitOneを呼び出す必要はありません。また、他のソケット非同期メソッドを使用することもできます。

関連する問題