tcpclient неправильно получает данные
Не уверен, что это TCPClient или что-то еще, я использовал сетевой анализатор для проверки того, что отправлено и получено с сервера, и данные верны, однако мое программное обеспечение получает данные неправильно.
Позвольте мне объяснить, я передаю байт запроса (05), я получаю подтверждение назад (06), затем я передаю некоторые данные, которые начинаются с байта 9B, после того, как это будет отправлено, я должен затем получить один байт 06, а затем после этого байта I должен получить байт C5, однако в соответствии с моим программным обеспечением я получаю еще один байт 06, что не соответствует данным анализатора!
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();
}
}
По словам сниффера, это то, что должно происходить
---> 05
<--- 06
---> 9b008000000080000009671101494d414745310000000000000000000000000000000153756d6d617279000000000000000000000000000000000000000000000000000002080000080000001f090100040a100012011f000000050001000000000012101e0e1e54657374696e67100012011f000000050001000000000012100d000090
<--- 06
<--- c5000100c4
И в соответствии с программным обеспечением это то, что происходит
---> 05
<--- 06
---> 9b008000000080000009671101494d414745310000000000000000000000000000000153756d6d617279000000000000000000000000000000000000000000000000000002080000080000001f090100040a100012011f000000050001000000000012101e0e1e54657374696e67100012011f000000050001000000000012100d000090
<--- 06
<--- 06
Есть идеи? Также, если у вас есть предложения по улучшению кода, я буду благодарен
1 ответ
Здесь: вы выводите неправильный буфер:
gs.Read(resp, 0, resp.Length);
gs.Flush();
outputByte(buff, "Rec"); <==== should be "resp"
ТЕМ НЕ МЕНИЕ!!!
все ваши вызовы чтения прерваны; они ДОЛЖНЫ обрабатывать возвращаемое значение, особенно при чтении нескольких байтов. Фрагментация пакетов убьет ваш код.
Правильный метод "read точно [n] bytes" "будет выглядеть так:
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);
заполнит его правильно, или ошибка, если в потоке недостаточно данных.