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 свободный, успешно привязан.