在使用 TcpClient 和 TcpListener 发送的消息中获取垃圾数据

Getting junk data in messages being sent with TcpClient and TcpListener

我还有其他几段网络代码 运行 使用相同的代码,我以前从未见过。接收缓冲区中的剩余字节被 [=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=]\

填充

我看到这个问题问过几次,但一直没有答案。

TcpListener tlist = new TcpListener(IPAddress.Parse(ip.ToString()), 27275);

一旦有连接。 . .

byte[] byData = new byte[textBox.Text.Length];
byData = System.Text.Encoding.UTF8.GetBytes(textBox.Text);
client.Send(byData, 0, byData.Length, 0);

接收端:

byte[] bufferRec = new byte[56];
tc.Client.Receive(bufferRec, 0, 56, 0);
string output = Encoding.UTF8.GetString(bufferRec);

我通常使用的缓冲区大小是 256,实际上我很少 sending/receiving 256 字节的数据,但我从来没有看到那些剩余的字节被垃圾数据填充,只有在这种情况下。

编辑:我当然可以简单地解析出垃圾数据,但鉴于没有理由这样做,这仍然是一种奇怪的行为。

您忽略了 Socket.Receive 的 return 值,它告诉您已读取了多少字节 - 这就像忽略 Stream.Read 的 return 值一样.所以你的缓冲区包含的字节数比你实际收到的多,因此你的字符串包含很多 U+0000 字符。例如,取一个长度为 16 的缓冲区和文本 "HELLO"

buffer: 48 45 4C 4C 4f 00 00 00 00 00 00 00 00 00 00 00
Return value: 5 (5 bytes received)
Encoding.UTF8.GetBytes(buffer): "HELLO[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]"
Encoding.UTF8.GetBytes(buffer, 0, 5): "HELLO"

基本上,您应该只使用缓冲区中包含已接收数据的部分。您也不应该假设对 Receive(或 Stream.Read)的一次调用将一次性读取 所有 数据,即使您的缓冲区足够大收到它。 TCP 是一种流式传输协议,因此适用于流式传输的所有常规注意事项。如果您正在尝试编写面向消息的协议,则需要将其置于 TCP 之上(例如,通过 "header" 部分指示下一条消息中有多少数据)。

顺便说一句,直接从 TcpClient 使用底层套接字很少是个好主意 - 使用它的主要目的是您可以使用更高级别的抽象,例如 GetStream()