Вопрос

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

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top