I like to propose a code addition for IGMP V3
(http://de.wikipedia.org/wiki/Internet_Group_Management_Protocol) to the
OverbyteICSWSocket unit.
It is mostly used by professional equipment (Cisco & Co) to join a multicast
group. We use it for our IPTV analyzing tool and the code is confirmed to
work. :)
Regards
Lars
Proposal:
Type
ip_mreq_source = record
imr_multiaddr: in_addr; // IP multicast address of group
imr_sourceaddr: in_addr; // IP address of source
imr_interface: in_addr; // local IP address of interface
end;
Const
IP_ADD_SOURCE_MEMBERSHIP = 15; // join IP group/source
{$EXTERNALSYM IP_ADD_SOURCE_MEMBERSHIP}
In the definition of
TCustomWSocket = class(TIcsWndControl)
[...]
FMultiCastAddrStr : String;
FMultiCastIpTTL : Integer;
FMultiCastSourceAddrStr: String; // the source IP of the multicast
[...]
property MultiCastAddrStr: String read FMultiCastAddrStr
write FMultiCastAddrStr;
property MultiCastIpTTL : Integer read FMultiCastIpTTL
write FMultiCastIpTTL;
property MultiCastSourceAddrStr: String read
FMultiCastSourceAddrStr
write
FMultiCastSourceAddrStr; // the source IP of the multicast property -> must
be published in TWSocket
[...]
and in
procedure TCustomWSocket.Listen;
var
iStatus : Integer;
optval : Integer;
mreq : ip_mreq;
mreqSrc : ip_mreq_source; // new
[...]
SOCK_DGRAM :
begin
if FMultiCast then begin
if (FMultiCastSourceAddrStr='') then //simple join
begin
{ Use setsockopt() to join a multicast group }
{ mreq.imr_multiaddr.s_addr :=
WSocket_inet_addr('225.0.0.37');}
{ mreq.imr_multiaddr.s_addr := sin.sin_addr.s_addr;}
{ mreq.imr_multiaddr.s_addr :=
WSocket_inet_addr(FAddrStr);}
mreq.imr_multiaddr.s_addr :=
WSocket_Synchronized_inet_addr(AnsiString(FMultiCastAddrStr));
{ mreq.imr_interface.s_addr := htonl(INADDR_ANY);} { RK}
mreq.imr_interface.s_addr :=
WSocket_Synchronized_ResolveHost(AnsiString(FAddrStr)).s_addr;
iStatus := WSocket_Synchronized_SetSockOpt(FHSocket,
IPPROTO_IP,
IP_ADD_MEMBERSHIP,
mreq,
SizeOf(mreq));
if iStatus <> 0 then begin
SocketError('setsockopt(IP_ADD_MEMBERSHIP)');
Exit;
end;
end
else
begin //IGMP V3 Join
{ Use setsockopt() to join a multicast group }
mreqSrc.imr_multiaddr.s_addr :=
WSocket_Synchronized_inet_addr(AnsiString(FMultiCastAddrStr));
mreqSrc.imr_sourceaddr.s_addr :=
WSocket_Synchronized_inet_addr(AnsiString(FMultiCastSourceAddrStr));
mreqSrc.imr_interface.s_addr :=
WSocket_Synchronized_ResolveHost(AnsiString(FAddrStr)).s_addr;
iStatus := WSocket_Synchronized_SetSockOpt(FHSocket,
IPPROTO_IP,
IP_ADD_SOURCE_MEMBERSHIP,
@mreqSrc,
SizeOf(mreqSrc));
if iStatus <> 0 then begin
SocketError('setsockopt(IP_ADD_SOURCE_MEMBERSHIP)');
Exit;
end;
end;
end;
ChangeState(wsListening);
ChangeState(wsConnected);
TriggerSessionConnectedSpecial(0);
end;
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be