2016-08-14 73 views
-1

我使用套接字流,協議Tcp用於服務器和客戶端之間的連接 帶有外部IP地址。 我的問題是我沒有收到客戶端發送的完整數據! I V試圖shearch許多解決方案,我才知道,我要送Data Size一則發送Actual Data,這只是我做了什麼,例如:c#使用Tcp協議的套接字流

string Data = ""; // my data here 
string Crypted = crypt(Data); // just a method crypting string (work perfectly tested) 
byte[] DataBytes = Encoding.Unicode.GetBytes(Crypted); 
_ClientSocket.Send(BitConverter.GetBytes(DataBytes.Length),0,4,0); 
_ClientSocket.Send(DataBytes,0,DataBytes.Length,0); 

而對於接收Somethign就像是:

byte[] uffer; 
      byte[] BufferData; 
      int Size; 
      int Received; 
      uffer = new byte[4]; 
      while (true) 
      { 
       uffer = new byte[4]; 
       Size = _Client.Receive(uffer, 0, 4, 0); 
       if (Size > 0) 
       { 
        if (Size < _Client.ReceiveBufferSize) 
        { 
         BufferData = new byte[Size]; 
        } 
        else 
        { 
         BufferData = new byte[_Client.ReceiveBufferSize]; 

        } 
        Received = _Client.Receive(BufferData, 0, BufferData.Length, 0); 
        string Msg = Encoding.Unicode.GetString(buffer); 
        String Data = U.Decrypt(Msg); 

       } 

但我仍然不接收數據,如果我做了,我沒有收到它!

+0

請編輯問題以使用實際顯示問題的代碼(即完整且最小的重新創建)。注1:我過去一直使用這種方法,它已經工作了; 2.請使用正常的.NET命名約定,[SO]語法突出顯示效果會更好(這非常簡單)。 – Richard

+0

在'uffer'中的4個字節的字節,消息在'BufferData'中,但是你解碼'buffer',這在代碼片段的其他地方沒有使用。 –

+0

@Richard多數民衆贊成我的代碼其發行的代碼。 –

回答

1

我想你會把第一次收到的結果與收到的值混合在一起。

後:

Size = _Client.Receive(uffer, 0, 4, 0); 

Size將通過API調用接收的字節數,只是你使用它的大小緩衝區爲主要內容之後。

您需要將uffer的內容轉換爲int並使用它來調整下一次接收的緩衝區大小。 IE瀏覽器。你缺少的一個:

int messageSize = BitConverter.ToInt32(uffer, 0); 
BufferData = new byte [Math.Min(messageSize, _Client.ReceiveBufferSize]; 
+0

謝謝你的答案! ,但我仍然沒有得到所有的結果,我有一個foreachloop發送數據例如進程中的Foreach進程將被髮送到服務器,我只接收像4或5進程 –

+0

@CruDy添加大量的日誌記錄到你的客戶端和服務器,並通過。最不重要的事情可能就是你需要的線索。在[SO],我們只能繼續處理你提出的問題。 – Richard