Наше приложение представляет собой сервер C (эта проблема относится к порту Windows указанного сервера), который взаимодействует с клиентом Windows Java. В этом конкретном случае мы отправляем данные клиенту, в частности, сообщение состоит из 7-байтового заголовка, где все первые 3 байта имеют определенное значение (тип операции, флаги и т. Д.), А последние 4 байта содержат размер Остальная часть сообщения. По какой-то причине я абсолютно не могу понять, третий байт в заголовке как-то меняется; если я ставлю точку останова на send()
, я вижу, что третий байт - это то, что я ожидаю (0xfe
), но когда я проверяю клиента, этот байт устанавливается в 0. Каждый другой байт в порядке , Я сделал некоторый захват трафика с помощью WireShark и увидел, что байт равен 0, покидая сервер, что я нахожу еще более странным. Третий байт устанавливается через определение, ala:
#define GET_TOP_FRAME 0xfe
Некоторые тесты, которые я провел, еще больше запутывают проблему:
- Я изменил значение с использования определения на первое
0x64
, 0xff
, 0xfd
: все попадало на клиента.
- Я изменил значение с использования определения на само использование
0xfe
: значение было нулевым на клиенте.
- Я изменил значение самого определения с
0xfe
на 0xef
: значение было нулевым на клиенте.
Ничто в этом не имеет смысла. Код проходит несколько уровней функций, но вот основная часть кода:
int nbytes; /* network order bytes */
static int sendsize = 7;
unsigned char tbuffer[7];
tbuffer[0]= protocolByte;
tbuffer[1]= op;
tbuffer[2]= GET_TOP_FRAME;
nbytes = htonl(bytes);
memcpy((tbuffer+3), &nbytes, JAVA_INT);
send(fd, tbuffer, sendsize, 0);
Где fd
- это предварительно собранная розетка, protocolByte
, op
и bytes
предварительно установлены. Затем он отправляет оставшуюся часть сообщения с очень похожей командой отправки сразу после этой. Как я уже говорил, если я поставлю точку останова на эту функцию отправки, tbuffer будет содержать именно то, что я ожидаю.
У кого-нибудь есть идеи? Я полностью в тупике; Ничто об этом не имеет смысла для меня. Спасибо.