2011-07-27 78 views
0

因此,我有一個使用異步套接字在局域網上運行的棋盤遊戲。事情是,我幾乎沒有理解異步套接字編程或線程,但我盡我所能去嘗試。需要多個發送的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("%")) 
     { 
     } 
    } 

基本上,因爲遊戲將超過消息的更多(它可以發送設置或遊戲塊等),我每次需要發送內容時都運行sender函數,另一方面,Receiver解碼基於第一個字符發送的字符串(@表示字符串是一個設置,用於例)。

問題是,第一次主機和客戶端之間發送了一些東西后,他們似乎無法再次發送。沒有錯誤,沒有消息,沒有任何東西。只是不會發送。發送功能有問題嗎?或者也許委託的東西?我不知道。一些建議,將不勝感激,夥計們。並提前致謝。

回答

3

你再也不會打電話給BeginReceive了。異步套接字編程的典型做法是處理接收到的數據,然後再次調用BeginReceive,這樣就可以處理進入的下一位數據。

+0

所以,我可以在我的sendingFunction()中添加它,或者那會毀了什麼?無論如何,謝謝你的答案。 –