Я реализовал udp-сервер и клиент в C. Сервер (64-разрядный ПК) отправляет udp-пакеты, которые содержат порядковые номера пакетов для клиента (также 64-разрядный ПК). Номер последовательности - беззнаковый длинный тип int. Сервер правильно считывает этот порядковый номер и отправляет пакет через сокет. Проблема на стороне клиента, она правильно считывает все пакеты до тех пор, пока не достигнет 65 535 пакетов, тогда он начнет с 0. Это не имеет смысла, потому что также на стороне последовательности на стороне клиента тип unsigned long type packageis unsigned. Ниже также моя функция кодирования на стороне сервера при декодировании на стороне клиента, возможно, вы можете увидеть ошибку? ThxC отправка структуры через сокет udp
сервер кодирования
size_t encode(packet pack, char buf[MAX_SIZE]){
size_t pack_len;
unsigned char *pt = buf;
*pt++ = (pack.tos >> 8) & 255;
*pt++ = (pack.tos & 255);
*pt++ = (pack.seq_num >> 24) & 255 ;
*pt++ = (pack.seq_num >> 16)& 255;
*pt++ = (pack.seq_num >> 8) & 255;
*pt++ = (pack.seq_num & 255);
strcpy(pt,pack.buffer);
pt += strlen(pack.buffer)+1;
pack_len = sizeof(pack.tos) +sizeof(pack.seq_num) + strlen(pack.buffer);
return pack_len;
}
клиент декодирования
packet decode(char *buf) {
packet pack;
unsigned char *pt = buf;
pack.tos = *pt++ << 8;
pack.tos += *pt++;
pack.seq_num = *pt++ << 24;
pack.seq_num = *pt++ << 16;
pack.seq_num = *pt++ << 8;
pack.seq_num += *pt++;
strcpy(pack.buffer, pt);
return pack;
}
Есть более простой способ получить размер в 'encode':' pt - buf' (но добавление '+ 1' в' strlen' делает его одним байтом большим). –