-
Существуют ли компоненты для реализации IGMP протокола ? и вообще это уже мировой стандарт, или нет, в том смысле все ли провайдеры поддерживаю мултикаст ? стоит ли разбираться сейчас с этим вопросом если провайдеры окажутся неспособными, или не заинтересованы в этом ? заранее спасибо за любые комментарии!
-
> Существуют ли компоненты для реализации IGMP протокола ?
Может и существуют. А что, без них совсем никак ? Типа свет клином сошелся ?
> все ли провайдеры поддерживаю мултикаст ?
Кто хочет - тот и поддерживает.. Дело-то добровольное)
-
> в том смысле все ли провайдеры поддерживаю мултикаст ?
не все, точнее все не поддерживают.
-
Сергей М. , свет клином не сошелся , просто все немного сложнее чем кажется на первый взгляд, нашел пример по постройке IP пакета ... http://superadm.net/index.php?name=pages&op=view&id=58там хоть и идет речь о IGMP но не слова о "Membership Query Message". http://tools.ietf.org/html/rfc3376#section-4.1первый этап - инициализация сокета. с какими параметрами инициализировать сокет для отправки Запроса принадлежности (Membership Query Message) ? sh := Socket(AF_INET, SOCK_RAW, IPPROTO_UDP); // Сергей М. и DVM у вас мнения разошлись на счет провайдеров :)
-
-
переложил этот пример http://publib.boulder.ibm.com/infocenter/iseries/v5r3/topic/rzab6/rzab6x1multicast.htm на нормальный язык, ошибок нет, но и пакеты тоже не уходят... ни лампочки в сети, ни iptools sniffer, никак не реагируют...
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
public
end;
type
u_char = Char;
u_short = Word;
u_int = Integer;
u_long = Longint;
SunB = packed record
s_b1, s_b2, s_b3, s_b4: u_char;
end;
SunW = packed record
s_w1, s_w2: u_short;
end;
in_addr = record
case integer of
0: (S_un_b: SunB);
1: (S_un_w: SunW);
2: (S_addr: u_long);
end;
TInAddr = in_addr;
Sockaddr_in = record
case Integer of
0: (sin_family: u_short;
sin_port: u_short;
sin_addr: TInAddr;
sin_zero: array[0..7] of Char);
1: (sa_family: u_short;
sa_data: array[0..13] of Char)
end;
TSockAddr = Sockaddr_in;
TSocket = u_int;
const
WSADESCRIPTION_LEN = 256;
WSASYS_STATUS_LEN = 128;
type
PWSAData = ^TWSAData;
WSAData = record wVersion: Word;
wHighVersion: Word;
szDescription: array[0..WSADESCRIPTION_LEN] of Char;
szSystemStatus: array[0..WSASYS_STATUS_LEN] of Char;
iMaxSockets: Word;
iMaxUdpDg: Word;
lpVendorInfo: PChar;
end;
TWSAData = WSAData;
function closesocket(s: TSocket): Integer; stdcall;
function socket(af, Struct, protocol: Integer): TSocket; stdcall;
function sendto(s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr;
tolen: Integer): Integer; stdcall;
function setsockopt(s: TSocket; level, optname: Integer; optval: PChar;
optlen: Integer): Integer; stdcall;
function inet_addr(cp: PChar): u_long; stdcall;
function htons(hostshort: u_short): u_short; stdcall;
function WSAGetLastError: Integer; stdcall;
function WSAStartup(wVersionRequired: word; var WSData: TWSAData): Integer; stdcall;
function WSACleanup: Integer; stdcall;
const
AF_INET = 2;
IP_HDRINCL = 2;
SOCK_RAW = 3;
IPPROTO_IP = 0; IPPROTO_TCP = 6; IPPROTO_UDP = 17; IPPROTO_RAW = 255;
INVALID_SOCKET = TSocket(not (0));
SOCKET_ERROR = -1;
SOCK_DGRAM = 2; IP_MULTICAST_LOOP = 4; IP_MULTICAST_IF = 2;
var
Form1: TForm1;
implementation
const WinSocket = 'WS2_32.DLL';
function closesocket; external winsocket name 'closesocket';
function socket; external winsocket name 'socket';
function sendto; external winsocket name 'sendto';
function setsockopt; external winsocket name 'setsockopt';
function inet_addr; external winsocket name 'inet_addr';
function htons; external winsocket name 'htons';
function WSAGetLastError; external winsocket name 'WSAGetLastError';
function WSAStartup; external winsocket name 'WSAStartup';
function WSACleanup; external winsocket name 'WSACleanup';
procedure TForm1.Button1Click(Sender: TObject);
var
wsdata: TWSAdata;
ret: Integer;
sd: TSocket;
loopch: byte;
groupSock: TSockAddr;
localInterface: TInAddr;
datalen: integer;
databuf: array[0..1024] of byte;
begin
ret := WSAStartup($0002, wsdata);
if ret <> 0 then begin
memo1.lines.add('WSA Startup failed.');
exit;
end;
with memo1.lines do begin
add('WSA Startup:');
add('Desc.: ' + wsData.szDescription);
add('Status: ' + wsData.szSystemStatus);
end;
try
sd := socket(AF_INET, SOCK_DGRAM, 0);
if (sd = INVALID_SOCKET) then begin
memo1.lines.add('Socket() failed: ' + IntToStr(WSAGetLastError));
exit;
end;
Memo1.lines.add('Socket Handle = ' + IntToStr(sd));
groupSock.sin_family := AF_INET;
groupSock.sin_addr.s_addr := inet_addr('225.1.1.1');
groupSock.sin_port := htons(5555);
loopch := 0;
ret := setsockopt(sd, IPPROTO_IP, IP_MULTICAST_LOOP, @loopch, sizeof(loopch));
if ret = SOCKET_ERROR then begin
Memo1.lines.add('setsockopt(IP_MULTICAST_LOOP) failed: ' + IntToStr(WSAGetLastError));
exit;
end;
localInterface.s_addr := inet_addr('192.168.1.5');
ret := setsockopt(sd, IPPROTO_IP, IP_MULTICAST_IF, @localInterface, sizeof(localInterface));
if ret = SOCKET_ERROR then begin
Memo1.lines.add('setsockopt(IP_MULTICAST_IF) failed: ' + IntToStr(WSAGetLastError));
exit;
end;
datalen := 10;
ret := sendto(sd, databuf, datalen, 0, groupSock, sizeof(groupSock));
if ret = SOCKET_ERROR then begin
Memo1.lines.add('sending datagram message: ' + IntToStr(WSAGetLastError));
exit;
end;
CloseSocket(sd);
finally
WSACleanup;
end;
end;
end.
-
> DVM © (09.04.10 23:17) [2] > все не поддерживают.
Ну это ты загнул) За других не скажу, а мой домашний провайдер поддерживает. IPTV посматриваю изредка)
-
заменил 'WS2_32.DLL' на 'wsock32.dll' вроде пакеты пошли... wsData.szDescription в обоих случаях пишет WinSock 2.0 в родном winsock.pas используется wsock32.dll ... в чем же тогда разница , и что нужно использовать ?
-
перевел на delphi приемную часть , http://publib.boulder.ibm.com/infocenter/iseries/v5r3/topic/rzab6/rzab6x2multicast.htm вроде работает запустил три приложения все пакеты доставляются правда пока в рамках локальной сети ... есть еще вопрос у них такая структура на си struct ip_mreq { struct in_addr imr_multiaddr; /* IP multicast address of group */ struct in_addr imr_interface; /* local IP address of interface */ }; правильно ли я ее представил ?
ip_mreq = record
imr_multiaddr: TInAddr; imr_interface: TInAddr; end;
Tip_mreq = ip_mreq;
такой структуры почему-то нету в winsock.pas...
-
финальное художество http://ontext.info/38740 абстрактно но работает... может кому пригодится... правда запускать нужно два экземпляра , так как на приеме наглухо замораживается, размораживается по пришествию данных...
-
> Сергей М. © (10.04.10 21:37) [6]
> За других не скажу, а мой домашний провайдер поддерживает. > > IPTV посматриваю изредка)
Мой тоже и тоже именно для IPTV, фактически поддерживают только те, которым это нужно и обычно эта поддержка имеется только на конечном участке провайдер - пользователи. Оно ж требует вполне конкретной настройки конкретных свитчей под конкретные вещи. Если провайдер ничего такого не предоставляет, то и настроено у него ничего не будет.
Т.е от Интернет поддержи ожидать не приходится.
-
а вот сделал в качестве юнита http://ontext.info/38746пакеты ходят каким то "чудесным" образом, на прием неподвластны даже снифферу :) (IGMP)192.168.1.5: ->224.0.0.22: ,54 Bytes (IGMP)192.168.1.5: ->224.0.0.22: ,54 Bytes (UDP)192.168.1.5:1712->225.1.1.1:5555 ,52 Bytes как уходят видно, а вот как приходят ... неизвестно... но приходят :) с провайдером действительно вроде хана... и как настроить роутер на входящее соединение если портов даже нету :)
procedure TForm1.Button4Click(Sender: TObject);
begin
igmp_init_server('192.168.1.5');
send_databuf[0] := 11; send_databuf[5] := 33; send_databuf[7] := 55; igmp_send_data('225.1.1.1', 5555, 10);
end;
procedure TForm1.Button5Click(Sender: TObject);
var
datalen, i: integer;
begin
igmp_init_client('192.168.1.5', '225.1.1.1', 5555);
igmp_recv_data(datalen);
Memo1.lines.add('Bytes received: ' + inttostr(datalen));
if datalen > 0 then for i := 0 to datalen - 1 do Memo1.lines.add(inttostr(i) + ' - ' + inttostr(recv_databuf[i]));
end;
|