Итак, есть в локалке программа, периодически посылающая UDP Multicast пакеты. Хочется их принять и поковырять. Параметры UDP у этой программы такие:
Multicast Group: 227.0.0.2
TTL: 7
Adapter IP binding: 127.0.0.1
UDP port: 8167
Что я написал:
Const
adapterIP = '127.0.0.1';
multiGroup = '227.0.0.2';
listenPort: Word = 8167;
Max_Size = 512;
Var
wData: WSADATA;
aSock: TSOCKET;
listener: sockaddr_in;
aStr: String;
t: Integer;
Begin
ZeroMemory(@wData, SizeOf(wData));
Try
If WSAStartup(MAKEWORD(2, 2), wData) <> NO_ERROR Then
Raise Exception.Create('Error at WSAStartup');
Try
WriteLn(wData.szDescription, ' is ', wData.szSystemStatus, '.');
aSock := Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //Говорим, какой сокет мы хотим
WSACheck(aSock <> INVALID_SOCKET);
Try
listener.sin_family := AF_INET; // говорим, что будем слушать
listener.sin_addr.S_addr := inet_addr(adapterIP);
listener.sin_port := htons(listenPort);
WSACheck(bind(aSock, listener, SizeOf(listener)) <> SOCKET_ERROR); //привязываемся к порту
Repeat
SetLength(aStr, Max_Size);
ZeroMemory(PChar(aStr), Max_Size);
t := recvfrom(aSock, PChar(aStr)^, Max_Size, 0, PSockAddrIn(Nil)^, PInteger(Nil)^);
WSACheck(t <> SOCKET_ERROR);
SetLength(aStr, t);
WriteLn('Received: ', aStr);
Until t = 0;
Finally
CloseSocket(aSock);
End;
Finally
WSACleanup;
End;
---
Дык вот, не работает — ничего не ловит! И не могу понять, где применить параметр 227.0.0.2 -- вроде как в мануалах написано, что broadcast'ы c мультикастами и так должны "валиться" в сокет.
Заранее всем спасибо за ответы.
|