2014-11-17 5 views
0

Я реализовал 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; 
} 
+0

Есть более простой способ получить размер в 'encode':' pt - buf' (но добавление '+ 1' в' strlen' делает его одним байтом большим). –

ответ

1

Посмотрите на свою функцию декодирования на стороне клиента: он «pack.seq_num =» 3 раза, затем pack.seq_num + =, , так что вы используете только последние 2 байта, поэтому он переполняет каждые 65535 пакетов. Только первая строка должна назначить pack.seq_num, добавьте 3 других (с + =).

+0

Я изменяю, как вы сказали, и это работает! Большое спасибо за быстрый и правильный ответ :) – user3852803

0

В функции decodeвы переназначить к seq_num члена для каждой строки, за исключением последних восьми бит. Таким образом, вы получите только 16 бит.

+0

Как я могу улучшить последнюю строку? – user3852803

+0

@ user3852803 Последняя строка - это только то, что в порядке, вам нужно сделать '+ =' на всех, кроме первой строки, декодирующей порядковый номер. В будущем я предлагаю вам использовать отладчик и прокручивать код за строкой, чтобы увидеть, что происходит, если вы сделали это с помощью этого кода, стало бы совершенно очевидно, что было не так. –

Смежные вопросы