<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//TR"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=iso-8859-9"> <META NAME="GENERATOR" CONTENT="lfparser_2.9"> <META NAME="LFCATEGORY" CONTENT="System Administration"> <TITLE>lf144, System Administration: Multicast</TITLE> <!-- stylesheet added by lfparser: --> <style type="text/css"> <!-- pre { font-familiy:monospace,Courier } --> </style> </HEAD> <BODY bgcolor="#ffffff" text="#000000"> <!-- this is generated html code. NEVER use this file for your translation work. Instead get the file with the same article number and .meta.shtml in its name. Translate this meta file and then use lfparser program to generate the final article --> <!-- lfparser can be obtained from http://main.linuxfocus.org/~guido/dev/lfparser.html --> <!-- 2pdaIgnoreStart --> <MAP name="top"> <AREA shape="rect" coords="367,9,418,30" alt="Home" href="../index.shtml"> <AREA shape="rect" coords="423,9,457,30" alt="Map" href="../map.html"> <AREA shape="rect" coords="463,9,508,30" alt="Index" href="../indice.html"> <AREA shape="rect" coords="514,9,558,30" alt="Search" href="../Search/index.shtml"> </MAP> <MAP name="bottom"> <AREA shape="rect" coords="78,0,163,15" alt="News" href="../News/index.html"> <AREA shape="rect" coords="189,0,284,15" alt="Archives" href="../Archives/"> <AREA shape="rect" coords="319,0,395,15" alt="Links" href="../Links/index.html"> <AREA shape="rect" coords="436,0,523,15" alt="About LF" href="../aboutus.html"> </MAP> <!-- IMAGE HEADER --> <CENTER> <IMG src="../../common/images/Topbar-tr.gif" width="600" height="40" border="0" alt="[Top bar]" ismap usemap="#top" ><BR> <IMG src="../../common/images/Bottombar-tr.gif" width="600" height="21" border="0" alt="[Bottom bar]" ismap usemap="#bottom"> </CENTER> <!-- SSI_INFO --> <!-- tr_staticssi include virtual --> <!-- tr_staticssi exec cmd --> <!-- addedByLfdynahead ver 1.5 --><TABLE ALIGN="right" border=0><TR><TD ALIGN="right"><FONT SIZE="-1" FACE="Arial,Helvetica">Bu makalenin farkl� dillerde bulundu�u adresler: <A href="../../English/January2001/article144.shtml">English</a> <A href="../../Castellano/January2001/article144.shtml">Castellano</a> <A href="../../Deutsch/January2001/article144.shtml">Deutsch</a> <A href="../../Francais/January2001/article144.shtml">Francais</a> <A href="../../Nederlands/January2001/article144.shtml">Nederlands</a> <A href="../../Russian/January2001/article144.shtml">Russian</a> <A href="../../Turkce/January2001/article144.shtml">Turkce</a> <A href="../../Arabic/January2001/article144.shtml">Arabic</a> </FONT></TD></TR></TABLE><br> <!-- 2pdaIgnoreStop --> <!-- SHORT BIO ABOUT THE AUTHOR --> <TABLE ALIGN=LEFT BORDER=0 hspace=4 vspace=4 WIDTH="30%" > <TR> <TD> <!-- 2pdaIgnoreStart --> <!-- PALM DOC --> <TABLE BORDER=0 hspace=4 vspace=4> <TR> <TD> <font size=1> <img src="../../common/images/2doc.gif" width=34 align=left border=0 height=22 alt="convert to palm"><a href="http://cgi.linuxfocus.org/cgi-bin/2ztxt">Convert to GutenPalm</a><br>or <a href="http://cgi.linuxfocus.org/cgi-bin/2pda">to PalmDoc</a></font> </TD> </TR> </TABLE> <!-- END PALM DOC --> <!-- 2pdaIgnoreStop --> <br> <img src="../../common/images/AngelLopez.jpg" alt= "[Photo of the Author]" height="200" width="154"> <BR>taraf�ndan <a href="mailto:alogo@mx2.redestb.es">Angel Lopez</a> <BR><BR> <I>Yazar hakk�nda:</I><BR> <p>Angel Bilgisayar M�hendisli�i mezunu.�u anda ��retmen olarak <a href="http://www.sun.com">Sun Microsystems</a>'de �al���yor, Solaris ve a� y�netimi konular�n� anlat�yor. Son g�nlerde yard�mc� yazar olarak <em>Internet protokolleri konusunda <a href= "http://www.ra-ma.es/">Ra-Ma</a> ile �al���yor.Tasarlanmas� ve Unix sistemlerine uyarlanmas� �zerine.</em>. �lgi duydu�u konular�n ba��nda a�, g�venlik, sistem/a� unix programlama ve son zamanlarda Linux �ekirde�ini k�rmak gibi konular uykular�n� azalt�yor. ;)</p> <BR><i>��erik</i>: <UL> <LI><A HREF="#lfindex0">Giri�</A></LI> <LI><A HREF="#lfindex1">Multicast Adres</A></LI> <LI><A HREF="#lfindex2">Multicast �al���yor</A></LI> <LI><A HREF="#lfindex3">Uygulama Programlama Aray�z� (API)</A></LI> <LI><A HREF="#lfindex4">IP_ADD_MEMBERSHIP</A></LI> <LI><A HREF="#lfindex5">IP_DROP_MEMBERSHIP</A></LI> <LI><A HREF="#lfindex6">IP_MULTICAST_IF</A></LI> <LI><A HREF="#lfindex7">IP_MULTICAST_TTL</A></LI> <LI><A HREF="#lfindex8">IP_MULTICAST_LOOP</A></LI> <LI><A HREF="#lfindex9">Basit bir �rnek</A></LI> <LI><A HREF="#lfindex10">Sunucu</A></LI> <LI><A HREF="#lfindex11">�stemci</A></LI> <LI><A HREF="#lfindex12">�ekirdek ve Multicast</A></LI> <LI><A HREF="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=144&lang=tr">Bu yaz� i�in g�r�� bildiriminde bulunabilirsiniz</A></LI> </UL> </TD></TR></TABLE> <!-- HEAD OF THE ARTICLE --> <H2>Multicast</H2> <h3> �eviri : Ceyhun Elmas </h3> <img src="../../common/images/illustration144.gif" alt= "[Ilustration]" hspace="10" height="100" width="100"> <!-- ABSTRACT OF THE ARTICLE --> <P><i>�zet</i>: <P> <p>Bu yaz�da TCP/IP a�lar� �zerine multicast teknolojilerine giri� yap�l�yor. Multicast ileti�imlerinin teorisi ve multicast programlama i�in kullanaca��m�z Linux API detaylar� �zerinde duruluyor. �ekirdek fonksiyonlar�n�n bu teknolojiye nas�l uyarland��� g�steriliyor ve genel anlamda Linux alt�nda multicast deste�i g�zden ge�iriliyor. Yaz� bir multicast uygulamas�n�n g�sterildi�i �ok basit bir C soket program�yla bitiyor.</p></P> <HR size="2" noshade align="right"><BR> <!-- BODY OF THE ARTICLE --> <A NAME="lfindex0"> </A> <H2>Giri�</H2> <p>A� �zerinden bir yere eri�mek (bir aray�z ile) istedi�inizde �� �e�it adres kullanabilirsiniz:</p> <ul> <li><b>unicast adres</b>. Bu adres tipi bir subnet'e sahip tek bir adrese referans verir. Unicast adres i�in bir �rnek olarak 192.168.100.9 adresini g�sterebiliriz. Unicast MAC adrese �rnek olarak 80:C0:F6:A0:4A:B1 g�sterilebilir.</li> <li><b>broadcast adres</b>. Bu adres bir subnet'e sahip her birimi �a��rman�za olanak sa�lar. Broadcast bir IP adresi 192.168.100.255 ve MAC broadcast'i FF:FF:FF:FF:FF:FF.</li> <li><b>multicast adres</b>.Bu adres �e�idiyle bir subnet'e sahip �zel birimleri �a��rabilirsiniz. </li> </ul> <br> <br> <p>Bilgi d�n�c�, tek bir birim de�ilse ve �ok fazla broadcast olu�turmak istemiyorsak Multicast addresleri �ok kullan��l�d�r. �zellikle �o�ulortam bile�enlerinin(ger�ekzamanl� ses ya da video gibi) yo�un kullan�ld��� a� ortamlar�nda bu durum s�zkonusu olacakt�r. Bant geni�li�ini d���nd���m�zde �o�ul ortam verileri i�in unicast en iyi ��z�m olmayacakt�r.�stemcilerden herhangi biri yerel subnet d���nda oldu�u s�rece broadcast da bir ��z�m olmayacakt�r. </p> <A NAME="lfindex1"> </A> <H2>Multicast Adres</H2> <p>B�y�k olas�l�kla bildi�iniz gibi , IP adresleri uzay� 3 s�n�fta gruplan�r. .A, B ve C adres s�n�f�.Burada d�rd�nc� s�n�f olan (D) multicast adresleri i�in ayr�l�r. D s�n�f�na IPv4 adresleri 224.0.0.0 ve 239.255.255.255 uygundur.</p> <p>IP adreslerinin en �nemli 4 biti 224 ile 239 aras�nda de�erler i�eririr. Di�er 28 bit, daha az �nemli olan multicast gruplar� i�in ayr�l�r, a�a��da g�r�ld��� gibi : <br> </p> <center><img src="../../common/images/article144/mcast1.gif" alt= "[grouped bits]" height="134" width="402"></center> <br> <br> <p>A� d�zeyinde IPv4 multicast adresleri �zerinde �al���lan a� �e�idinin fiziksel adresleri �zerine haritalanmal�d�r.E�er unicast a� adresleri ile �al���yorsak,ARP protokol� kullanan birle�ik fiziksel adresleri getirmeliyiz. Multicast adreslerinde ARP kullan�lamaz. Bu nedenle fiziksel adresler ba�ka bir yolla al�nmal�d�r. Burada bu haritlama y�ntemiyle ilgili baz� RFC dokumanlar� bulunuyor:</p> <ul> <li>Multicast IPv4 to Ethernet physical address correspondence: RFC 1112.</li> <li>Correspondence to FDDI networks:RFC 1390.</li> <li>Correspondence to Token-Ring networks:RFC 1469.</li> </ul> Ethernet a�lar�nda, en yayg�n olan� ethernet adresinin en �nemli 24 bitinin <tt>01:00:5E</tt> haritalanmas�d�r. Sonraki bit 0 'a al�n�r, ve 23 daha az �nemli olan bit multicast IPv4 adresin daha az �nemli olan 23 bitiyle kullan�l�r. Bu i�lem a�a��daki grafikte g�r�l�yor: <br> <center><img src="../../common/images/article144/mcast2_es_en.gif" height="144" width="563" alt="[transform to Ethernet]"></center> <br> �rne�in, multicast IPv4 adresleri 224.0.0.5 , 01:00:5E:00:00:05 fiziksel ethernet adresine uyum sa�layacakt�r. <br> <br> <p>Burada baz� multicast IPv4 adresleri bulunuyor:</p> <ul> <li>224.0.0.1 adresleri her subnet'teki her konak taraf�ndan tan�n�r. Multicast �zelli�i olan her konak subnet ile bu gruba �ye olmak zorundad�r. </li> <li>224.0.0.2 adresi a�da multicast �zelli�i olan her router'a tan�mlama i�in iletilir</li> <li>224.0.0.0 - 224.0.0.255 adres aral��� d���k seviyeli protokoller i�in ayr�l�r. Datagram'lar adreslere bu aral�kla g�nderilir ve asla multicast �zelli�i olan bir router taraf�ndan route i�lemine u�ramayacakt�r.</li> <li>239.0.0.0 - 239.255.255.255 adres aral��� y�netsel ama�lar i�in ayr�l�r. Adresler ayn� organizasyonda yerel olarak atan�r fakat organizasyon d���nda var olamayacakt�r. Organizasyon router'lar� birle�ik a��n d���ndaki bu adreslerin herhangi birisini route etmemelidir.</li> </ul> Ayr�lm�� multicast adreslerinin b�y�kce bir miktar�, burada g�sterilenlerden ayr�d�r. "Assigned Numbers" RFC'nin son s�r�mde t�m yolg�sterimleri bulabilirsiniz. <br> <br> <p>A�a��daki tablo her adres aral��� i�in kullan�lan isimlerle ve kendi birle�ik TTL'leri (IP paketindeki canl� zaman sayac�) ile t�m multicast adres uzay�n� g�steriyor. Multicast IPv4'�n alt�nda , TTL iki anlama geliyor. Okuyucular�n b�y�k olas�l�kla bildi�i �zere, yanl�� yap�land�r�lm�� router tablolar�n�n bulundu�u a�larda sonsuz d�ng�leri engellemek i�in datagram'lar�n ya�am-zaman'lar�n� kontrol eder. Multicast ile �al���r, �stelik datagram'a TTL de�eri tan�mlanmas�na olanak tan�r.i. e., a�daki yolculuk ne kadar uzak olacakt�r...Bu durum datagram kategorisi �zerine tan�mlamaya olanak sa�lar.</p> <center> <table border> <tr bgcolor="#000000"> <td align="CENTER"><b><font color="#FFFFFF">Scope</font></b></td> <td>align=CENTER><b><font color="#FFFFFF">TTL</font></b></td> <td align="CENTER"><b><font color="#FFFFFF">Adres aral���</font></b><</TD></td> <td align="CENTER"><b><font color= "#FFFFFF">A��klama</font></b></td> </tr> <tr> <td>Node</td> <td>0</td> <td> </td> <td>Datagram yerel kona�a s�n�rl�d�r. Herhangi bir a� aray�z�ne eri�emeyecektir.</td> </tr> <tr> <td>Link</td> <td>1</td> <td>224.0.0.0 - 224.0.0.255</td> <td>Datagram g�nderici konak subnet'ine s�n�rland�r�lacakt�r ve router'�n �tesinde bir i�lem yapamayacakt�r.</td> </tr> <tr> <td>Department</td> <td>< 32</td> <td>239.255.0.0 - 239.255.255.255</td> <td>Organizasyonun bir b�l�m� s�n�rland�r�lm��t�r.</td> </tr> <tr> <td>Organization</td> <td>< 64</td> <td>239.192.0.0 - 239.195.255.255</td> <td>�zel organizasyonlar i�in s�n�rland�r�lm��t�r.</td> </tr> <tr> <td>Global</td> <td>< 255</td> <td>224.0.1.0 - 238.255.255.255</td> <td>Herhangi bir s�n�rlama olmayan genel uygulamalar.</td> </tr> </table> </center> <br> <br> <A NAME="lfindex2"> </A> <H2>Multicast �al���yor</H2> <p>LAN i�inde, konak �zerindeki a� aray�z� hedef durumundaki kona�a gitmek i�in gereksinimi olan t�m paketleri alt katmanlara g�nderecektir. Bu paket hedef nerdeyse orada olacakt�r.(fiziksel ya da broadcast olabilir). E�er konak bir multicast gruba �ye ise, a� aray�z� bu gruba hedeflenmi� paketleri tan�yacakt�r: t�m bu hedef adresler �ye oldu�u multicast gruplarla e�le�ecektir.<br> <p>Bu nedenle,e�er fiziksel adresi: 0:C0:F6:A0:4A:B1 ve 224.0.1.10 multicast grubuna �ye ise, uygun paketler bir sonraki hedef adresten uygun olan�na y�nelecektir:</p> <ul> <li>Aray�z adresi: 80:C0:F6:A0:4A:B1</li> <li>Broadcast adresi: FF:FF:FF:FF:FF:FF</li> <li>Multicast grup ile birle�ik adres: 01:00:5E:00:01:0A</li> </ul> Multicast'in WAN �zerinde �al��mas� i�in router'lar�n multicast deste�i olmal�d�r. Multicast gruba ba�l� konakta i�lem ko�maya ba�lad���nda ,konak subnet'teki her router'a IGMP (Internet Group Management Protocol) g�nderir ve multicast mesajlar�n yerel subnet'te i�lemi kabul edenlere g�nderdi�i bilgisini verir. Router'lar kendileri subnet'te hangi multicast mesaj�n�n route edilmesi gerekri�ini bilerek di�er multicast router'leri bilgilendirecektir.<br> <br> <p>�stelik router'lar 224.0.0.1 grubuna IGMP mesajlar� gondererek her konak ile ilgli grup bilgisini yan�tlayacakt�r. Konak, istemini yapt�ktan sonra sayac� kendi de�erine alacakt�r ve saya� s�f�rland���nda yan�tlayacakt�r. Bu t�m konaklar�n ayn� zamanda yan�t vermesini dolay�s�yla a� �zerine a��r� y�klemeyi engelleyecektir. Konak yan�tlad���nda grubun multicast adreslerine mesaj g�nderecektir.Grup �yesi t�m di�er konaklar yan�t� g�recektir ve kendileri yan�tlamayacakt�r, onaylayan bir konak, subnet router'in bu gruba multicast mesaj g�ndermesine yeterlidir.</p> <p>E�er t�m konaklar onaylad�ysa hi� biri yan�tlamayacakt�r ve router bu grupta hi� bir kona��n ilgisini �ekmedi�ine karar verecektir ve subnet'e giren uyumlu mesajlar�n routing i�lemini sonland�racakt�r. Di�er se�enek IGMPv2 ile uyarlanm�� ,konaktan geri gelen sinyal ileti�imi 224.0.0.2 grubuna mesaj g�nderir.</p> <A NAME="lfindex3"> </A> <H2>Uygulama Programlama Aray�z� (API)</H2> <p>Bir �nceki deneyim ile soket programlamada okuyucu yaln�zca be� yeni multicast arama se�ene�i bulacakt�r. Fonksiyonlar setsockopt() ve getsockopt() tan�tmak ya da bu be� se�ene�in de�erlerini okumak i�in kullan�lacakt�r.Tablo kendi y�netsel veri �e�itleri ve a��klamalarla multicast i�in sa�lanan de�erleri g�steriyor:</p> <center> <table border> <tr bgcolor="#000000"> <td><b><font color="#FFFFFF">IPv4 Se�ene�i</font></b></td> <td><b><font color="#FFFFFF">Veri �e�idi</font></b></td> <td><b><font color="#FFFFFF">A��klama</font></b></td> </tr> <tr> <td>IP_ADD_MEMBERSHIP</td> <td>struct ip_mreq</td> <td>Multicast gruba �ye olma.</td> </tr> <tr> <td>IP_DROP_MEMBERSHIP</td> <td>struct ip_mreq</td> <td>Multicast grubundan �ekilmek.</td> </tr> <tr> <td>IP_MULTICAST_IF</td> <td>struct ip_mreq</td> <td>struct ip_mreq multicast mesajlar�n uyumu i�in �zel aray�zler.</td> </tr> <tr> <td>IP_MULTICAST_TTL</td> <td>u_char</td> <td>multicast mesajlar�n uyumu i�in �zel TTL.</td> </tr> <tr> <td>IP_MULTICAST_LOOP</td> <td>u_char</td> <td>Aktif olan ya da olmayan tekrarl� multicast mesajlar�.</td> </tr> </table> </center> <br> <br> <p>The <i>ip_mreq</i> yap�s� ba�l�k dosyas�nda tan�mlan�r , <i><linux/in.h></i> a�a��da g�sterildi�i gibi:</p> <pre> struct ip_mreq { struct in_addr imr_multiaddr; /* Grubun IP multicast adresleri */ struct in_addr imr_interface; /* Aray�z�n yerel IP adresleri */ }; </pre> ve multicast se�enekleri: <pre> #define IP_MULTICAST_IF 32 #define IP_MULTICAST_TTL 33 #define IP_MULTICAST_LOOP 34 #define IP_ADD_MEMBERSHIP 35 #define IP_DROP_MEMBERSHIP 36 </pre> <br> <br> <A NAME="lfindex4"> </A> <H3>IP_ADD_MEMBERSHIP</H3> <p>Multicast gruba �yelik olabildi�inde bu se�ene�i soket �zerine <i>setsockopt()</i> fonksiyonu ile g�nderir. <i>ip_mreq</i> parametresi yap�d�r.�lk yap� alan�, <i>imr_multiaddr </i>, �ye olmak istedi�imiz multicast adresleri i�erir. �kinci alan , <i>imr_interface </i>, kullanaca��m�z aray�z�n IPv4 adreslerini i�erir.</p> <A NAME="lfindex5"> </A> <H3>IP_DROP_MEMBERSHIP</H3> <p>Bu se�ene�i kullanarak i�lem multicast grubundan ��kar�labilir.<i> ip_mreq</i> alan yap�s� bir �nceki konudakine benzer �ekilde kullan�l�r.</p> <A NAME="lfindex6"> </A> <H3>IP_MULTICAST_IF</H3> <p>Bu se�enek multicast mesaj�n� g�nderecek soket olan a� aray�z�n� belirlemede kullan�l�r. Aray�z <i>ip_mreq </i>i�inde bir �nceki konudaki gibi verilecektir.</p> <A NAME="lfindex7"> </A> <H3>IP_MULTICAST_TTL</H3> <p>Datagramlar ile soket kullanan multicast mesajlar� i�in TTL <i>(Time To Live)</i> kullan�l�r. .Kendi de�eri 1'dir ,bu datagram'�n yerel subnet'in �tesine ge�meyece�i anlam�na gelir.</p> <A NAME="lfindex8"> </A> <H3>IP_MULTICAST_LOOP</H3> <p>��lem multicast grubu i�in mesaj g�nderdi�inde e�er aray�z gruba �ye ise al�n�r. E�er bu kaynak a� i�erisinde herhangi bir yer ise ayn� yolla al�nacakt�r. Bu se�enek bu davran���n aktif olmas�n� ya da aktif olmamas�n� sa�lar.</p> <A NAME="lfindex9"> </A> <H2>Basit bir �rnek</H2> <p>Nerede multicast gruba mesaj g�nderen bir i�lem varsa ve baz� i�lemler mesajlar� yan�tlayan gruba aktar�l�yorsa ,bunlar ekranda g�steriliyor.</p> <p>Bir sonraki kod uyarlamas� sunucunun multicast grup 224.0.1.1 'e t�m standart giri�leri iletmesi ile ilgili. G�rebildi�iniz gibi multicast gruba mesaj g�ndermek i�in herhangi �zel bir harakete gerek yok. Hedef grup adresleri yeterli.<br> Loopback and TTL de�i�tirilebildi, e�er kendi de�erleri uygulama i�in uygun de�ilse.</p> <A NAME="lfindex10"> </A> <H2>Sunucu</H2> <p>Standard giri� multicast grup 224.0.1.1 'e g�nderiliyor.</p> <pre> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <stdio.h> #define MAXBUF 256 #define PUERTO 5000 #define GRUPO "224.0.1.1" int main(void) { int s; struct sockaddr_in srv; char buf[MAXBUF]; bzero(&srv, sizeof(srv)); srv.sin_family = AF_INET; srv.sin_port = htons(PUERTO); if (inet_aton(GRUPO, &srv.sin_addr) < 0) { perror("inet_aton"); return 1; } if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket"); return 1; } while (fgets(buf, MAXBUF, stdin)) { if (sendto(s, buf, strlen(buf), 0, (struct sockaddr *)&srv, sizeof(srv)) < 0) { perror("recvfrom"); } else { fprintf(stdout, "Enviado a %s: %s\n", GRUPO, buf); } } } </pre> <br> <br> <A NAME="lfindex11"> </A> <H2>�stemci</H2> <p>A�a��da sunucu taraf�ndan onaylanan multicast grup bilgisi istemci taraf�n�n kodu g�r�l�yor.Al�nan mesajlar standart ��k�� �zerinde g�r�n�yor. Bu �zellik kodun IP_ADD_MEMBERSHIP se�eneniyle sa�lan�r. Kalan kod UDP mesajlar�n� alma gereksinimi olan standart i�lemler i�in.</p> <pre> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #define MAXBUF 256 #define PUERTO 5000 #define GRUPO "224.0.1.1" int main(void) { int s, n, r; struct sockaddr_in srv, cli; struct ip_mreq mreq; char buf[MAXBUF]; bzero(&srv, sizeof(srv)); srv.sin_family = AF_INET; srv.sin_port = htons(PUERTO); if (inet_aton(GRUPO, &srv.sin_addr) < 0) { perror("inet_aton"); return 1; } if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket"); return 1; } if (bind(s, (struct sockaddr *)&srv, sizeof(srv)) < 0) { perror("bind"); return 1; } if (inet_aton(GRUPO, &mreq.imr_multiaddr) < 0) { perror("inet_aton"); return 1; } mreq.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(s,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) { perror("setsockopt"); return 1; } n = sizeof(cli); while (1) { if ((r = recvfrom(s, buf, MAXBUF, 0, (struct sockaddr *) &cli, &n)) < 0) { perror("recvfrom"); } else { buf[r] = 0; fprintf(stdout, "Mensaje desde %s: %s\n", inet_ntoa(cli.sin_addr), buf); } } } </pre> <br> <br> <A NAME="lfindex12"> </A> <H2>�ekirdek ve Multicast</H2> <p>��lem multicast gruba ba�lanmak istedi�inde <i>setsockopt</i> fonksiyonu kullan�larak IP d�zeyinde IP_ADD_MEMBERSHIP se�ene�ine kurar. Bu fonksiyon i�in ger�ek bir uyarlama <i>/usr/src/linux/net/ipv4/ip_sockglue.c </i> �zerine bulunabilir. Kod fonksiyonla �al��t�r�larak bu se�ene�e kurulur ya da IP_DROP_MEMBERSHIP a�a��daki gibidir:</p> <pre> struct ip_mreqn mreq; if (optlen < sizeof(struct ip_mreq)) return -EINVAL; if (optlen >= sizeof(struct ip_mreqn)) { if(copy_from_user(&mreq,optval,sizeof(mreq))) return -EFAULT; } else { memset(&mreq, 0, sizeof(mreq)); if (copy_from_user(&mreq,optval,sizeof(struct ip_mreq))) return -EFAULT; } if (optname == IP_ADD_MEMBERSHIP) return ip_mc_join_group(sk,&mreq); else return ip_mc_leave_group(sk,&mreq); </pre> <br> <br> <p>Kodun en ba�taki sat�rlar�nda giri� parametreleri denetlenir. <i>ip_mreq</i> yap�s�, do�ru uzunlu�a sahiptir ve b�y�k olas�l�kla bunu kullan�c�dan �ekirdek alan�na kopyalar. �ncelikle parameternin de�erini al�r�z,<i> ip_mc_join_group()</i> fonksiyonu multicast gruba ba�lanmak i�in �a�r�l�r ya da multicast gruptan ��kmak istiyorsak <i> ip_mc_leave_group() </i>fonksiyonu �a�r�l�r. </p> <p>Bu fonksiyonlar i�in kod <i>/usr/src/linux/net/ipv4/igmp.c </i>dosyas�nda bulunur. Gruba ba�lanmay� a�a��daki k�s�m sa�lar :</p> <pre> int ip_mc_join_group(struct sock *sk , struct ip_mreqn *imr) { int err; u32 addr = imr->imr_multiaddr.s_addr; struct ip_mc_socklist, *iml, *i; struct in_device *in_dev; int count = 0; </pre> <br> <br> <p>Denetlemenin en ba��nda, MULTICAST macro'lar� kullan�l�yor, bu macro'lar multicast adresler i�in ayr�lm�� aral�kta de�i�en adreslerdir. Bu, denetleme i�in yeterlidir. IP adres �zerindeki en �nemli byte 224'e al�n�r.</p> <pre> if (!MULTICAST(addr)) return -EINVAL; rtnl_shlock(); </pre> <br> <br> <p>Denetlemeden sonra, a� aray�z� multicast grubu aramak �zere kurulur. E�er a�adaki bir index taraf�ndan bu olanakl� de�ilse, IPv6 alt�nda olmal�d�r, <i>ip_mc_find_dev()</i> fonksiyonu �zel IP adresine birle�ecek ayg�t� bulmak �zere �a�r�l�r. Bu konuya bu yaz�da de�inece�iz ��nk� IPv4 alt�nda �al���yoruz. E�er adres INADDR_ANY ise, �ekirdek a� aray�z�n� kendisi bulmal�d�r, routing tablosunu okur ve burada tan�ml� en iyi aray�z� gruba se�er. </p> <pre> if (!imr->imr_ifindex) in_dev = ip_mc_find_dev(imr); else in_dev = inetdev_by_index(imr->imr_ifindex); if (!in_dev) { iml = NULL; err = -ENODEV; goto done; } </pre> <br> <br> <p>Daha sonra <i>ip_mc_socklist</i> yap�s� i�in bellek ay�r�r�z, ve ayn� grup adres ve aray�z� kar��la�t�r�lan soketlere birle�tirilir. E�er �ncesinde soketlere bir birle�tirme olduysa fonksiyondan ��kar�z , ��nk� grup ve aray�ze �ift birle�tirme yapam�yoruz. E�er a� aray�z adresi INADDR_ANY de�ilse, uygunluk sayac� fonksiyon tamamlanmadan artar. </p> <pre> iml = (struct ip_mc_socklist *)sock_kmalloc(sk, sizeof(*iml), GFP_KERNEL); err = -EADDRINUSE; for (i=sk->ip_mc_list; i; i=i->next) { if (memcmp(&i->multi, imr, sizeof(*imr)) == 0) { /* New style additions are reference counted */ if (imr->imr_address.s_addr == 0) { i->count++; err = 0; } goto done; } count++; } err = -ENOBUFS; if (iml == NULL || count >= sysctl_igmp_max_memberships) goto done; </pre> <br> <br> <p>Bu noktaya gelindiyse, bu durum yeni soketin yeni gruba linklendi�i, dolay�s�yla yeni giri�in olu�turulmas� ve soketlere uygun gruplara linklenmesi gerekti�i anlam�na gelir. Bellek �imdiden ayr�ld�, yaln�zca yap�lar�n gerektirdi�i de�i�ik alanlar i�in do�ru de�erleri kurmam�z gerekiyor.</p> <pre> memcpy(&iml->multi,imr, sizeof(*imr)); iml->next = sk->ip_mc_list; iml->count = 1; sk->ip_mc_list = iml; ip_mc_inc_group(in_dev,addr); iml = NULL; err = 0; done: rtnl_shunlock(); if (iml) sock_kfree_s(sk, iml, sizeof(*iml)); return err; } </pre> <br> <br> <p><i>p_mc_leave_group()</i> fonksiyonu multicast gruptan ��k�ld���nda uyar�l�r ve bir �nceki fonksiyondan daha kolayd�r. Aray�z ve grup adresleri al�n�r ve aktif soketlerde ger�ekle�en giri�lerin aras�ndan aran�r. Bir kez bulurlar, �nermelerin numaras� kararla�t�r�l�r, burada en k���k bir i�lem gruba birle�tirilir. E�er yeni de�er s�f�rsa,saya� kendisi siler.</p> <pre> int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr) { struct ip_mc_socklist *iml, **imlp; for (imlp=&sk->ip_mc_list;(iml=*imlp)!=NULL; imlp=&iml->next) { if (iml->multi.imr_multiaddr.s_addr==imr->imr_multiaddr.s_addr && iml->multi.imr_address.s_addr==imr->imr_address.s_addr && (!imr->imr_ifindex || iml->multi.imr_ifindex==imr->imr_ifindex)) { struct in_device *in_dev; if (--iml->count) return 0; *imlp = iml->next; synchronize_bh(); in_dev = inetdev_by_index(iml->multi.imr_ifindex); if (in_dev) ip_mc_dec_group(in_dev, imr->imr_multiaddr.s_addr); sock_kfree_s(sk, iml, sizeof(*iml)); return 0; } } return -EADDRNOTAVAIL; } </pre> <br> <br> <p>Di�er multicast se�enekleri �ok basit �ekilde yukar�da listelendi ��nk� i� yap�n�n veri alanlar�nda birle�im sa�lanan soketlerle kulland���m�z baz� de�erleri kuruyor. Bu ay�r�mlar<i> ip_setsockopt()</i> fonksiyonu ile sa�lan�yor..</p> <!-- 2pdaIgnoreStart --> <A NAME="talkback"> </a> <h2>Bu yaz� i�in g�r�� bildiriminde bulunabilirsiniz</h2> Her yaz� kendi g�r�� bildirim sayfas�na sahiptir. Bu sayfaya yorumlar�n�z� yazabilir ve di�er okuyucular�n yorumlar�na bakabilirsiniz. <center> <table border="0" CELLSPACING="2" CELLPADDING="1"> <tr BGCOLOR="#C2C2C2"><td align=center> <table border="3" CELLSPACING="2" CELLPADDING="1"> <tr BGCOLOR="#C2C2C2"><td align=center> <A href="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=144&lang=tr"><b> talkback page </b></a> </td></tr></table> </td></tr></table> </center> <HR size="2" noshade> <!-- ARTICLE FOOT --> <CENTER><TABLE WIDTH="95%"> <TR><TD ALIGN=CENTER BGCOLOR="#9999AA"> <A HREF="../../common/lfteam.html">G�rsely�re sayfalar�n�n bak�m�, LinuxFocus Edit�rleri taraf�ndan yap�lmaktad�r</A> <BR><FONT COLOR="#FFFFFF">© Angel Lopez, <a href="../../common/copy.html">FDL</a> <BR><a href="http://www.linuxfocus.org">LinuxFocus.org</a></FONT> <BR><a href="http://cgi.linuxfocus.org/cgi-bin/lfcomment?lang=tr&article=article144.shtml" target="_TOP">Buray� klikleyerek hatalar� rapor edebilir ya da yorumlar�n�z� LinuxFocus'a g�nderebilirsiniz</A><BR></TD> <TD BGCOLOR="#9999AA"><!-- TRANSLATION INFO --> <font size=2>�eviri bilgisi:</font><TABLE> <tr><td><font size=2>es</font></td> <td><font size=2>-></font></td> <td><font size=2>--</font></td> <td><font size=2><a href="mailto:alogo@mx2.redestb.es"><FONT COLOR="#FFFFFF">Angel Lopez</FONT></a></font></td> </tr> <tr><td><font size=2>es</font></td> <td><font size=2>-></font></td> <td><font size=2>en</font></td> <td><font size=2><a href="mailto:javier.pb@linuxfocus.org"><FONT COLOR="#FFFFFF">JavierPalacios</FONT></a></font></td> </tr> <tr><td><font size=2>en</font></td> <td><font size=2>-></font></td> <td><font size=2>tr</font></td> <td><font size=2><a href="mailto:ceyhun.elmas@linuxfocus.org"><FONT COLOR="#FFFFFF">Ceyhun Elmas</FONT></a></font></td> </tr> </TABLE></TD> </TR></TABLE></CENTER> <p><font size=1>2001-02-26, generated by lfparser version 2.9</font></p> <!-- 2pdaIgnoreStop --> </BODY> </HTML>