2013-04-07 115 views
0

我目前正在異步TCP程序,但我有以下問題:TCP套接字:流發送/異步操作兩次接收

  • - 當服務器發送一些數據流,客戶第一接收一個空的緩衝區,然後它接收流。
  • - 在第一個流發送之後,如果我發送另一個流,則客戶端的緩衝區將包含發送的第一個流和當前的 流。
  • - 如果我送另一個流,緩衝區將包含我發前的數據流和當前one..and等..

這實在是煩人,我不知道哪來的問題。 這是我的客戶端代碼:

Socket CLIENT; 
byte[] _buffer; 

private void button1_Click(object sender, EventArgs e) 
{ 
    Start(); 
} 
void Start() 
{ 
    CLIENT = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    CLIENT.BeginConnect(IPAddress.Parse("the IPaddress"), 1234, new AsyncCallback(ConnectionCallBack), null); 
} 
private void ConnectionCallBack(IAsyncResult ar) 
{ 
    try 
    { 
     CLIENT.EndConnect(ar); 
     _buffer = new byte[CLIENT.ReceiveBufferSize]; 
     CLIENT.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), null); 
    } 
    catch (Exception Er) 
    { 
     MessageBox.Show("[[[[ERROR:1]]]]=>" + Er.Message); 
    } 

} 
private void ReceiveCallBack(IAsyncResult ar) 
{ 
    try 
    { 
     int lenght = CLIENT.EndReceive(ar); 
     if (lenght == 0) { return; } 
     Array.Resize(ref _buffer, lenght); 
     string stream = ASCIIEncoding.ASCII.GetString(_buffer); 
     Array.Resize(ref _buffer, CLIENT.ReceiveBufferSize); 

     CLIENT.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), null); 

    } 
    catch (Exception ex) { MessageBox.Show("[[[[hoERROR:2]]]]=>" + ex.Message); } 
} 

這裏是服務器:

private void button2_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       Socket socket = (Socket)listW.SelectedItems[0].Tag; //contains the socket 
       socket.BeginSend(_buffer,0,_buffer.Length,SocketFlags.None,new AsyncCallback(SendingCallBack),socket); 
       ServerSocket.BeginAccept(new AsyncCallback(AcceptCallBack),null); 
      } 
      catch (Exception er) { MessageBox.Show("[[[[ERROR:]]]]=>" + er.ToString()); } 
     } 
     private void SendingCallBack(IAsyncResult ar) 
     { 
      try 
      { 
       Socket socket = (Socket)ar.AsyncState; 
       _buffer = ASCIIEncoding.ASCII.GetBytes(tx1.Text); 
       socket.BeginSend(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(FinalCallBack),socket); 
      } 
      catch (Exception er) { MessageBox.Show("[[[[ERROR:3]]]]=>" + er.ToString()); } 
     } 
     private void Final(IAsyncResult ar) 
     { 
      Socket client = ar.AsyncState as Socket; 
      client.EndSend(ar); 
     } 
+0

我已經在GitHub上的一個項目,可以幫助你:https://github.com/Mellen/Networking-Samples – 2013-04-07 19:52:31

+0

謝謝,但我需要明白什麼是錯誤的,我code.where是錯誤 – Leo 2013-04-07 19:53:51

+1

我刪除了自己的新問題並且刪除了這一個,因爲刪除某人花時間回答的問題相當不敬,只是爲了讓您可以重新發布以獲得更多關注。請不要這樣做。 – 2013-04-08 19:52:37

回答

0

我覺得你有一些問題。其中一個似乎是中的stream。你從緩衝區獲得一個字符串,然後不做任何事情。調整您的緩衝區大小,然後調整大小,如果回到原來的大小似乎是一種浪費。可能會複製數據,然後撥打GetString,您可以單獨保留緩衝區。

在你的服務器,你可以調用BeginSend發送_buffer,即完成當你在SendingCallback再打電話BeginSendtx1.Text二進制表示,但你不叫EndSend,即完成您二號BeginSend調用EndSend時;但仍然沒有爲第一名稱。

+0

我不明白,我應該怎樣稱呼每次發送結束髮送,因爲我可以看到,在服務器中它已經完成了嗎? (如果這就是你說的話)。 – Leo 2013-04-07 21:16:21

+0

@leo在'SendingCallback'中,你需要調用'EndSend'傳遞'ar',就像你在'Final'中做的一樣。我不知道從那個失蹤的EndSend會產生什麼後果 - 可能不好 – 2013-04-07 21:18:30

+0

我這樣做了,但我遇到了同樣的問題。奇怪的.. – Leo 2013-04-07 21:25:40