gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:52:20 24 4
gpt4 key购买 nike

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

填充

我看到这个问题问了好几次,但从来没有答案。

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,实际上我很少发送/接收 256 字节的数据,但我从来没有看到那些剩余的字节被垃圾数据填满,只有在这种情况下。

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

最佳答案

您忽略了 Socket.Receive 的返回值它告诉您已读取了多少字节 - 这就像忽略 Stream.Read 的返回值一样。所以你的缓冲区包含的字节数比你实际收到的多,因此你的字符串包含很多 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\0\0\0\0\0\0\0\0\0\0\0"
Encoding.UTF8.GetBytes(buffer, 0, 5): "HELLO"

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

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

关于c# - 在使用 TcpClient 和 TcpListener 发送的消息中获取垃圾数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37442873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com