Запись 2-байтового целого числа в поток? - PullRequest
0 голосов
/ 26 августа 2009

Я пытаюсь взаимодействовать с приложением по сети, которое использует простой протокол. Я должен отправить заголовок, который выглядит так:

2 байта = длина данных (включая тип запроса)
1 байт = Тип запроса

Я принимаю оба параметра как целые числа:

private static void WriteHeader(Stream buf, int length, int requestType) {
    buf.Write(BitConverter.GetBytes(length), 0, 2);
    buf.WriteByte((byte)requestType);
}

Я называю это так:

byte[] outBuf = new byte[256];
using (MemoryStream outStream = new MemoryStream(outBuf)) {
    // Socket connection stuff here
    WriteHeader(outStream, 1, 110);
    sock.Send(outBuf);
    // Receive stuff here, never returns
}

Я не получаю никаких исключений при вызове этого метода или отправке outBuf через сокет, но сетевое приложение никогда не отвечает. Однако я могу запросить его у других программ, так что я вполне уверен, что это потому, что мой заголовок написан неправильно.

Я что-то не так делаю при записи значений?

РЕДАКТИРОВАТЬ: Добавлен код MemoryStream

Ответы [ 5 ]

2 голосов
/ 26 августа 2009

Какой это тип потока? Если он буферизует ваш ввод, данные могут никогда не быть переданы по проводам.

Edit:

BitConverter.GetBytes (1) дает вам [1, 0, 0, 0], из которого вы переходите [1,0]. Может быть, это проблема с порядком байтов. Попробуйте отправить [0,1] в качестве заголовка.

1 голос
/ 26 августа 2009

Я могу думать о трех источниках ошибок в этом коде:

  • проблемы с порядком байтов: каков порядок байтов для длины 2 байта, которую вы отправляете, и уверены ли вы, что GetBytes дает байты в правильном порядке?
  • размер пакета: вы отправляете 256 байтов данных, даже если размер вашего сообщения составляет всего 3 байта.
  • полезная нагрузка: вы не помещаете какую-либо полезную нагрузку в сообщение, но для сообщения 110 могут потребоваться дополнительные данные.
1 голос
/ 26 августа 2009

Попробуйте NetworkStream:

void WriteHeader(Stream s, int len, int cmd) {
    var buf = new byte[3];
    s.Write(BitConverter.GetBytes((UInt16)len));
    s.WriteByte((byte)cmd);
}

var ns = new NetworkStream(sock);
WriteHeader(ns, 1, 110);
1 голос
/ 26 августа 2009

Могут ли быть проблемы с порядком байтов между вашим клиентом и сервером? Вы могли бы попробовать захват сетевого трафика с помощью Wireshark или аналогичного инструмента, затем сравните пакеты, отправленные / полученные с помощью вашего клиента, с другим приложением, которое успешно взаимодействует.

0 голосов
/ 26 августа 2009

Я подозреваю, что вам нужно сократить длину. Когда вы записываете int в поток, я подозреваю, что вы получите только два верхних байта, поскольку int составляет 4 байта, а вы записываете только два из них в buf.

...