У меня есть программа на C, которая получает данные от мэйнфрейма в виде UDP-пакета через сокеты. Хост программы на C меняется с Unix (с прямым порядком байтов) на Linux (с прямым порядком байтов) и программа больше не работает. В настоящее время у меня нет возможности изменить клиентскую программу мэйнфрейма.
Программа выполняет recvfrom
и получает данные в массив символов. Ранее мы могли просто привести этот буфер к структуре, соответствующей тому, что было передано из MF, и все работало отлично. Теперь из-за различий в байтах сопоставление со структурой не выполняется. Вот структура и некоторый код.
struct CCClntPkt
{
unsigned short packet_type;
unsigned short reply_socket;
unsigned long msg_ID;
unsigned short msg_length;
unsigned char client_string[250];
};
Код, ранее использовавшийся для приведения буфера полученных данных к этой структуре, выглядит примерно так:
char BCpacket_in[MAX_PACKET];
struct CCClntPkt *pClntPkt;
<snip>
rcv_cnt = recvfrom(BCServerSocket, BCpacket_in,
sizeof(BCpacket_in),0x0,(struct sockaddr *)&from,
&fromlen);
if (rcv_cnt > 0)
{
pClntPkt = (struct CCClntPkt *) &BCpacket_in;
}
Мне удалось получить правильные значения для packet_type и reply_socket с помощью ntohs
, но символьное поле client_string искажено. Я также попытался поместить pragma pack(1)
до и pragma pack(0)
после структуры, но, похоже, проблема с выравниванием по-прежнему существует.
Я также пробовал значения сдвига битов из BCpacket_in
и смог получить правильные значения для packet_type и reply_socket, но не могу понять, как извлечь ulong msg_ID. Код для этого был:
packet_type = BCpacket_in[0] << 8;
packet_type |= BCpacket_in[1];
reply_to_socket = BCpacket_in[2] << 8;
reply_to_socket |= BCpacket_in[3];
/*
msg_ID = BCpacket_in[4] << 24;
msg_ID |= BCpacket_in[5] << 16;
msg_ID |= BCpacket_in[6] << 8;
msg_ID |= BCpacket_in[7];
*/
На данный момент я довольно озадачен, поэтому любая помощь приветствуется. Я не являюсь первоначальным автором этой программы, и мои знания C довольно ограничены. Я не возражаю против выполнения этой работы, поэтому я был бы признателен, если бы мне предоставили соответствующие ссылки. Спасибо!