2009-03-30 11 views
0

lan-messengerをシミュレートするときに、現在のコードをテストするためにループバックアドレスを使用しています。送信している最初のメッセージを受信できるようになっています。その後、メッセージはありませんソケットを介してメッセージを受信する

private void accepted(IAsyncResult iar) 
    { 
     Socket server = (Socket)iar.AsyncState; 
     Socket client = server.EndAccept(iar); 
     if (client.Connected) 
     { 
      try 
      { 
       client.BeginReceive(receive, 0, receive.Length, System.Net.Sockets.SocketFlags.None, new AsyncCallback(rec), client); 
      } 
      catch (ArgumentException) 
      { 
       MessageBox.Show("arguments incorrect in begin-receive call", "Error", MessageBoxButtons.OK); 
      } 
      catch (SocketException) 
      { 
       MessageBox.Show("error in accessing socket while receiving", "Error", MessageBoxButtons.OK); 
      } 
      catch (ObjectDisposedException) 
      { 
       MessageBox.Show("socket closed while receiving", "Error", MessageBoxButtons.OK); 
      } 
      catch (Exception) 
      { 
       MessageBox.Show("error while receiving", "Error", MessageBoxButtons.OK); 
      } 

     } 

これは始まり、受け取るメソッドが実行されるコールバック関数は次のとおりです。?接続が行われるコールバック関数は これを助けがソケットバッファのクリアを行うには何もsocket.Isをされるしなさい到達します:

void rec(IAsyncResult ar) 
    { 

     StringBuilder receivedData; 
     //String oldvalue; 
     Socket remote = (Socket)ar.AsyncState; 
     int recv = remote.EndReceive(ar); 
     receivedData = new StringBuilder(Encoding.ASCII.GetString(receive, 0, recv)); 
     //MessageBox.Show(receivedData.ToString(), "received", MessageBoxButtons.OK); 
     StringBuilder sb = new StringBuilder(this.textBox1.Text); 
     sb.AppendLine(receivedData.ToString()); 
     if (textBox1.InvokeRequired) 
     { 
      this.Invoke((MethodInvoker)delegate { this.textBox1.Text = sb.ToString(); }); 

     } 
     remote.Close(5); 
     return; 
    } 

受け取ったデータを変数に代入するために、stringbuilderやstringのデータ型と何か関係がありますか?ここで

+0

送信と受信の両方のコードを入力してください。 –

答えて

1

は間違っている何

http://www.devarticles.com/c/a/C-Sharp/Socket-Programming-in-C-Part-I/1/

http://www.devarticles.com/c/a/C-Sharp/Socket-Programming-in-C-sharp-Part-II/

...ソースコードとC#のソケットプログラミング上の2部構成のチュートリアル、あるデザインに完全に依存。ポーリングですか?または、イベントを待っていますか?

ソースは、このページに添付download.zipファイルです:これを見てみましょう http://www.developerfusion.com/article/3918/socket-programming-in-c-part-1/

+0

私はそれが必要であるとは思わない。私はそれが追加される必要がある簡単なコードを確認します。私は最初に送信されたメッセージを受け取りました。その後、メッセージは到着していません。 – Avik

1

。 WaitForDataがそれ自身をどのように呼び出すかに注目してください。これにより、2番目以降のメッセージを受信できます。

これ以上のデータを待つことはありません。

private void OnClientConnect(IAsyncResult asyn) 
    { 
     m_Client = m_Listener.EndAccept(asyn); 
     WaitForData(); 
    } 
    private void WaitForData() 
    { 
     buffer = new byte[1024]; 
     m_Client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), null); 
    } 
    private void OnDataReceived(IAsyncResult asyn) 
    { 
     int iRx = 0; 
     iRx = m_Client.EndReceive(asyn); 

     if (iRx > 0) 
     { 
      PacketReceiver.BytesReceived(buffer); 
     } 

     if (m_Client.Connected == true) 
      WaitForData(); 
    } 
+0

私はこのコードを可能な限り同様に作成しようとしました。何も動作していないようです。 とにかく助けてもらえますか? メッセージは1回目に入っています。それ以降のメッセージはありません。 – Avik

+0

- ネットワークコード全体を意味します。 –

+0

私は何が起こっているのか理解していると思います。begin-acceptメソッドは一度だけ呼び出されています。スレッドを使用することとは別に、begin-acceptに非同期呼び出しを継続的に行うことはできますか? – Avik

0

あなたのREC方法でBeginReceiveを呼び出すために忘れてしまった:ここ

はあなたのコードがどうあるべきかです:もちろん

void rec(IAsyncResult ar) 
{ 
    StringBuilder receivedData; 
    //String oldvalue; 
    Socket remote = (Socket)ar.AsyncState; 
    int recv = remote.EndReceive(ar); 
    receivedData = new StringBuilder(Encoding.ASCII.GetString(receive, 0, recv)); 
    //MessageBox.Show(receivedData.ToString(), "received", MessageBoxButtons.OK); 
    StringBuilder sb = new StringBuilder(this.textBox1.Text); 
    sb.AppendLine(receivedData.ToString()); 
    if (textBox1.InvokeRequired) 
    { 
    this.Invoke((MethodInvoker)delegate { this.textBox1.Text = sb.ToString(); }); 

    } 
    remote.BeginReceive(receive, 0, receive.Length, System.Net.Sockets.SocketFlags.None, new AsyncCallback(rec), remote); 
    //remote.Close(5); 
    return; 
} 

このコードではなくソケットを閉じませんが、よりをお待ちしていますデータ。あなたのsendメソッドで、各メッセージに異なるソケットを作成している場合、BeginReceiveではなくBeginAcceptを呼び出す必要があります。

希望します。

関連する問題