Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Очень быстрый прием UDP пакетов / 25 сообщений из 53, страница 1 из 3
13.12.2019, 15:57
    #39902646
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
Тестил на своей виртуальной машине компоненты ICS, Indy и стандартные WinSock (Win7-64, rio.1, win64)
ICS и Indy плюс минус 2480 пакетов успевают поймать, через стандартный WinSock 4700 пакетов, а отправляю я 9000 пакетов
WireShark ловит все 9000.
Причем при получении пакета я ничего не делаю, кроме как увеличиваю кол-во принятых пакетов.

Какими средствами вы пользуетесь?
...
Рейтинг: 0 / 0
13.12.2019, 16:02
    #39902656
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
в Indy использую idUDPServer событие OnRead, в WinSock recv, в ICS взял демку с TWSocket
...
Рейтинг: 0 / 0
13.12.2019, 16:40
    #39902701
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
cptngr,
какой размер пакета?
...
Рейтинг: 0 / 0
13.12.2019, 16:41
    #39902702
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
s62, 1500 байт +- летят
...
Рейтинг: 0 / 0
13.12.2019, 16:50
    #39902710
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
defecator на чем-то писал видеосервис, не жаловался. :) может отметится...
...
Рейтинг: 0 / 0
13.12.2019, 17:04
    #39902723
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
wadman, у него вроде на IOCP
...
Рейтинг: 0 / 0
13.12.2019, 17:07
    #39902726
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
cptngrbWireShark ловит все 9000.

А на какой стороне этот WireShark?

И ты бы это... код показал хотя бы для WinSock. А то окажется внезапно, что у тебя там
ProcessMessages() в цикле...

PS: И да, я никогда не использую UDP.
...
Рейтинг: 0 / 0
13.12.2019, 17:19
    #39902733
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
Dimitry Sibiryakov,

Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
constructor TReceiverUDP.Create(const AAdrIP: ansistring; const APort: word; const ASocketBufferSize, ALogType: integer);

begin

  inherited Create(True);
  Priority:= tpHighest;
  FreeOnTerminate:= false;
  ServerAddr.sin_family := AF_INET;
  ServerAddr.sin_addr.S_addr := inet_addr(PansiChar(AAdrIP));
  ServerAddr.sin_port := htons(APort);
  FSocketBufferSize:= ASocketBufferSize;
  FLogType:= ALogType;
  //{$IFDEF DEBUG}
  FPacketCount:= 0;
  //{$ENDIF}
end;

procedure TReceiverUDP.DestroyUDP;
begin
  try
    CloseSocket(FSocket);
    WSACleanup;
  except
    on E: exception do
    begin
      WriteMessage(FormatDateTime('yyyy_mm_dd_hh:nn:ss', now) +' - (!ОШИБКА)  закрытие сокетов. ' + E.message);
    end;
  end;
end;

procedure TReceiverUDP.Execute;
begin
  if InitUDP then begin
    while not Terminated do
    begin
      ReceiverPackage;
    end;

    //{$IFDEF DEBUG}
    WriteMessage(FormatDateTime('yyyy_mm_dd_hh:nn:ss', now) + ' - (!ИНФ) : Кол-во принятых пакетов = '+inttostr(FPacketCount));
    //{$ENDIF}
  end;
  DestroyUDP;
end;

function TReceiverUDP.InitUDP: boolean;
var
  Len:Integer;
  errCode: integer;
  Arg: u_long;
begin
  Result:= False;
  try
    if WSAStartup($0101, wData) = 0 then begin
      FSocket := Socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
      if bind(FSocket, ServerAddr, SizeOf(ServerAddr)) = Socket_Error then
      begin
        errCode:= WSAGetLastError();
        WriteMessage(FormatDateTime('yyyy_mm_dd_hh:nn:ss', now) +  ' - (!ОШИБКА)  bind socket вернул ошибку #'+errCode.ToString);
      end
       else begin
        Len:= SizeOf(Integer);
        if SetSockOpt(FSocket, SOL_SOCKET, SO_RCVBUF, @FSocketBufferSize, Len) = Socket_Error then
        begin
          errCode:= WSAGetLastError();
          WriteMessage(FormatDateTime('yyyy_mm_dd_hh:nn:ss', now) +  ' - (!ОШИБКА)  Установка буфера приема сокета #'+errCode.ToString);
        end
        else begin
          {если вдург широковещательный канал
          EnBroad:=1;
          SetSockOpt(FSocket,SOL_Socket,SO_Broadcast,PChar(@EnBroad),SizeOf(Integer));}
          {  перевожу сокет в неблокирующий режим  }
          Arg:=1;
          if IOCtlSocket(FSocket, FIONBIO, Arg) = Socket_Error then
          begin
            errCode:= WSAGetLastError();
            WriteMessage(FormatDateTime('yyyy_mm_dd_hh:nn:ss', now) +  ' - (!ОШИБКА)  Установка неблокируемого режима работы сокета #'+errCode.ToString);
          end;
          //GetSockOpt(FSocket, SOL_SOCKET, SO_RCVBUF, vInt);
          Result:= True;
        end;
      end;
    end;
  except
    on E: exception do
    begin
      WriteMessage(FormatDateTime('yyyy_mm_dd_hh:nn:ss', now) +  ' - (!ОШИБКА)  инициализация модуля приема UDP не выполнена' + E.message);
    end;
  end;
end;

procedure TReceiverUDP.ReceiverPackage;
var
  sizePacket: LongInt;
  Buffer: array [0..DefBufferSize-1] of byte;
