2010-09-23 60 views
0

在調試模式下,我通過TCP/IP套接字接收3144字節的數據,但在執行時收到1023字節。爲什麼不讀取其餘的數據?在C#中接收TCP/IP套接字數據時出現問題

IPEndPoint ipEnd = new IPEndPoint(ipAdd, ipPort); 
Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
soc.Connect(ipEnd); 
byte[] sendData = Encoding.ASCII.GetBytes("msg"); 
soc.Send(sendData); 
int byteLen = 4*1024; 
byte[] RecData = new byte[byteLen]; 
int DataLen = soc.Receive(RecData, 0, RecData.Length, SocketFlags.None);// Here I placed breakpoint 

string str = Encoding.ASCII.GetString(RecData, 0, DataLen); 
MessageBox.WriteLine(str); 
soc.Close(); 

一步一步的調試,我得到DataLen爲3144字節,它工作正常。不過,在執行期間,我收到DataLen爲1023字節。爲什麼會發生?我需要在MessageBoxTextBox中打印收到的數據str

+1

選擇代碼,然後單擊「101010」圖標好的格式作爲編輯的版本 – 2010-09-23 15:05:09

回答

3

您似乎認爲您會收到單個Receive呼叫中的所有數據。 TCP/IP是一個流媒體協議 - 你不應該這樣做。

您需要循環讀取儘可能多的數據。理想情況下,你的協議應該告訴你數據如何作爲每個「消息」的一部分(或者你的等價概念)讀取,或者在完成寫入時關閉套接字。無論在哪種情況下,你都會知道你什麼時候閱讀過所有的東西。另一種方法是包含一個分隔符,這意味着當您閱讀完整的「消息」時,您仍然可以知道 - 但您也可以也有可能會讀取下一條消息的開頭。

1

您應該在循環中接收部分數據,直到完全掌握。
看看以下代碼:

void Receive(Socket socket, byte[] buffer, int offset, int size) 
{ 
    int received = 0; 
    do { 
    try { 
     received += socket.Receive(buffer, offset + received, size - received, SocketFlags.None); 
    } 
    } while (received < size); 
} 
+0

看到好!它工作正常。 – 2010-09-24 13:48:11

+0

如何在不使用「socket.Available」的情況下找到套接字中的可用字節。 – 2010-09-24 13:51:33