Написание 2-байтового целого числа в потоке?
-
19-09-2019 - |
Вопрос
Я пытаюсь взаимодействовать с приложением по сети, которое использует простой протокол. Я должен отправить заголовок, который выглядит так:
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
Через гнездо, но сетевое приложение никогда не отвечает. Я могу запрашивать это с другими программами, поэтому я совершенно уверен, что это потому, что мой заголовок не написан правильно.
Я делаю что -то не так при написании ценностей?
РЕДАКТИРОВАТЬ: Добавлен код памяти
Решение
Какой это тип потока? Если он буферист ваш вход, данные никогда не могут быть отправлены через проволоку.
Редактировать:
BitConverter.getBytes (1) дает вам [1, 0, 0, 0], из которого вы проходите [1,0]. Может быть, это проблема с энджеанской. Попробуйте отправить [0,1] в качестве вашего заголовка.
Другие советы
Могут ли быть проблемы с эндсианами между вашим клиентом и сервером? Вы можете попробовать захватить сетевой трафик с помощью Вирешарк Или аналогичный инструмент, затем сравните пакеты, отправленные/полученные с помощью вашего клиента, против какого -либо другого приложения, которое успешно общается.
Попробуйте 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);
Я могу вспомнить три источника ошибок в этом коде:
- Проблемы с эндианностью: каков байтовый порядок по длине 2 байта, которую вы отправляете, и вы уверены, что Getbytes дает байты в правильном порядке?
- Размер пакета: вы отправляете 256 байтов данных, даже если ваше сообщение составляет всего 3 байта размера.
- Полезная нагрузка: вы не помещаете никакой полезной нагрузки в сообщение, но сообщение 110 может потребовать дополнительных данных.
Я подозреваю, что вам нужно сделать вашу длину короткой. Когда вы переходите к потоку, я подозреваю, что вы получите только два лучших байта, так как INT составляет 4 байта, и вы пишете только два из них в BUF.