Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2014.02.09;
Скачать: [xml.tar.bz2];

Вниз

IGMP компоненты   Найти похожие ветки 

 
Zoom ©   (2010-04-09 17:01) [0]

Существуют ли компоненты для реализации IGMP протокола ?
и вообще это уже мировой стандарт, или нет, в том смысле все ли  провайдеры поддерживаю мултикаст ? стоит ли разбираться сейчас с этим вопросом если провайдеры окажутся неспособными, или не заинтересованы в этом ? заранее спасибо за любые комментарии!


 
Сергей М. ©   (2010-04-09 21:14) [1]


> Существуют ли компоненты для реализации IGMP протокола ?


Может и существуют.
А что, без них совсем никак ? Типа свет клином сошелся ?


> все ли  провайдеры поддерживаю мултикаст ?


Кто хочет  - тот и поддерживает..
Дело-то добровольное)


 
DVM ©   (2010-04-09 23:17) [2]


> в том смысле все ли  провайдеры поддерживаю мултикаст ?

не все, точнее все не поддерживают.


 
Zoom ©   (2010-04-10 17:00) [3]

Сергей М. , свет клином не сошелся , просто все немного сложнее чем кажется на первый взгляд, нашел пример по постройке 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 у вас мнения разошлись на счет провайдеров :)


 
Zoom ©   (2010-04-10 18:08) [4]

Если кому интересна эта тема, нашел:
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=/rzab6/rzab6xmulticast.htm
есть пример... осталось переложить на Delphi... ох уж эти структуры... сразу, и не переложишь....


 
Zoom ©   (2010-04-10 19:53) [5]

переложил этот пример 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
   { Private declarations }
 public
   { Public declarations }
 end;

type
///////////////
// Некоторые объявления типов для Winsock 2
 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 // !!! also WSDATA
   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;

// Определяем необходимые функции winsock 2
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; {PInAddr;} { TInAddr }
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; // internetwork: UDP, TCP, etc.

 IP_HDRINCL = 2; // включаем заголовок IP пакета

 SOCK_RAW = 3; // интерфейс raw-протокола

 IPPROTO_IP = 0; // dummy for IP
 IPPROTO_TCP = 6; // tcp
 IPPROTO_UDP = 17; // user datagram protocol
 IPPROTO_RAW = 255; // raw IP пакет

 INVALID_SOCKET = TSocket(not (0));
 SOCKET_ERROR = -1;

 SOCK_DGRAM = 2; // интерфейс udp-протокола
 IP_MULTICAST_LOOP = 4; //???
 IP_MULTICAST_IF = 2; //???
//http://www.blitzbasic.com/codearcs/codearcs.php?code=1270
////////////////

var
 Form1: TForm1;

implementation

// Импортируем функции Winsock 2
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";

{$R *.dfm}

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
// Startup Winsock 2
 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_RAW, IPPROTO_UDP);
   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));

 (*
  * Initialize the group sockaddr structure with a
  * group address of 225.1.1.1 and port 5555.
  *)
// memset((char *) &groupSock, 0, sizeof(groupSock));  ???
   groupSock.sin_family := AF_INET;
   groupSock.sin_addr.s_addr := inet_addr("225.1.1.1");
   groupSock.sin_port := htons(5555);

 (*
  * Disable loopback so you do not receive your own datagrams.
  *)

   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;

  (*
   * set local interface for outbound multicast datagrams.
   * The IP address specified must be associated with a local,
   * multicast - capable interface.
   *)
   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;

 (*
  * Send a message to the multicast group specified by the
  * groupSock sockaddr structure.
  *)
   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
// Закрываем Winsock 2
   WSACleanup;
 end;

end;

end.


 
Сергей М. ©   (2010-04-10 21:37) [6]


> DVM ©   (09.04.10 23:17) [2]
> все не поддерживают.


Ну это ты загнул)
За других не скажу, а мой домашний провайдер поддерживает.
IPTV посматриваю изредка)


 
Zoom ©   (2010-04-10 23:51) [7]

заменил "WS2_32.DLL" на "wsock32.dll" вроде пакеты пошли...
wsData.szDescription в обоих случаях пишет WinSock 2.0
в родном winsock.pas используется wsock32.dll ...
в чем же тогда разница , и что нужно использовать ?


 
Zoom ©   (2010-04-11 01:34) [8]

перевел на 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; //* IP multicast address of group */
   imr_interface: TInAddr; //* local IP address of interface */
 end;
 Tip_mreq = ip_mreq;


такой структуры почему-то нету в winsock.pas...


 
Zoom ©   (2010-04-11 02:41) [9]

финальное художество http://ontext.info/38740 абстрактно но работает... может кому пригодится...  правда запускать нужно два экземпляра , так как на приеме наглухо замораживается, размораживается по пришествию данных...


 
DVM ©   (2010-04-11 10:54) [10]


> Сергей М. ©   (10.04.10 21:37) [6]


> За других не скажу, а мой домашний провайдер поддерживает.
>
> IPTV посматриваю изредка)

Мой тоже и тоже именно для IPTV, фактически поддерживают только те, которым это нужно и обычно эта поддержка имеется только на конечном участке провайдер - пользователи. Оно ж требует вполне конкретной настройки конкретных свитчей под конкретные вещи. Если провайдер ничего такого не предоставляет, то и настроено у него ничего не будет.

Т.е от Интернет поддержи ожидать не приходится.


 
Zoom ©   (2010-04-11 19:43) [11]

а вот сделал в качестве юнита 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; // test data
 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;



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2014.02.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.003 c
3-1295420914
Дмитрий С
2011-01-19 10:08
2014.02.09
ВКонтакте: кто удалился?


2-1365109635
noname_06
2013-04-05 01:07
2014.02.09
Ищу примеры использования Сhromium Еmbedded Framework


2-1365497297
И. Павел
2013-04-09 12:48
2014.02.09
NTLM-аутентификация


2-1364829737
TStas
2013-04-01 19:22
2014.02.09
КАк упаковать раром папку?


11-1249636129
Dy1
2009-08-07 13:08
2014.02.09
OnPaint





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский