Delphi 10.2: Создание асинхронного сокета для прослушивания заданного порта

Проблема в следующем: в программе создан сокет, привязанный к порту, например 49152, с заданным событием WM_USER, должен принимать входящие UDP пакеты со всех адресов. Но не принимает, обработчик события не вызывается. Так до тех пор, пока я с данного сокета не отправлю на какой-либо ip-адрес пакет (пустой).

Создаю сокет:

_recv_sd := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

ZeroMemory(@sa, sizeof(sa));
sa.sin_family := AF_INET;
sa.sin_addr.S_addr  := IpAddr_Any;
sa.sin_port         := htons(49152);
if bind(_recv_sd, sa, sizeof(sa)) = -1 then
    raise Exception.Create('Unable to bind socket!');

WSAAsyncSelect(_recv_sd, Form1.Handle, WM_USER, FD_READ or FD_WRITE);

Обработчик:

procedure WMUSER_RECV(var message: TMessage); message WM_USER;

procedure Form1.WMUSER_RECV(var message: TMessage);
var buf: array [0..65535] of byte;
    sa: TSockAddrIn;
    salen: integer;
    n: integer;
    i: integer;
    s: string;
begin
    salen := sizeof(sa);
    ////////////////////////////////////////////////////////
    n := recvfrom(_recv_sd, buf, sizeof(buf), 0, sa, salen);
    if n > 0 then
    begin
        for i := 0 to n - 1 do s := s + Format(' %.2x', [ buf[i] ]);
        UpdateLogRowList(PPacketData(@buf), n, true, false)
    end
end;

Что можно сделать? Я не могу в своей ситуации заранее знать все адреса, с которых мне нужно получать данные. Порт 49152 свободный, успешно привязан.


Ответы (0 шт):