begin
  if SERVICE_STOP = 1 then exit;

  try
    sizePacket:= Recv(FSocket, Buffer, DefBufferSize, 0);
    if sizePacket > 0 then
    begin
      //{$IFDEF DEBUG}
      inc(FPacketCount);
      //{$ENDIF}


    end;
  except
    on E: exception do
    begin

    WriteLog(FormatDateTime('yyyy_mm_dd_hh:nn:ss', now) + ' - (!Ошибка) :' + E.message);
    end;
  end;

end;
...
Рейтинг: 0 / 0
13.12.2019, 17:19
    #39902734
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
Вангую переменную длину пакета, без указания/считывания этой длины в протоколе
...
Рейтинг: 0 / 0
13.12.2019, 17:22
    #39902739
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
cptngrb

ICS и Indy плюс минус 2480 пакетов успевают поймать


Indy наверняка доп. поток на каждый пакет заводят, а затем удаляют. А на это время требуется. Потоки создаются со скоростью примерно 10 тыс. в сек. С какой скоростью удаляются - не мерил.
Там вроде можно пул потоков использовать. Не пробовали?

Еще тормоза добавляет дельфёвый менеджер памяти - он не умеет паспараллеливаться по ядрам. Попробуйте потестировать на Лазарусе, тот умеет. Правда память будет ждать как паровоз. Но можно собрать из транка, там вроде проблему с пожиранием памяти устранили.
Собирать нужно как 64-битное приложение, иначе упрётесь в нехватку виртуальной памяти.
...
Рейтинг: 0 / 0
13.12.2019, 17:25
    #39902742
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
_Vasilisk_
Вангую переменную длину пакета, без указания/считывания этой длины в протоколе
cptngrb
Код: pascal
1.
2.
3.
4.
5.
6.
7.
sizePacket:= Recv(FSocket, Buffer, DefBufferSize, 0);
    if sizePacket > 0 then
    begin
      //{$IFDEF DEBUG}
      inc(FPacketCount);
      //{$ENDIF}
    end;

что и требовалось доказать

ТС, вы не пакеты тогда считайте, а прочитанные байты.
...
Рейтинг: 0 / 0
13.12.2019, 17:26
    #39902743
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
DmSer, это все 64 бит. пул потоков использовать не пробовал. Что хоть это?))
...
Рейтинг: 0 / 0
13.12.2019, 17:26
    #39902744
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
_Vasilisk_, поподробнее, пожалуйста. чем это я не пакеты считаю?
...
Рейтинг: 0 / 0
13.12.2019, 17:27
    #39902746
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
cptngrbDefBufferSize

Чему равно?

И на вопрос о расположении WireShark ты не ответил. Вполне возможно, что пакеты теряются
уже при отправке из-за заполненности буферов системы, умолчательный размер которых как раз
в районе суммы того, что приняло ICS.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.12.2019, 17:28
    #39902748
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
_Vasilisk_
Вангую переменную длину пакета, без указания/считывания этой длины в протоколе

я знаю, что пакеты не более 2кб, поэтому Recv(FSocket, Buffer, DefBufferSize , 0);
...
Рейтинг: 0 / 0
13.12.2019, 17:29
    #39902750
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
Dimitry Sibiryakov,
DefBufferSize = 2000

WireShark там же где и моя бабалайка
...
Рейтинг: 0 / 0
13.12.2019, 17:30
    #39902753
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
_Vasilisk_вы не пакеты тогда считайте, а прочитанные байты.

UDP пакеты не склеиваются и не дробятся.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.12.2019, 17:30
    #39902754
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
cptngrb
_Vasilisk_, поподробнее, пожалуйста. чем это я не пакеты считаю?
Я говорю о том, что такой подсчет числа пакетов бессмысленен.

Вам нужно считать число принятых байт и сравнивать с числом отправленных
...
Рейтинг: 0 / 0
13.12.2019, 17:30
    #39902755
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
cptngrb
Причем при получении пакета я ничего не делаю
не считая установки обработчика исключений и (неявного) использования управляемых типов что в плотных циклах порой непозволительная роскошь
...
Рейтинг: 0 / 0
13.12.2019, 17:30
    #39902756
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
Dimitry Sibiryakov, еще проверял прекрасной утилитой Startrinity.NetWorkTester пакеты не теряются
...
Рейтинг: 0 / 0
13.12.2019, 17:31
    #39902758
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
Dimitry Sibiryakov
UDP пакеты не склеиваются и не дробятся.
Не знал. А если по дороге злостный маршрутизатор с MTU = 512? Пакет в топку?

И ты утверждаешь, что если в буфер сокета пришло два пакета по 1000 байт, то я не смогу их прочитать одним recv(... 2000...)?
...
Рейтинг: 0 / 0
13.12.2019, 17:32
    #39902760
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
vavan, а как в потоке без try..except?
а как тогда быть "использования управляемых типов что в плотных циклах"?
...
Рейтинг: 0 / 0
13.12.2019, 17:33
    #39902761
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
_Vasilisk_, у меня сеть без маршрутизатора
...
Рейтинг: 0 / 0
13.12.2019, 17:33
    #39902762
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
с локалки на виртуалку
...
Рейтинг: 0 / 0
13.12.2019, 17:33
    #39902764
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень быстрый прием UDP пакетов
cptngrbWireShark там же где и моя бабалайка

Которая из двух твоих блябляек: передающая или принимающая?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Очень быстрый прием UDP пакетов / 25 сообщений из 53, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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