簡體   English   中英

在C#中接收TCP / IP套接字數據時出現問題

[英]Problem in receiving TCP/IP socket data in C#

在調試模式下,我正在通過TCP / IP套接字接收3144字節的數據,但執行時卻收到1023字節。 為什么不讀取剩余數據?

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();

在逐步調試中,我得到了3144個字節的DataLen ,它可以正常工作。 但是,在執行過程中,我收到的DataLen為1023個字節。 為什么會這樣? 我需要在MessageBoxTextBox打印接收到的數據str

您似乎假設您將在一個Receive調用中接收所有數據。 TCP / IP是一種流協議-您不應該做這個假設。

您需要循環,讀取適當的數據。 理想情況下,協議應該告訴您如何在每個“消息”(或任何等效概念)中讀取數據,或者在完成寫入后關閉套接字。 在任何一種情況下,您都會知道何時閱讀所有內容。 另一種方法是包括定界符,這意味着您仍然會在閱讀完整的“消息”時知道-但您可能已經閱讀了下一條消息的開頭。

您應該循環接收部分數據,直到獲得全部。
看一下下面的代碼:

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM