tcpclient 接收数据不正确 [英] tcpclient receiving data incorrectly

查看:35
本文介绍了tcpclient 接收数据不正确的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

不确定这是 TCPClient 还是其他什么,我使用网络嗅探器检查从服务器发送和接收的内容,数据正确,但我的软件接收数据不正确.

Not sure if this is the TCPClient or something else, I have used a network sniffer to check what is being sent and received from the server and the data is correct however my software is receiving the data incorrectly.

让我解释一下,我发送了一个查询字节 (05) 我得到了一个确认 (06) 然后我发送了一些以 9B 字节开头的数据,一旦发送,我应该收到一个 06 字节,然后该字节我应该得到一个 C5 字节,但是根据我的软件,我得到另一个 06 字节,根据嗅探器的情况并非如此!

Let me explain, I transmit an enquiry byte (05) I get a acknowledgment back (06) then I transmit some data that starts with a 9B byte, once this has sent I should then receive a single 06 byte and then after that byte I should get a C5 byte, however according to my software I get another 06 byte which isn't the case according to the sniffer!

byte[] buff;
if (!this.isConnected())
    this.connect(); 

NetworkStream gs = _Socket.GetStream();

gs.Write(enq, 0, enq.Length);
gs.Flush();
outputByte(enq, "Trans"); //outputs ---> 05

buff = new byte[1];
gs.Read(buff, 0, buff.Length);
gs.Flush();
outputByte(buff, "Rec");// outputs <--- 06

if (buff[0] == 0x06)
{
    byte[] data = new byte[] {
                                            0x9B, 0x00,         0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x09,         
        0x67, 0x11, 0x01, 0x49, 0x4D, 0x41, 0x47, 0x45,         0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         0x01, 0x53, 0x75, 0x6D, 0x6D, 0x61, 0x72, 0x79,         
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,         0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x08, 0x00,         
        0x00, 0x00, 0x1F, 0x09, 0x01, 0x00, 0x04, 0x0A,         0x10, 0x00, 0x12, 0x01, 0x1F, 0x00, 0x00, 0x00,         
        0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,         0x12, 0x10, 0x1E, 0x0E, 0x1E, 0x54, 0x65, 0x73,         
        0x74, 0x69, 0x6E, 0x67, 0x10, 0x00, 0x12, 0x01,         0x1F, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00,         
        0x00, 0x00, 0x00, 0x00, 0x12, 0x10, 0x0D, 0x00,         0x00, 0x90
    };
    outputByte(data, "Trans"); /outputs --> with above byte information
    gs.Write(data, 0, data.Length);
    gs.Flush();

    buff = new byte[1];
    gs.Read(buff, 0, buff.Length);
    gs.Flush();
    // this is the first receive of 06
    outputByte(buff, "Rec");//outputs <--- 06

    if (buff[0] == 0x06)
    {
        gs.Flush();
        Console.WriteLine("fdsfsdfs");
        byte[] resp = new byte[5];
        gs.Read(resp, 0, resp.Length);
        gs.Flush();
        //this outputs <--- 06 but it should be showing <--- c5000100c4
        outputByte(buff, "Rec"); 
        gs.Write(ack, 0, ack.Length);
        outputByte(ack, "Trans");
        gs.Flush();
    }
}

根据嗅探器,这是应该发生的事情

According to the sniffer this is what should be happening

---> 05
<--- 06
---> 9b008000000080000009671101494d414745310000000000000000000000000000000153756d6d617279000000000000000000000000000000000000000000000000000002080000080000001f090100040a100012011f000000050001000000000012101e0e1e54657374696e67100012011f000000050001000000000012100d000090
<--- 06
<--- c5000100c4

根据软件,这就是正在发生的事情

And according to the software this is what is happening

---> 05
<--- 06
---> 9b008000000080000009671101494d414745310000000000000000000000000000000153756d6d617279000000000000000000000000000000000000000000000000000002080000080000001f090100040a100012011f000000050001000000000012101e0e1e54657374696e67100012011f000000050001000000000012100d000090
<--- 06
<--- 06

有什么想法吗?另外,如果您对如何改进代码有任何建议,我将不胜感激

Any ideas? Also if you have any suggestions on how to improve the code I'll be grateful

推荐答案

这里:您输出了错误的缓冲区:

Here: you are outputting the wrong buffer:

    gs.Read(resp, 0, resp.Length);
    gs.Flush();

    outputByte(buff, "Rec");  <==== should be "resp"

但是!!!

你所有的 Read 调用都被破坏了;他们必须处理返回值,尤其在读取多个字节时.数据包碎片会杀死您的代码.

all of your Read calls are broken; they MUST handle the return value, especially when reading multiple bytes. Packet fragmentation will kill your code.

正确的准确读取 [n] 个字节"的方法是:

A correct "read exactly [n] bytes" method would be:

public static void ReadExact(this Stream stream, byte[] buffer,
           int offset, int count) {
    int read;
    while(count > 0 && (read = stream.Read(buffer, offset, count)) > 0) {
        count -= read;
        offset += read;
    }
    if(count != 0) throw new EndOfStreamException();
}

那么:

gs.ReadExact(resp, 0, resp.Length);

将正确填充,如果流中没有足够的数据,则会出错.

will fill it correctly, or error if not enough data is in the stream.

这篇关于tcpclient 接收数据不正确的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