powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / UDP Server иногда!!! не хочет принимать пакеты.
25 сообщений из 30, страница 1 из 2
UDP Server иногда!!! не хочет принимать пакеты.
    #39710251
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые форумчане, для приема пакетов UDP использую компонент IdUDPServer. Посылаю пакеты и через утилиту tcpdump вижу как они доходят. Запускаю мою бабалайку, и ИНОГДА бывает, что пакеты вообще не принимаются, но чаще всего принимаются.

Создаю поток, в его Execute делаю

Код: pascal
1.
2.
3.
4.
5.
begin
InitUDP;
while not Terminate
sleep(10);
end;



В самой процедуре

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
procedure InitUDP;
var
  Binding: TIdSocketHandle;
begin
  try
    
     udpSrv := TidUdpServer.Create(nil);
     udpSrv.ThreadedEvent := true;
     udpSrv.BufferSize:= 2000;  //размер пакета не превышает, сильно влияет на скорость
     udpSrv.Bindings.Clear;
     Binding := udpSrv.Bindings.Add;
     Binding.IP := FIPaddr;
     Binding.Port := FPort;
     udpSrv.OnUDPRead := udpSrvRead;
     udpSrv.Active := true;
 
  except
    on E: exception do
    begin
      //логирование ошибок
    end;
  end;

end;



Далее само событие

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
procedure udpSrvRead(AThread: TIdUDPListenerThread; const AData: TIdBytes;
  ABinding: TIdSocketHandle);
var
  sizePacket: LongInt;
  Buffer: PidBytes; //(^TidBytes)
begin
  //!!! сюда не заходит
  try
    sizePacket := Length(AData);   

    if sizePacket = 0 then
    begin
      err_udp := 1;
      ..логирование
    end
    else
    begin
      
      new(Buffer);
      SetLength(Buffer^, sizePacket);
      CopyTIdBytes(AData, 0, Buffer^, 0 , sizePacket);

      ....Buffer передали другому потоку
    end;

  except
    on E: exception do
    begin
      err_udp := 1;
      ...логирование
    end;
  end;
end;



Подскажите, в чем может быть причина?
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710252
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Я мог бы рассказать шутку про UDP, но она, возможно, до вас не дойдёт." (с)

Вероятнее всего ты не успеваешь вычитать предыдущий пакет перед приходом нового.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710253
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, я бы тогда просто терял часть пакетов или нет?
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710255
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня удивляет, что ты хоть какие-то получаешь, но это, видимо, инди-магия.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710256
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, почему?
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710261
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbпочему?

Поток, который ничего не делает, только спит в цикле - очень подозрителен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710262
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, так его задача запустить udp поток слушателя порта, а потом убить этот поток. Вы думаете, что он не дает udp потоку дышать?
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710265
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710268
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbтак его задача запустить udp поток слушателя порта, а потом убить этот поток. Вы думаете,
что он не дает udp потоку дышать?

Запускать поток чтобы тот запустил поток и убивать поток чтобы убить другой поток? Ух ты...

И это всё вместо того, чтобы тупо в первом же созданном потоке вызвать одну функцию recv()...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710270
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

если ты выбрал udp - почему ты оказался не готов к потере пакетов?
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710279
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, потому что recv() не знаю сколько ставить sleep (), а по событию не надо задумываться об этом
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710280
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасия, я готов к потере, я не готов вообще ничего не получать
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710281
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbпотому что recv() не знаю сколько ставить sleep (), а по событию не надо задумываться об этом

Угу, "можно не применять мозг". Дельфи, может, и не умирает, но вот мозг её пользователей
определённо - того...

АОТ: sleep() не нужен вообще. События приходят окну только в случае если поток, в котором
оно создано, обрабатывает очередь событий. Именно поэтому я удивлён, что создание сервера
в левом спящем потоке вообще работает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710284
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, если вы имеете ввиду, что sleep убрать из Execute будет лучше?
А насчет того, что поток вызывает поток все очень просто. Сначала я ловил через WinSock сам как раз в цикле без доп. потоков, потом появилась задача и под линукс сделать, поэтому проще было взять indy и не забивать себе голову
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710285
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
recv мне чем-то не понравился, уже не помню почему, может из-за хрен знает какой таймаут выставлять или еще чего
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710286
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, вспомнил recv ждет пакета, и пока не дождется - висит (нет пакетов - завис), а если мне надо завершить работу, то что делать с recv?
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710287
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbа если мне надо завершить работу, то что делать с recv?

Ответ тривиален - закрыть сокет. recv() вывалится с ошибкой.

PS: Под линуксом сокеты ничем не отличаются кроме отсутствия неоходимости инициализации.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710289
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbа, вспомнил recv ждет пакета, и пока не дождется - висит (нет пакетов - завис), а если мне надо завершить работу, то что делать с recv?
Выставляй таймаут или используй в отдельном треде.
Или использовать событие "данные здесь": в обработчике данные уже получены, ждать не нужно.
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710297
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробую, если и это не поможет, отпишусь.
спасибо за советы
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710311
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

Ещё довольно странная работа с буфером типа TIdBytes в процедуре OnRead. Не знаю, какая у вас версия Инди, но в последних, уже весьма давно, этот тип - динамический массив Array of bytes. Зачем у вас там New(), непонятно, достаточно объявить переменную и задать длину массива, что у вас делается. Кроме того динамический массив сам по себе неявный указатель и объявлять еще указатель на него нет необходимости.
Разве что у вас древняя Инди, но тогда не работало бы Set!ength.
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710864
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Указатель на указатель - согласен. А как без New добавлять в очередь? Я пойманный массив отправляю в очередь TQueue и в другом потоке работаю, а потом удаляю (Dispose). А без New AV вылетает
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710969
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

А ничего, что UDP протокол в принципе не гарантирует доставку пакетов?
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710984
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд, не гарантирует где? я на одной машины отправляю и получаю пакеты
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39710993
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbКвейд, не гарантирует где? я на одной машины отправляю и получаю пакеты
Файрволл смотри, настройки сетевой карты.
И все равно - никакой гарантии.
...
Рейтинг: 0 / 0
UDP Server иногда!!! не хочет принимать пакеты.
    #39711022
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасия, все отключил, я не ловлю, а tcpdump ловит
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / UDP Server иногда!!! не хочет принимать пакеты.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]