Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> udp с подтверждением доставки 
:(
    Опции темы
JohnnyQ
Дата 30.3.2009, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 22.7.2007
Где: Санкт_Петербург

Репутация: нет
Всего: нет



Добрый день! 
Есть клиент-сервер на UDP. Нужно организовать подтверждение доставки.
отправка: 
Код

char buf[20000];
...
send( Socket, buf, 20000, 0 );
 
и прием
Код

recvfrom( LSocket, buf, sizeof(buf),0, (struct sockaddr *)&saclient, &saclient_length );

Хочу сделать, чтобы все отправляемые  пакеты нумеровались. Суть вопроса, номер пакета нужно отправлять в buf или есть способ передать номер пакета другим образом (можно ли передавать  не 
Код
 char buf[20000]; 
, а ,например, 
 структуру struct в которой будут храниться  
Код
 char buf[20000];  int n_packet
  ) 
PM MAIL   Вверх
SVN74
Дата 30.3.2009, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 1
Всего: 18



Цитата(JohnnyQ @  30.3.2009,  18:21 Найти цитируемый пост)
Суть вопроса, номер пакета нужно отправлять в buf 

да

Цитата(JohnnyQ @  30.3.2009,  18:21 Найти цитируемый пост)
можно ли передавать  не 
код C++
1:

 char buf[20000]; 




, а ,например, 
 структуру struct в которой будут храниться  
код C++
1:

 char buf[20000];  int n_packet

да
========
вместо send - надо sendto
PM MAIL WWW   Вверх
vinick
Дата 30.3.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 6
Всего: 22



Цитата(JohnnyQ @  30.3.2009,  18:21 Найти цитируемый пост)
char buf[20000];
...
send( Socket, buf, 20000, 0 );

ИМХО слишком большие датаграммы. Где-то я читал, что в реальности пакеты свыше 4кб большинством роутеров будут отброшены. Источник к сожалению не помню.

По сабжу - да можно.

Код

struct aaa
{
   char buf[10];
   int num;
};
...
aaa a;
...
send(fd,&a,sizeof(a));

только следи за порядком байт в номере
PM MAIL ICQ Jabber   Вверх
Anikmar
Дата 30.3.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 59



Цитата(vinick @  30.3.2009,  19:32 Найти цитируемый пост)
ИМХО слишком большие датаграммы. Где-то я читал, что в реальности пакеты свыше 4кб большинством роутеров будут отброшены. Источник к сожалению не помню.

Так в случае чего IP пакеты порежет как надо, а там соберет.
PM MAIL ICQ   Вверх
JohnnyQ
Дата 30.3.2009, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 22.7.2007
Где: Санкт_Петербург

Репутация: нет
Всего: нет



Цитата(vinick @ 30.3.2009,  19:32)
Цитата(JohnnyQ @  30.3.2009,  18:21 Найти цитируемый пост)
char buf[20000];
...
send( Socket, buf, 20000, 0 );

ИМХО слишком большие датаграммы. Где-то я читал, что в реальности пакеты свыше 4кб большинством роутеров будут отброшены. Источник к сожалению не помню.

По сабжу - да можно.

Код

struct aaa
{
   char buf[10];
   int num;
};
...
aaa a;
...
send(fd,&a,sizeof(a));

только следи за порядком байт в номере

ок! отправить мы можем, а принять данные как структуру реально??? 
например: 

Код

struct aaa
{
   char buf[10];
   int num;
};
...
aaa a;
...
recvfrom( LSocket, &a, sizeof(a),0, (struct sockaddr *)&saclient, &saclient_length );


PM MAIL   Вверх
SVN74
Дата 30.3.2009, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 1
Всего: 18



Цитата(JohnnyQ @  30.3.2009,  20:36 Найти цитируемый пост)
ок! отправить мы можем, а принять данные как структуру реально??? 

Да, создается не прерывный цикл до нужного заполнения (по размеру структуры) 

PM MAIL WWW   Вверх
vinick
Дата 30.3.2009, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 6
Всего: 22



Цитата(JohnnyQ @  30.3.2009,  20:36 Найти цитируемый пост)
recvfrom( LSocket, &a, sizeof(a),0, (struct sockaddr *)&saclient, &saclient_length );

Да именно так, только помни про выравнивание и про порядок байт.


Цитата(Anikmar @  30.3.2009,  19:37 Найти цитируемый пост)

Так в случае чего IP пакеты порежет как надо, а там соберет. 

Если будет что собирать. Насколько я понял - для UDP фрагментация нежелательна.

Добавлено через 4 минуты и 51 секунду
Цитата(SVN74 @  30.3.2009,  20:46 Найти цитируемый пост)
Да, создается не прерывный цикл до нужного заполнения (по размеру структуры) 

Разве для UDP это имеет смысл?  smile 
PM MAIL ICQ Jabber   Вверх
SVN74
Дата 30.3.2009, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 1
Всего: 18



Цитата(vinick @  30.3.2009,  20:47 Найти цитируемый пост)
Разве для UDP это имеет смысл?    

Имеет, если надо отправлять маленькими пакетами ,а именно так и надо делать...

PM MAIL WWW   Вверх
JohnnyQ
Дата 30.3.2009, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 22.7.2007
Где: Санкт_Петербург

Репутация: нет
Всего: нет



ок! всем спасибо!!! буду пробывать!!!
PM MAIL   Вверх
Anikmar
Дата 31.3.2009, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 59



Цитата(vinick @  30.3.2009,  20:47 Найти цитируемый пост)
Если будет что собирать. Насколько я понял - для UDP фрагментация нежелательна.

По моему по барабану. UDP транспортный уровень и он ничего не знает о фрагментации собственно IP пакетов - это реализуется более низким IP протколом. Он будет фрагментировать как нужно для разных сегментов сети. И на качество собственно UDP это не должно отражаться - IP гарантирует сборку пакета UDP на приемнике в том виде, в каком он ушел с передатчика, если конечно он (пакет) до приемника дойдет. Если не все соберется - пакет просто будет отброшен.

Существуют, конечно, варианты, когда складываются неблагоприятные условия (например, пакет режется на две части, а во  второй только пара байт информации). Но ИМХО - жестко подгонять размер передаваемого блока достаточно хлопотно. Можно в протоколе предусмотреть увеличение/уменьшение кадра в зависимости от условий передачи. Мы заранее не знаем какой размер кадра у принимающей стороны будет и в промежуточных узлах. (Хотя это можно выяснить, конечно).

Я встречал в разных источниках разные рекомендации:
4 кб (достаточно устаревшая рекомендация на мой взгляд)
16 Кб (вроде как для большинства сетей оптимальна)
64 Кб (чаще всего встречал в последнее время. И кажется буфер виндовых сокетов именно такого размера по умолчанию, не проверял).

А вот дойдет собственно пакет UDP до получателя или нет - это уже никто не знает. И сколько времени он будет блуждать (возможно следующий пакет придет раньше предыдущего).

Другое дело при ненадежных каналах связи повторная отправка 64К все-таки более рессурсоемка. Поэтому от четких рекомендаций я воздержусь - слишком мало у меня опыта.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.