Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / UDP Server иногда!!! не хочет принимать пакеты. / 25 сообщений из 30, страница 1 из 2
29.09.2018, 11:54
    #39710251
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDP Server иногда!!! не хочет принимать пакеты.
Уважаемые форумчане, для приема пакетов 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
29.09.2018, 12:05
    #39710252
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDP Server иногда!!! не хочет принимать пакеты.
"Я мог бы рассказать шутку про UDP, но она, возможно, до вас не дойдёт." (с)

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

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

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

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

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

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

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

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

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

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

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


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