![](/img/trans.png)
[英]error after receiving data over TCP/IP connection using Asynchronous socket communication in c#
[英]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個字節。 為什么會這樣? 我需要在MessageBox
或TextBox
打印接收到的數據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.