Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2010, 08:10   #1
MMaschine
Новичок
Джуниор
 
Регистрация: 06.09.2010
Сообщений: 2
По умолчанию UDP Server - потеря пакетов. Возможно ли сделать прием более надежным

Доброго воремени суток.

Передо мной стоит задача разработки приложения, принемающего данные от устройства на базе ПЛИС и записывающего их в файл. Протокол - UDP. Устройство подключено к PC через гигабитный канал и по запросу отправляет установленное число пакетов, размером в 1 килобайт.

Проблема состоит в том, что мое приложение, использующее Indy Server теряет пакеты. Опытным путем установлено что стабильно принемается до 8 пакетов за раз. При увеличении их числа до 10-15 начинается рулетка - программа может принять с первой попытки все пакеты, а может и не принять. Что бы принять 20 пакетов - нужно предпринять довольно много попыток. О большем числе пакетов и говорить нечего.

Для контроля траффика использую WireShark, он убедительно доказывает - устройство исправно отправляет все положенные пакеты.

Версия Indy - восьмая. Пробовал скомпилировать свою прогу на Делфи с десятой версией компонентов - в результате, сервер не принемает вообще ничего. Хотя тут скорее всего сам где-то что-то накосячил и пока что не отловил баг.

Ниже представлен код работы со стороны сервера
Код:
procedure TfMain.UDPServerUDPRead(Sender: TObject; AData: TStream;
 ABinding: TIdSocketHandle);
 
var
 RegBuff:array[1..32] of byte;
 I:integer;
 
begin
//Если приходит пакет в 32 байта - заполняем табличку состояния регистров иначе - идут пакенты с данными, считаем их количество и если оно соответствует заданному, то пишем полученные пакеты в файл. 
 if AData.Size=32 then
   begin
     AData.ReadBuffer(RegBuff,AData.Size);
     for i:=1 to 32 do
       begin
         if i<17 then
           RegGrid.Cells[1,i]:=IntToStr(RegBuff[i])
             else
               RegGrid.Cells[3,i-16]:=IntToStr(RegBuff[i]);
       end//for
   end
     else
       begin
         Inc(PackCount); //PackCount - глобальная переменная, счетчик пакетов 
         Label5.Caption:=IntToStr(PackCount);
         if PackCount=StrToInt(NumPackEdit.Text) then //В NumPackEdit вводим число пакетов, которое должно отправить устройство 
           begin
             MemStream.CopyFrom(AData,AData.Size);
               if SaveDialog1.Execute then
                 begin
                   MemStream.SaveToFile(SaveDialog1.FileName);
                   MemStream.Clear;
                   PackCount:=0;
                 end//if
           end
             else
               begin
                 MemStream.CopyFrom(AData,AData.Size);
           end;
       end;
end;
З.Ы. Программист я начинающий - особого опыта работы нет, потому прислушиваюсь к "старшим товарищам". Так вот поступило следующее предложение: послать подальше Indy, использовать функции WinAPI, мол так можно будет достичь более стабильного и эффективного приема. Стоит ли следовать данному предложению (действительно ли так- эффективнее?) и если да, то может быть засоветуете хороший источник информации по предмету?

З.Ы. 2 "Старшие товарищи" пробовали использовать для приема пакетов от устройства некий Fast Net компонент, с тем же что и у меня результатом - потерей пакетов.
MMaschine вне форума Ответить с цитированием
Старый 06.09.2010, 09:52   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

старшие товарищи могли-бы и почитать, что такое UDP протокол и негарантированная доставка ...fastnet udp, это обертка над теми-же UDP сокетами ...переходи на tcp-ip, например.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 06.09.2010, 12:51   #3
MMaschine
Новичок
Джуниор
 
Регистрация: 06.09.2010
Сообщений: 2
По умолчанию

Ну протокол не я выбираю, а тот кто программирует саму "плисину". Так что пока что надо искать решение в рамках UDP протокола. К слову, пробовали замедлять скорость отправки пакетов, не особо это помогло...
MMaschine вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перехват TCP и UDP пакетов prog.delphin Работа с сетью в Delphi 4 31.03.2010 13:21
Как сделать обработчик более универсальным? k1r1ch Общие вопросы Delphi 3 11.10.2009 19:17
Получение и чтение входящих UDP пакетов XAOC-forever Работа с сетью в Delphi 6 03.06.2008 10:02
помогите сделать программу - чат (Indy UDP) dr_Lev Помощь студентам 2 02.12.2007 14:49