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

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

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

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

PS: И да, я никогда не использую UDP.
...
Рейтинг: 0 / 0
Очень быстрый прием UDP пакетов
    #39902733
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Очень быстрый прием UDP пакетов
    #39902734
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вангую переменную длину пакета, без указания/считывания этой длины в протоколе
...
Рейтинг: 0 / 0
Очень быстрый прием UDP пакетов
    #39902739
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb

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


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

Еще тормоза добавляет дельфёвый менеджер памяти - он не умеет паспараллеливаться по ядрам. Попробуйте потестировать на Лазарусе, тот умеет. Правда память будет ждать как паровоз. Но можно собрать из транка, там вроде проблему с пожиранием памяти устранили.
Собирать нужно как 64-битное приложение, иначе упрётесь в нехватку виртуальной памяти.
...
Рейтинг: 0 / 0
Очень быстрый прием UDP пакетов
    #39902742
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
Очень быстрый прием UDP пакетов
    #39902743
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer, это все 64 бит. пул потоков использовать не пробовал. Что хоть это?))
...
Рейтинг: 0 / 0
Очень быстрый прием UDP пакетов
    #39902744
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, поподробнее, пожалуйста. чем это я не пакеты считаю?
...
Рейтинг: 0 / 0
Очень быстрый прием UDP пакетов
    #39902746
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbDefBufferSize

Чему равно?

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

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

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

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

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

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

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


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