2011-07-27 8 views
0

したがって、私はLAN経由で動作する非同期ソケットを使用するボードゲームを持っています。問題は、非同期ソケットプログラミングやスレッドの理解がほとんどないことですが、試してみるのが最善です。複数の送信を持つC#非同期ソケットプログラムの助けが必要

私は自分のプログラムをチャットプログラムに基づいているので、私はその部分を使って複数の文字列を送信します。

だから、ここのクライアントのためのコードの一部です:

private void Connect(IAsyncResult iar) 
    { 
     try 
     { 
      Socket client_conn = (Socket)iar.AsyncState; 
      client_conn.EndConnect(iar); 
      g_bmsg = new byte[1024]; 
      check = true; 

      string szData = "@Player " + lblName.Text + " connected."; 
      sendingFunction(szData); 

      g_client_conn.BeginReceive(g_bmsg, 0, g_bmsg.Length, SocketFlags.None, new AsyncCallback(Receive), g_client_conn); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString(), "GG"); 
     } 
    } 

    private void Send(IAsyncResult iar) 
    { 
     Socket client_conn = (Socket)iar.AsyncState; 
     client_conn.EndSend(iar); 
    } 

    private void Receive(IAsyncResult iar) 
    { 
     if (g_bmsg.Length != 0) 
     { 
      SetLabelText(Encoding.ASCII.GetString(g_bmsg, 0, g_bmsg.Length)); 
      check = false; 
     } 
    } 

    private void SetLabelText(string txt) 
    { 
     if (lblBuffer.InvokeRequired) 
      lblBuffer.Invoke(new MethodInvoker(delegate { SetLabelText(txt); })); 
     else 
     { 
      lblBuffer.Text = txt; 
     } 

     if (lblBuffer.Text.StartsWith("@")) 
     { 
      lblStatmsg.Text = lblBuffer.Text.Replace("@", ""); 
     } 
     if (lblBuffer.Text.StartsWith("$")) 
     { 
      lblStatmsg.Text = "Server Settings Received."; 
      lblBuffer.Text = lblBuffer.Text.Replace("$", ""); 
      option_Postn = int.Parse(lblBuffer.Text.Substring(0, 1)); 
      option_First = int.Parse(lblBuffer.Text.Substring(2, 1)); 
     } 
     if (lblBuffer.Text.StartsWith("#")) 
     { 
      MessageBox.Show(lblBuffer.Text); 
     } 
    } 

そして、ここでは、サーバーのコードの一部です:基本的に

private void Accept(IAsyncResult iar) 
    { 
     Socket server_conn = (Socket)iar.AsyncState; 

     g_server_conn = server_conn.EndAccept(iar); 

     g_bmsg = new byte[1024]; 

     check = true; 

     g_server_conn.BeginReceive(g_bmsg, 0, g_bmsg.Length, SocketFlags.None, new AsyncCallback(Recieve), g_server_conn); 
    } 

    private void Send(IAsyncResult iar) 
    { 
     Socket server_conn = (Socket)iar.AsyncState; 

     server_conn.EndSend(iar); 
    } 

    private void Recieve(IAsyncResult iar) 
    { 
     try 
     { 
      Socket server_conn = (Socket)iar.AsyncState; 

      server_conn.EndReceive(iar); 

      if (g_bmsg.Length != 0) 
      { 
       SetLabelText(Encoding.ASCII.GetString(g_bmsg, 0, g_bmsg.Length)); 
       check = false; 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString(), "GG"); 
     } 
    } 

    private void SetLabelText(string txt) 
    { 
     if (lblBuffer.InvokeRequired) 
      lblBuffer.Invoke(new MethodInvoker(delegate { SetLabelText(txt); })); 
     else 
     { 
      lblBuffer.Text = txt; 
     } 

     if (lblBuffer.Text.StartsWith("@")) 
     { 
      lblStatmsg.Text = lblBuffer.Text.Replace("@", ""); 
     } 
     else if (lblBuffer.Text.StartsWith("#")) 
     { 
      MessageBox.Show(lblBuffer.Text); 
     } 
     else if (lblBuffer.Text.StartsWith("%")) 
     { 
     } 
    } 

、ゲームはメッセージよりも多くを送信するので(それは私は何かを送る必要があるたびに送信者関数を実行し、もう一方の側では、Receiverは最初の文字に基づいて送信された文字列をデコードします(@は文字列が設定であることを意味します)。例)。

問題は、ホストとクライアントの両方が互いに何かを送った後、再び送信するように見えないことです。エラーなし、メッセージなし、何もありません。ちょうど送信しません。 sendingFunctionに何か問題がありますか?あるいは、代議員の何か?知りません。いくつかのアドバイスをいただければ幸いです。そして、事前に感謝します。

答えて

3

もう一度BeginReceiveに電話することはありません。非同期ソケットプログラミングの典型的な方法は、受け取ったデータを処理し、次にBeginReceiveを呼び出して、次に来るデータのビットを処理できるようにすることです。

+0

それでは、それを私のsendingFunctionそれは何かを台無しにするでしょうか?とにかく、答えをありがとう。 –

関連する問題