|
![]() |
|
![]() ÇáãÄáÝ Angel Lopez äÈÐÉ Úä ÇáßÇÊÈ: ÇäÌá Ãäåì ÏÑÇÓÇÊå Ýí åäÏÓÉ ÇáÍÇÓæÈ. æ íÚãá ÃÓÊÇÐÇ áÏì Õä ãÇíßÑÓíÓÊãÒ, íÚáøã ãÈÇÏÆ ÓæáÇÑíÓ æÅÏÇÑÉ ÇáÔÈßÇÊ . ÓÇÚÏ ÑÇãÇ Ýí ÊÃáíÝ ßÊÇÈ ãÑÇÓã ÇáÅäÊÑäÊ. ÇáÊÕãíã æÇáÊØÈíÞ Úáì ÃäÙãÉ ÇáíõäößúÓ. íåÊã ÃÓÇÓÇ ÈÇáÔÈßÇÊ æ ÇáÃã䡿 ÈÑãÌÉ äÙã íõäößÓ æ ÔÈßÇÊå. æ ãÄÎÑÇ íåÊã ÈÊÏÞíÞ äæÇÉ áíäõßÓ ÍÊì ÇÖØÑ Åáì ÊÞáíá äæãå. ÇáãÍÊæíÇÊ: |
äÈÐÉ ãÎÊÕÑÉ:
åÐÇ ÇáãÞÇá ÃÑíÏå ãÞÏãÉ Ýí ÊÞäíÇÊ ÇáÊÑÇÓá Úáì ÔÈßÇÊ TCP/IP. íÚÑÖ ÇáãÝÇåíã ÇáäÙÑíÉ ÇáÊÑÇÓá¡ æ ÊÝÇÕíá ÇÓÊÎÏÇã æÇÌåÉ ÈÑãÌÉ ÇáÊØÈíÞÇÊ API ÇáÊí ÊÓÇÚÏäÇ Úáì ÈÑãÌÉ ÊØÈíÞÇÊ ÇáÊÑÇÓá. æ ÓäÑì ÃíÖÇ æÙÇÆÝ ÇáäæÇÉ ÇáÊí ÊÏÚã åÐå ÇáÊÞäíÉ áÇÓÊßãÇá ÝßÑÊäÇ ÇáÚÇãÉ Úä ÏÚã ÇáÊÑÇÓá Ýí áíäõßúÓ. æ äÎÊã ãÞÇáäÇ ÈãËÇá Úãáí Úä ÈÑãÌÉ ÇáãÞÇÈÓ ÈáÛÉ C ÊæÖíÍÇ áÅäÔÇÁ ÇáÊÑÇÓá.
Ííä ÊÑíÏ æÕá ãÖíøÝ (æÕáÉ) Åáì ÇáÔÈßÉ¡ÊÓÊØíÚ Ãä ÊÓÊÚãá ÚäæÇäÇ ãä Èíä ËáÇËÉ ÃäæÇÚ ãÎÊáÝÉ ãä ÇáÚäÇæíä:
ÚäÇæíä ÇáÊÑÇÓá ãÝíÏÉ ÅÐÇ ÃÑÏäÇ ÅÚáÇã ÈÚÖ ÇáãÖíÝíä Ïæä ÅÐÇÚÉ ÇáãÚáæãÇÊ Ýí ÇáÔÈßÉ. åÐÇ ÇáãÓÚì ãËÇáí ÍíäãÇ íÓÊáÒã ÅÑÓÇá ãÚáæãÇÊ ãÊÚÏÏÉ ÇáæÓÇÆØ ( ßÇáÕæÊ æ ÇáÕæÑÉ Úáì ÇáÝæÑ ãËáÇ) Åáì ÈÚÖ ÇáãÖíøÝíä. ããÇ íÌÚá ÇáÇÊÕÇá ÈÇáãÖíÝíä æÇÍÏÇ ÈæÇÍÏ – ÇÊÕÇá æÍíÏ- ãÊÚÈÇ æßÐáß áÇ íÓÊÍÓä ÅÐÇÚÉ ÇáãÚáæãÇÊ Ýí ÇáÔÈßÉ ÇáÝÑÚíÉ – Ýí ÚäæÇä ÅÐÇÚí – áÇÓíãÇ Åä ßÇä ÃÍÏ ÇáãÓÊáãíä ÎÇÑÌ Úä äØÇÞåÇ
áÇÈÏ Ãäß ÊÚÑÝ Ãä ÚäÇæíä ÇáÅäÊÑäÊ IP ËáÇËÉ ÃÕäÇÝ åí A, B, C æ ÕäÝ ÑÇÈÚ D ãÍÌæÒ ááÊÑÇÓá. ÇáÚäÇæíä ãä IPv4 ãÇ Èíä 224.0.0.0 æ 239.255.255.255 ÊäÊãí Åáì ÇáÕäÝ D.
ÇáÈÊøÇÊ ÇáÃÑÈÚÉ ÇáÚáíÇ ãä ÚäæÇä ãÑÓæã ÇáÅäÊÑäÊ ÊÊÑÇæÍ ãÇ Èíä ÇáÞíã Èíä 224 æ 239. ÈíäãÇ ÇáÈÊøÇÊ ÇáËãÇäíÉ æ ÇáÚÔÑíä ÇáÈÇÞíÉ ãÍÌæÒÉ áãÚÑøÝ ãÌãæÚÉ ÇáÊÑÇÓá ¡ ßãÇ íÊÖÍ Ýí ÇáÕæÑÉ
Ýí ãÓÊæì ÇáÔÈßÉ¡ íÌÈ Ãä íÊæÇÝÞ ÚäæÇä Ipv4 ãÚ ÇáÚäæÇä ÇáÍÞíÞí ááÔÈßÉ ÇáÊí äÚãá ÚáíåÇ. ÅÐÇ ßäÇ äÚãá ÈÚäæÇä ÔÈßÉ unicast¡ íãßä ãÚÑÝÉ ÇáÚäæÇä ÇáÍÞíÞí ÈÇáãÑÓæã ARP æÇáÐí áÇ íÌÏí äÝÚÇ ãÚ ÚäÇæíä ÇáÊÑÇÓá.áÐÇ äÓÊÚãá ØÑÇÆÞ ÃÎÑì. ÈÚÖ ãÑÇÌÚ RFC ÊÊÍÏË Úä ÈÚÖ åÐå ÇáØÑÞ.
åäÇß ÈÚÖ ÚäÇæíä ÇáÊÑÇÓá ÇáÎÇÕÉ :
Åáíß ÌÏæáÇ íÚÑÖ ßá ãÌÇá ÚäÇæíä ÇáÊÑÇÓá ãÚ ÇáÃÓãÇÁ ÇáÔÇÆÚÉ áßá ÑÊÈÉ æ ÚãÑåÇ ( ÇáÚõãÑ Ãæ Òãä ÇáÍíÇÉ åæ ÚÏÇÏ ÇáÒãä ááÍíÇÉ Ýí ÍÒãÉ ip TTL's (time to live counter in ip packet) ) . ááÚãÑ TTL ãÚäíÇä. ÇáãÚäì ÇáÃæá – ÑÈãÇ íÚÑÝå ÇáÞÇÑÆ – Ãäå íÊÍßã Ýí ÚãÑ ÇáÍÒãÉ ÝáÇ ÊÈÞì Åáì ÇáÃÈÏ ÅÐÇ ãÇ áã ÊÌÏ ØÑíÞåÇ –ããÇ íãäÚ Ãí ÍáÞÉ ãÝÑÛÉ -. æ ÇáãÚäì ÇáËÇäí Ãäå íÌÏÏ ãÌÇá ÍÒãÉ ÇáÈíÇäÇÊ ÍÊì áÇ ÊÛÇÏÑ ÇáÔÈßÉ. ããÇ íÊíÍ ÊÚÑíÝ ãÌÇáÇÊ ÇáÊÑÇÓá ÇÚÊãÇÏÇ Úáì ÕäÝ ÍÒã ÇáÈíÇäÇÊ.
ÇáãÌÇá | align=CENTER>TTL | ãÌÇá ÇáÚäÇæíä<</TD> | ÇáæÕÝ |
ÇáÚÞÏÉ | 0 | Åäø ÍÒãÉ ÇáÈíÇäÇÊ ãÞíøÏÉ Åáì ÇáãÖíøÝ ÇáãÍáí. æ áä íÕá ÃíøÇ ãä æÕáÇÊ ÇáÔÈßÉ. | |
ÇáæÕáÉ | 1 | 224.0.0.0 - 224.0.0.255 | ÍÒãÉ ÇáÈíÇäÇÊ ÓÊÞÊÕÑ Úáì ÇáãÖíÝ ÇáãÑÓá Ýí ÇáÔÈßÉ ÇáÝÑÚíÉ ¡ æáÇ ÊÊÌÇæÒ Ãí ãÓÇÑ. |
ÇáÞÓã | < 32 | 239.255.0.0 - 239.255.255.255 | ãÞÊÕÑ Úáì ÞÓã æÇÍÏ ãä ÇáãäÙãÉ. |
ÇáãäÙãÉ | < 64 | 239.192.0.0 - 239.195.255.255 | ãÞÊÕÑ Úáì ãäÙãÉ ãÚíäÉ. |
ÚÇáãí\ÔÇãá | < 255 | 224.0.1.0 - 238.255.255.255 | Ïæä ÞíÏ¡ ÊØÈíÞ ÚÇã. |
Ýí ÔÈßÉ ãÍáíÉ LAN ¡ æÇÌåÉ ÇáÔÈßÉ áãÖíÝ ãÇ ÊÑÓá ÇáÑÒã ÇáÊí ÊÞÕÏ ÚäæÇä ÇáãÖíÝ ÈÚíäå Åáì ÇáØÈÞÇÊ ÇáÚáíÇ .åÐå ÇáÑÒã ÅãÇ ÊÍãá ÚäæÇä ÇáÍÞíÞí ááãÖíÝ Ãæ åí ÑÒã ãÐÇÚÉ. ÅÐÇ ÇäÖã ÇáãÖíøÝ Åáì ÒãÑÉ ÊÑÇÓáò ¡ ÝÅä æÇÌåÉ ÇáÔÈßÉ ÓÊÚÊÑÝ ÃíÖÇ ÈÇáÑÒã ÇáÊí ÊÞÕÏ ÇáÒãÑÉ Ãí ßá ÑÒãÉ ÊÞÕÏ ÚäæÇä ÒãÑÉ ÇáÊÑÇÓá ÇáÊí íäÊãí ÅáíåÇ ÇáãÖíÝ. áÐÇ ÅÐÇ ßÇä ÚäæÇä ÇáãÖíÝ ÇáØÈíÚí 80:C0:F6:A0:4A:B1 ÇäÖã Åáì ÒãÑÉ ÊÑÇÓáò ÚäæÇäåÇ 224.0.1.10 ÝÓíÊÚÑÝ Úáì ÇáÑÒã ÇáÊí ÚáíåÇ ÃÍÏ åÐå ÇáÚäÇæíä :
ÇáãÓÇÑÇÊ ÊÑÓá ÃíÖÇ ÑÓÇÆá IGMP Åáì ÇáÒãÑÉ 224.0.0.1 ÊØáÈ ßáø ÇáãÚáæãÇÊ ÇááÇÒãÉ Úä ÇáÒãÑÉ ÇáÊí ÇäÖã ÅáíåÇ ÇáãÖíÝ. æ ÍíäãÇ íÓÊáã ÇáãÖíÝ åÐå ÇáÑÓÇáÉ íÖÚ Ýí ÚÏÇÏ ãÊäÇÞÕ ÞíãÉ ãÇ –ÚÔæÇÆíÇ – æ ÓíÌíÈ ÚäÏãÇ ÊäÚÏã. ÍÊì áÇ íÌíÈ ßáø ÇáãÖíøÝíä Ýí ÇáæÞÊ äÝÓå æáÇ ÊÊÍãá ÇáÔÈßÉ ÚÈÆÇ ÒÇÆÏÇ . æÍíä íÌíÈ ÇáãÖíÝ íÑÓá ÑÓÇáÉ Åáì ÚäæÇä ÇáÒãÑÉ ÝíÊáÞÇåÇ ßá ÇáãÖíÝíä ÇáÃÚÖÇÁ. ÝáÇ íÌíÈæä ÈÃäÝÓåã ÅÐ íßÝí ãÖíÝ æÇÍÏ ÍÊì íÊÚÇãá ãÓÇÑ ÇáÔÈßÉ ÇáÝÑÚíÉ ãÚ ÇáÑÓÇÆá ÇáãÊÑÇÓáÉ áåÐå ááÒãÑÉ
ÅÐÇ ÇäÓÍÈ ßáø ÇáãÖíøÝíä ãä ÇáÒãÑÉ ÝáÇ ÃÍÏ ÓíÌíÈ¡ ÚäÏÆÐ íÞÑÑ ÇáãÓÇÑ Ãä áÇ ÃÍÏ íåÊã ÈåÐå ÇáÒãÑÉ ÝíÊÑßåÇ æ áÇ íæÌå ÅáíåÇ Ãí ÑÓÇáÉ. ÎíÇÑ ÂÎÑ ãÏÚæã Ýí IGMPv2 åæ Ãä íÑÓá ÇáãÖíÝ ÑÓÇáÉ ÇäÓÍÇÈ ãä ÇáÒãÑÉ Åáì ÇáÚäæÇä 224.0.0.2.
ÍÓÈ ÇáÎÈÑÉ ÇáÓÇÈÞÉ Ýí ÈÑãÌÉ ÇáãÞÇÈÓ¡ ÓíÌÏ ÇáÞÇÑÆ ÎãÓÇ ãä ÚãáíÇÊ ÇáãÞÇÈÓ ÇáÌÏíÏÉ ÝÞØ áíÊÚÇãá ãÚ ÎíÇÑÇÊ ÇáÊÑÇÓá . ÇáÏÇáÉ setsockopt () ÓÊÓÊÚãá áÊÚÏíá åÐå ÇáÎíÇÑÇÊ æ getsockopt () áÞÑÇÁÊåÇ. æ ÇáÌÏæá íÚÑÖ ÎíÇÑÇÊ ÇáÊÑÇÓá æ ÃäæÇÚ ÈíÇäÇÊåÇ ÇáãÓÊÚãáÉ æ íæÌÒ æÕÝåÇ:
ÎíÇÑÇÊ IPv4 | äæÚ ÇáÈíÇäÇÊ | ÇáæÕÝ |
IP_ADD_MEMBERSHIP | struct ip_mreq | ÅäÖãø Åáì ÒãÑÉ ÇáÊÑÇÓá. |
IP_DROP_MEMBERSHIP | struct ip_mreq | ÇäÓÍÈ ãä ÒãÑÉ ÇáÊÑÇÓá. |
IP_MULTICAST_IF | struct ip_mreq | ÍÏøÏ æÕáÉ áÇÓÊáÇã ÇáÑÓÇÆá ÇáãÊÑÇÓáÉ. |
IP_MULTICAST_TTL | u_char | ÍÏøÏ TTL ÚãÑÇ áÇÓÊáÇã ÇáÑÓÇÆá ÇáãÊÑÇÓáÉ. |
IP_MULTICAST_LOOP | u_char | ÚØøá ÑÌæÚ ÇáÑÓÇÆá ÇáãÊÑÇÓáÉ Ãæ äÔØåÇ loopback |
ÇáÈäíÉ ip_mreq ãÚÑÝÉ Ýí ãáÝ ÇáÊÕÏíÑ <linux/in.h> åßÐÇ:
struct ip_mreq { struct in_addr imr_multiaddr; /* IP multicast address of group */ struct in_addr imr_interface; /* local IP address of interface */ };
#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
áíäÖã ãÓÚì process Åáì ÒãÑÉ íÑÓá ÈãÞÈÓ ÈÇáÏÇáÉ setsockopt(). æ æÓíØåÇ ÈäíÉ ip_mreq: ÍíË ÍÞáåÇ ÇáÃæá imr_multiaddr Ýíå ÚäæÇä ÇáÒãÑÉ ÇáãÞÕæÏÉ ¡ æ ÇáËÇäí imr_interface Ýíå ÚäæÇä æÇÌåÉ ÇáãÖíÝ.
ÇÓÊÚãá åÐÇ ÇáÎíÇÑ ááÇäÓÍÇÈ ãä ÇáÒãÑÉ. ÍÞæá ÇáÈäíÉ ip_mreq ãÓÊÚãáÉ ßãÇ Ýí ÇáÇäÖãÇã.
ÇÓÊÚãá åÐÇ ÇáÎíÇÑ áÊÍÏíÏ æÇÌåÉ ÇáÔÈßÉ ÇáÊí íÓÊÚãáåÇ ÇáãÞÈÓ ááÊÑÇÓá. ÍÞæá ÇáÈäíÉ ip_mreq ãÓÊÚãáÉ ßãÇ Ýí ÇáÇäÖãÇã.
ÍÏÏ Èå ÚãÑ TTL Time To Live ÑÒã ÇáÊÑÇÓáÇáãÑÓáÉ ÈÇáãÞÈÓ. ÇáÞíãÉ ÊáÞÇÆíÇ 1 Ãí Ãä ÑÒãÉ ÇáÈíÇäÇÊ áä ÊÊÌÇæÒ ÇáÔÈßÉ ÇáÝÑÚíÉ.
Ííä íÑÓá ãÓÚì process ÑÓÇáÉ ãÊÚÏÏÉ Åáì ÇáÒãÑÉ ¡ ÓíÓÊáã äÝÓ ÇáÑÓÇáÉ Åä ßÇä ãäÖãÇ ÅáíåÇ æ ÅáÇ ÑÌÚÊ Åáíå ÑÓÇáÊå. åÐÇ ÇáÎíÇÑ íÚØá åÐÇ ÇáÊÕÑÝ Ãæ íÝÚøöáå.
åÐÇ ãËÇá ÈÓíØ áÇÎÊÈÇÑ ãÇ ÊÚÑÖäÇ Åáíå ãä ÃÝßÇÑ . ÇáãÓÚì íÑÇÓá ÇáÒãÑÉ ¡ æ ÇáãÓÇÚí ÇáÃÎÑì Ýí ÇáãÌãæÚÉ ÊÔÇåÏ ÇáÑÓÇÆá Ëã ÊÙåÑåÇ Úáì ÇáÔÇÔÉ. åÐÇ ÇáãÊä íÕäÚ ÎÇÏãÇ íÑÓá Åáì ÇáÒãÑÉ 224.0.1.1 ßá ãÇ íÏÎáå ãä ãÏÇÎáå ÇáÞíÇÓíÉ. æ áÇ ÍÇÌÉ áÃí ÝÚá ÎÇÕ ááÊÑÇÓá Èá íßÝí ÚäæÇä ÇáÒãÑÉ. íãßäß Ãä ÊÚÏá ÎíÇÑÇÊ ÇáÇÑÊÌÇÚ æ ÇáÚãÑ ÅÐÇ áã ÊæÇÝÞ ÇáÞíã ÇáÊáÞÇÆíÉ ÇáÊØÈíÞ ÇáãÒãÚ.
ÇáãÏÎáÇÊ ÇáÞíÇÓíÉ ÊÑÓá Åáì ÚäæÇä ÒãÑÉ ÊÑÇÓáò 224.0.1.1
#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); } } }
Åáíß ÇáãÊä ÇáÐí íÈíä ÌÇäÈ ÇáÒÈæä. ÇáÒÈæä íÊáÞì ÇáÑÓÇÆá ÇáÊí íÈÚËåÇ ÇáÎÇÏã Åáì ÇáÒãÑÉ. ÇáÑÓÇÆá ÇáãÓÊáãÉ ÊÙåÑ Úáì ÇáãÎÑÌ ÇáÞíÇÓí. íÊãíÒ åÐÇ ÇáãÊä ÈÇáÎíÇÑ IP_ADD_MEMBERSHIP æãÇ ÚÏÇ Ðáß ÚÇÏí áÇÊÕÇá ÇáãÓÚì ÍÓÈ ãÑÓæã UDP .
#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); } } }
ßãÇ vHdkh ÑÃíäÇ ÂäÝÇ ¡ÝÅä ÇáãÓÚì ÅÐÇ ÃÑÇÏ ÇáÇäÖãÇã Åáì ÒãÑÉ ÊÑÇÓáò íÓÊÚãá ÇáÏÇáÉ setsockopt () áÊÚÏíá ÎíÇÑ IP_ADD_MEMBERSHIP Ýí ãÓÊæì IP . ãÊä åÐå ÇáÏÇáÉ ÊÌÏå Ýí /usr/src/linux/net/ipv4/ip_sockglue.c . æ Åáíß ãÊä ÇáÏÇáÉ ÇáÐí ÊÚÏá Èå åÐÇ ÇáÎíÇÑ æ ÎíÇÑ IP_DROP_MEMBERSHIP .
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);
ÇáÃÓØÑ ÇáÃæáì ÊÝÍÕ ÇáæÓíØ ÇáãÏÎá ip_mreq struct Åä ßÇä Øæáå ÕÍíÍÇ. æíãßä äÓÎå ãä ÇáãÓÊÚãá Åáì ÇáäæÇÉ. ÚäÏãÇ äÍÕá Úáì ÞíãÉ ÇáæÓíØ¡ ääÝÐ ÇáÏÇáÉ ip_mc_join_group() ááÇäÖãÇã Ãæ ip_mc_leave_group() ááÇäÓÍÇÈ. ãÊä åÇÊíä ÇáÏÇáÊíä ãæÌæÏ Ýí /usr/src/linux/net/ipv4/igmp.c . æ åÇåæ ÐÇ ãÊä ÇáÇäÖãÇã:
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;
ÈÇÏÆ Ðí ÈÏÁ äÊÍÞÞ – ÈÇáãÎÊÕÑ MULTICAST - Ãä ÚäæÇä ÇáÒãÑÉ Ýí ãÌÇá ÇáÚäÇæíä ÇáãÍÌæÒÉ ááÊÑÇÓá. áÐáß íßÝí Ãä äÊÍÞÞ Ãä ÇáÈÇíÊ- ÇáËãäÉ- ÇáÃÚáì íÓÇæí 224.
if (!MULTICAST(addr)) return -EINVAL; rtnl_shlock();
ÈÚÏ ÇáÊÍÞøÞ¡ ÊÈÏà æÇÌåÉ ÇáÔÈßÉ ÇáÊÚÇãá ãÚ ÇáÒãÑÉ . ÅÐÇ ÊÚÐÑ ÇáÏÎæá ÈæÇÓØÉ ÇáÏáíá Åáì ÇáæÇÌåÉ - ßãÇ íÌÈ ÍÓÈ IPv6- ÊäÝÐ ÇáÏÇáÉ áÅíÌÇÏ ÇáãáÍÞ device ÇáãÑÊÈØ ÈÚäæÇä IP ÇáãÍÏÏ. ÓäÝÊÑÖ ÝíãÇ ÊÈÞì ãä ÇáãÞÇá ÃäåÇ ßÐáß ãÇÏãäÇ äÚãá Úáì Ipv4 . ÅÐÇ ßÇä ÇáÚäæÇä INADDR_ANY ¡ Úáì ÇáäæÇÉ Ãä ÊÌÏ ÈäÝÓåÇ æÇÌåÉ ÇáÔÈßÉ ¡ ÅÐ ÊÞÑà ÌÏæá ÇáãÓÇáß æ ÊÎÊÇÑ ÇáæÕáÉ ÇáÝÖáì ÂÎÐÉ Ýí ÇáÍÓÈÇä ÚäæÇä ÇáÒãÑÉ æ ÊÚÑíÝ ÌÏæá ÇáãÓÇáß.
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; }
Ëãø äÍÌÒ ÇáÐÇßÑÉ ááÈäíÉ ip_mc_socklist¡ æ äÞÇÑä Ãí ÚäæÇä ÇáÒãÑÉ æ æÇÌåÉ ãÊÕá ÈÇáãÞÈÓ. ÝÅÐÇ ÇÑÊÈØ ÇáãÞÈÓ ÈÚäæÇä ãÇ ÓÇÈÞÇ¡ äÊÑß ÇáÏÇáÉ ÅÐ áÇ íßãä Ãä ÊÑÈØ ãÑÊíä ÒãÑÉ æ æÇÌåÉ. ÅÐÇ áã Êßä ÚäÇæíä æÇÌåÉ ÇáÔÈßÉ ãä äæÚ INADDR_ANY ¡íÒÏÇÏ ÇáÚÏÇÏ ÇáãØÇÈÞ ÞÈá Ãä ÊäÊåí ÇáÏÇáÉ.
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;
ÅÐÇ æÕáäÇ Åáì åÐå ÇáäÞØÉ ÝÐåÇ íÚäí ÈÃäø ãÞÈÓÇ ÌÏíÏ ÓíÑÊÈØ ÈÒãÑÉ áÐÇ íÌÈ ÅäÔÇÁ ãÏÎá ÌÏíÏ æ ÑÈØå ÈÞÇÆãÉ ÇáÒãÑ ÇáÊí ÊäÊãí Åáì ÇáãÞÈÓ. ÇáÐÇßÑÉ ãÍÌæÒÉ ãÞÏãÇ¡ áÐÇ íßÝí Ãä äÖÚ ÇáÞíã ÇáÕÍíÍÉ Ýí ÇáÍÞæá ÇáãäÇÓÈÉ ááÈäíÉ.
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; }
ÇáÏÇáÉ ip_mc_leave_group() ÊÓÊÚãá ááÇäÓÍÇÈ ãä ÒãÑÉ ÇáÊÑÇÓõá¡ æ åí ÃÓåá ãä ÇáÏÇáÉ ÇáÓÇÈÞÉ. ÅÐ ÊÈÍË Úä ÚäæÇä ÇáÒãÑÉ æ ÚäæÇä ÇáæÇÌåÉ ãä Èíä ÇáãÏÇÎá ÇáãÑÊÈØÉ ÈÇáãÞÈÓ æÍíä ÊÌÏåãÇ íÊäÇÞÕ ÚÏÏ ÇáÅÔÇÑÇÊ áÃä ãÓÚì ÇäÓÍÈ ãä ÇáÒãÑÉ. æÅÐÇ ÇäÚÏãÊ ÇáÞíãÉ ÇáÌÏíÏÉ íõÍÐÝ ÇáÚÏÇÏ.
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; }
ÇáÎíÇÑÇÊ ÇáÊÑÇÓá ÇáÃÎÑì ÇáÊí ÊØÑÞäÇ ÅáíåÇ ÈÓíØÉ. áÃäåÇ ÊõÚÏøöá Þíã ÍÞæá ÇáÈäíÉ ÇáÏÇÎáíÉ ááãÞÈÓ ÇáãÓÊÚãá. åÐÇ ãÇ ÊÄÏíå ÇáÏÇáÉ ip_setsockopt().
source code | ÇáãÊä |
Multicast | ÇáÊÑÇÓá |
Broadcast | ÇáÈË |
Routing table | ÌÏæá ÇáãÓÇáß |
Function | ÇáÏÇáÉ |
Group | 񋄃 |
multicast | ÊÑÇÓá ÇáÞæã ÊÑÇÓáÇ : Ãí ÑÇÓá ÈÚÖåã ÈÚÖÇ |
broadcast | ÈË ÇáÎÈÑ ÈÇË ÃÐÇÚå. |
|
ÇáÕÝÍÇÊ ÊÍÊ ÑÚÇíÉ ÇáÝÑíÞ ÇáÝäí ááíäßÓ ÝæßÇÓ
© Angel Lopez, FDL LinuxFocus.org ÇÖÛØ åäÇ ááÊäÈíå Úä ÎØÃ Ãæ ÇÑÓÇá ãáÇÍÙÇÊß Çáì áíäßÓ ÝæßÇÓ |
ãÚáæãÇÊ Úä ÇáÊÑÌãÉ:
|
2001-05-21, generated by lfparser version 2.13