Преобразование данных по протоколу скользящего окна, C - PullRequest
0 голосов
/ 22 марта 2012

Проблема, которая у меня есть, очень специфична.

Я должен реализовать протокол скользящего окна в C по ссылке. Мой файл sender.c получает в качестве параметров скорость, задержку и процент потерянных или поврежденных файлов. Данные отправляются по ссылке. Поскольку это школьное задание, я не знаю деталей реализации ссылки, но, поскольку отправитель и получатель обязаны инициировать связь с портом и ip, я полагаю, они используют сокеты. В любом случае, я пытаюсь отправить получателю параметры подключения, чтобы использовать их для таймаутов и потока управления. Я создаю полезную нагрузку фрейма данных, которая отправляет 2 целых числа, представляющих скорость и задержку, используя:

int s = (int)(*speed - '0'); int d = (int)(*delay - '0'); sprintf(t.payload,"%d%d",s,d);

Когда я печатаю переменные s и d в файле отправителя, результат равен 1,1, что правильно. После этого я отправляю полученную зарплату получателю, где полезная нагрузка [0] назначается другой переменной int, называемой скоростью, а полезная нагрузка [1] назначается другой int, называемой задержкой. проблема в том, что здесь они имеют значение 49, а не одно, как следует. Я попытался использовать для них функцию atoi (), но при этом задержка успешно преобразуется в 1, а скорость - в 11, что не имеет смысла. Я пробовал много разных способов заставить его работать, отправка их в виде символов и преобразование их на принимающей стороне также не помогло.

Есть идеи?

PS: извините за гигантский пост и мои ошибки в английском!

1 Ответ

1 голос
/ 22 марта 2012

Я предполагаю, что 't' является структурной переменной, а полезная нагрузка является массивом символов.Вы отправляете два числа как массив символов.Невозможно преобразовать их обратно в целые числа из символа * без какой-либо хитрости.Например, если ваша полезная нагрузка - «12345», то как извлечь два правильных числа, которые вы отправили со стороны?Все, что вы знаете, это «12345», это объединение двух чисел.Это может быть (1,2345) или (12,345) или (1234, 5) .... и т. Д.

Я бы посоветовал вам дважды запустить команду send и получить соответственно.Например:

char str[10]; //a temporary variable

sprint(str,"%d", speed);
send (.......); //receive just delay alone on the other side

sprint(str,"%d", delay);
send(........);

Альтернативой может быть вставка символа в качестве идентификатора и токенизация (strtok) при извлечении чисел.Например:

sprint(t.payload, "%dZ%d",speed, delay); //sender side
/* Here 'Z' is used as a delimiter */

На стороне получателя:

char *tok, *str;

receive(str, ....);

tok=strtok(str,"Z");
speed = atoi(tok);
tok=strtok(NULL);
delay=atoi(tok); 

Если вы отправляете более 2 номеров, вы позаботитесь о strtok и вставке 'Z' соответственно.

...