[英]Not seeing all data received through TCP
我正在嘗試使用用作TCP客戶端的套接字接收數據,但是某種程度上,並非WireShark中顯示的所有數據在我的代碼中都可用。
使用WireShark,我可以看到傳入的數據包,並且測試工具(不是我自己制造的)以我期望的方式顯示數據。
在下面的示例中,當我打印recData
的長度時,它與數據的長度相關聯,如WireShark所示,因此到目前為止,一切似乎都還不錯。
但是,當我想將接收到的消息顯示為可讀字符串(UTF-8編碼的XML)時,我只能看到我期望的部分消息。
我使用的Socket
:
private Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private byte[] _recieveBuffer = new byte[1024];
public void Connect()
{
try
{
sock.Connect(new IPEndPoint(IPAddress.Parse(this.IpAddress), this.Port));
sock.ReceiveBufferSize = _recieveBuffer.Length;
}
catch (Exception ex)
{ }
sock.BeginReceive(_recieveBuffer, 0, _recieveBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}
private void ReceiveCallback(IAsyncResult ar)
{
int received = sock.EndReceive(ar);
if (received <= 0)
return;
byte[] recData = new byte[received];
Buffer.BlockCopy(_recieveBuffer, 0, recData, 0, received);
if (onDataReceived != null)
onDataReceived(this, new MyNewEventargs(recData));
Console.WriteLine(Encoding.UTF8.GetString(recData));
sock.BeginReceive(_recieveBuffer, 0, _recieveBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}
我注意到的是,第二個收到的包裹(圖像中突出顯示的那個)大約是第一個包裹的兩倍。
當查看軟件包的內容時,可以看到第一個包含1個完整的XML項,第二個包含2個。
但是,當我將第二個包的內容打印為字符串時,我仍然只看到一個XML項,因此第三個丟失。
我期望的完整XML消息如下所示:
<?xml version="1.0" standalone="yes"?>
<Xml>
<Element1 Attirbute1="First item" Attirbute2="0" Attirbute3="0" Attirbute4="0" Attirbute5="0">
<Element2 Attirbute1="600" Attirbute2="1" Attirbute3="bla"/>
</Element1>
</Xml>
<?xml version="1.0" standalone="yes"?>
<Xml>
<Element1 Attirbute1="Second item" Attirbute2="0" Attirbute3="0" Attirbute4="0" Attirbute5="0">
<Element2 Attirbute1="600" Attirbute2="1" Attirbute3="bla"/>
</Element1>
</Xml>
<?xml version="1.0" standalone="yes"?>
<Xml>
<Element1 Attirbute1="Third item" Attirbute2="0" Attirbute3="0" Attirbute4="0" Attirbute5="0">
<Element2 Attirbute1="600" Attirbute2="1" Attirbute3="bla"/>
</Element1>
</Xml>
控制台顯示的XML消息如下所示:
//First package
<?xml version="1.0" standalone="yes"?>
<Xml>
<Element1 Attirbute1="First item" Attirbute2="0" Attirbute3="0" Attirbute4="0" Attirbute5="0">
<Element2 Attirbute1="600" Attirbute2="1" Attirbute3="bla"/>
</Element1>
</Xml>
//First item of second package
<?xml version="1.0" standalone="yes"?>
<Xml>
<Element1 Attirbute1="Second item" Attirbute2="0" Attirbute3="0" Attirbute4="0" Attirbute5="0">
<Element2 Attirbute1="600" Attirbute2="1" Attirbute3="bla"/>
</Element1>
</Xml>
如您所見,第三個XML項丟失了。
我嘗試弄亂線程和秒表,看是否是時間問題,但是由於接收到的包的大小正確,所以我認為這不是我的問題的原因。
當我將收到的byte[]
打印到控制台時,我還沒有進行任何反序列化。
如何獲得此套接字以接收(或讓我看到)所有發送的數據?
編輯:
經過更多的調試后,我發現確實可以獲取所有數據,但是我認為Encoding.UTF8.GetString(recData)
出了點問題。
第二次調用ReceiveCallback
,接收的字節數為446,而不是221。數據被復制到byte [] recData
,並且確實包含446個字節。 當我在此行上設置斷點並將received
到的int手動更改為221時(因此它將僅將第一項復制到byte []),我得到的結果與停留在446時的結果相同。
因此,我確實獲得了所有數據,但不知何故它無法解碼為我期望的字符串。
希望這有道理..
您的“ onDataReceived”在做什么? 有什么可能影響您的邏輯嗎?
您的代碼在這里可以正常工作(至少使用通用HTML進行測試),除了上面提到的事件處理程序之外,所有字節均已接收並顯示。
(注意:不能發表評論,這就是為什么我要發表回復。隨時刪除。)
C。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.