[LinuxFocus-icon]
Home  |  Map  |  Index  |  Search

News | Archives | Links | About LF  
[an error occurred while processing this directive]
[Photo of the Author]
ÇáãÄáÝ Angel Lopez

äÈÐÉ Úä ÇáßÇÊÈ:

ÇäÌá Ãäåì ÏÑÇÓÇÊå Ýí åäÏÓÉ ÇáÍÇÓæÈ. æ íÚãá ÃÓÊÇÐÇ áÏì Õä ãÇíßÑÓíÓÊãÒ, íÚáøã ãÈÇÏÆ ÓæáÇÑíÓ æÅÏÇÑÉ ÇáÔÈßÇÊ . ÓÇÚÏ ÑÇãÇ Ýí ÊÃáíÝ ßÊÇÈ ãÑÇÓã ÇáÅäÊÑäÊ. ÇáÊÕãíã æÇáÊØÈíÞ Úáì ÃäÙãÉ ÇáíõäößúÓ. íåÊã ÃÓÇÓÇ ÈÇáÔÈßÇÊ æ ÇáÃã䡿 ÈÑãÌÉ äÙã íõäößÓ æ ÔÈßÇÊå. æ ãÄÎÑÇ íåÊã ÈÊÏÞíÞ äæÇÉ áíäõßÓ ÍÊì ÇÖØÑ Åáì ÊÞáíá äæãå.


ÇáãÍÊæíÇÊ:

 

ÇáÊÑÇÓá MultiCast

[Ilustration]

äÈÐÉ ãÎÊÕÑÉ:

åÐÇ ÇáãÞÇá ÃÑíÏå ãÞÏãÉ Ýí ÊÞäíÇÊ ÇáÊÑÇÓá Úáì ÔÈßÇÊ TCP/IP. íÚÑÖ ÇáãÝÇåíã ÇáäÙÑíÉ ÇáÊÑÇÓá¡ æ ÊÝÇÕíá ÇÓÊÎÏÇã æÇÌåÉ ÈÑãÌÉ ÇáÊØÈíÞÇÊ API ÇáÊí ÊÓÇÚÏäÇ Úáì ÈÑãÌÉ ÊØÈíÞÇÊ ÇáÊÑÇÓá. æ ÓäÑì ÃíÖÇ æÙÇÆÝ ÇáäæÇÉ ÇáÊí ÊÏÚã åÐå ÇáÊÞäíÉ áÇÓÊßãÇá ÝßÑÊäÇ ÇáÚÇãÉ Úä ÏÚã ÇáÊÑÇÓá Ýí áíäõßúÓ. æ äÎÊã ãÞÇáäÇ ÈãËÇá Úãáí Úä ÈÑãÌÉ ÇáãÞÇÈÓ ÈáÛÉ C ÊæÖíÍÇ áÅäÔÇÁ ÇáÊÑÇÓá.



 

ãÞÏãÉ

Ííä ÊÑíÏ æÕá ãÖíøÝ (æÕáÉ) Åáì ÇáÔÈßÉ¡ÊÓÊØíÚ Ãä ÊÓÊÚãá ÚäæÇäÇ ãä Èíä ËáÇËÉ ÃäæÇÚ ãÎÊáÝÉ ãä ÇáÚäÇæíä:



ÚäÇæíä ÇáÊÑÇÓá ãÝíÏÉ ÅÐÇ ÃÑÏäÇ ÅÚáÇã ÈÚÖ ÇáãÖíÝíä Ïæä ÅÐÇÚÉ ÇáãÚáæãÇÊ Ýí ÇáÔÈßÉ. åÐÇ ÇáãÓÚì ãËÇáí ÍíäãÇ íÓÊáÒã ÅÑÓÇá ãÚáæãÇÊ ãÊÚÏÏÉ ÇáæÓÇÆØ ( ßÇáÕæÊ æ ÇáÕæÑÉ Úáì ÇáÝæÑ ãËáÇ) Åáì ÈÚÖ ÇáãÖíøÝíä. ããÇ íÌÚá ÇáÇÊÕÇá ÈÇáãÖíÝíä æÇÍÏÇ ÈæÇÍÏ – ÇÊÕÇá æÍíÏ- ãÊÚÈÇ æßÐáß áÇ íÓÊÍÓä ÅÐÇÚÉ ÇáãÚáæãÇÊ Ýí ÇáÔÈßÉ ÇáÝÑÚíÉ – Ýí ÚäæÇä ÅÐÇÚí – áÇÓíãÇ Åä ßÇä ÃÍÏ ÇáãÓÊáãíä ÎÇÑÌ Úä äØÇÞåÇ

 

ÚäæÇä ÇáÊÑÇÓá

áÇÈÏ Ãäß ÊÚÑÝ Ãä ÚäÇæíä ÇáÅäÊÑäÊ IP ËáÇËÉ ÃÕäÇÝ åí A, B, C æ ÕäÝ ÑÇÈÚ D ãÍÌæÒ ááÊÑÇÓá. ÇáÚäÇæíä ãä IPv4 ãÇ Èíä 224.0.0.0 æ 239.255.255.255 ÊäÊãí Åáì ÇáÕäÝ D.

ÇáÈÊøÇÊ ÇáÃÑÈÚÉ ÇáÚáíÇ ãä ÚäæÇä ãÑÓæã ÇáÅäÊÑäÊ ÊÊÑÇæÍ ãÇ Èíä ÇáÞíã Èíä 224 æ 239. ÈíäãÇ ÇáÈÊøÇÊ ÇáËãÇäíÉ æ ÇáÚÔÑíä ÇáÈÇÞíÉ ãÍÌæÒÉ áãÚÑøÝ ãÌãæÚÉ ÇáÊÑÇÓá ¡ ßãÇ íÊÖÍ Ýí ÇáÕæÑÉ

[grouped bits]


Ýí ãÓÊæì ÇáÔÈßÉ¡ íÌÈ Ãä íÊæÇÝÞ ÚäæÇä Ipv4 ãÚ ÇáÚäæÇä ÇáÍÞíÞí ááÔÈßÉ ÇáÊí äÚãá ÚáíåÇ. ÅÐÇ ßäÇ äÚãá ÈÚäæÇä ÔÈßÉ unicast¡ íãßä ãÚÑÝÉ ÇáÚäæÇä ÇáÍÞíÞí ÈÇáãÑÓæã ARP æÇáÐí áÇ íÌÏí äÝÚÇ ãÚ ÚäÇæíä ÇáÊÑÇÓá.áÐÇ äÓÊÚãá ØÑÇÆÞ ÃÎÑì. ÈÚÖ ãÑÇÌÚ RFC ÊÊÍÏË Úä ÈÚÖ åÐå ÇáØÑÞ.

æÊÑÌãÊå



Ýí ÔÈßÇÊ Ethernet ÇáÃßËÑ ÇÊÓÇÚÇ ãäåÇ ¡ ááãØÇÈÞÉ äÖÚ Ýí ÇáÈÊøÇÊ Çá24 ÇáÃÚáì ÇáÞíãÉ 01:00:5E . æ ÇáÈÊ ÇáãæÇáí ãÚÏæã Ãí íÓÇæí ÇáÕÝÑ¡ æÇáÈÊøÇÊ Çá23 ÇáÃÏäì ÊÓÊÚãá ÇáÈÊÇÊ Çá23 ÇáÃÏäì ãä ÚäæÇä ÊÑÇÓá ßãÇ íÙåÑ Ýí ÇáÑÓã :
[transform to Ethernet]

ãËáÇ ÚäæÇä Ipv4 ááÊÑÇÓá 224.0.0.5 ÓíØÇÈÞ ÇáÚäæÇä ÇáÍÞíÞí ááÅíËÑäÊ 01:00:5E:00:00:05 .

åäÇß ÈÚÖ ÚäÇæíä ÇáÊÑÇÓá ÇáÎÇÕÉ :

ßËíÑ ãä ÚäÇæíä ÇáÊÑÇÓá ãÍÌæÒÉ ÚÏÇ ÇáãÐßæÑÉ ÂäÝÇ . íãßäß Ãä ÊØøáÚ Úáì ãÚáæãÇÊ æÇÝíÉ Ýí ÂÎÑ äÓÎÉ ãä " ÇáÃÑÞÇã ÇáãÍÌæÒÉ" ãÑÇÌÚ 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 ÝÓíÊÚÑÝ Úáì ÇáÑÒã ÇáÊí ÚáíåÇ ÃÍÏ åÐå ÇáÚäÇæíä :

ááÊÑÇÓá Úáì ÔÈßÉ æÇÓÚÉ WAN íÌÈ Ãä ÊÏÚã ÇáãÓÇÑÇÊ ÇáÊÑÇÓá. ÚäÏãÇ íäÖã "ãÓÚì" process Åáì ÒãÑÉ ãÇ íÑÓá ÇáãÖíÝ ÑÓÇáÉ IGMP (Internet Group Management Protocol) ¡ ãÑÓæã ÅÏÇÑÉ ÒãÑ ÇáÇäÊÑäÊ Åáì ßá ãÓÇÑ ÊÑÇÓáí Ýí ÇáÔÈßÉ ÇáÝÑÚíÉ¡ áÅÚáÇãåã Ãä íæÌåæÇ ÇáÑÓÇÆá ÊÑÇÓá Åáì ÇáÔÈßÉ ÇáÝÑÚíÉ áíÊãßä ÇáãÓÚì ãä ÇÓÊÞÈÇáåÇ. æ ÇáãÓÇÑÇÊ ÓÊÎÈÑ ÇáãÓÇÑÇÊ ÇáÃÎÑì Ãä ÊæÌå ÅáíåÇ Ãíø ÑÓÇÆá ãÊÑÇÓáÉ ÎÇÕÉ ÈÇáÔÈßÉ ÇáÝÑÚíÉ.

ÇáãÓÇÑÇÊ ÊÑÓá ÃíÖÇ ÑÓÇÆá IGMP Åáì ÇáÒãÑÉ 224.0.0.1 ÊØáÈ ßáø ÇáãÚáæãÇÊ ÇááÇÒãÉ Úä ÇáÒãÑÉ ÇáÊí ÇäÖã ÅáíåÇ ÇáãÖíÝ. æ ÍíäãÇ íÓÊáã ÇáãÖíÝ åÐå ÇáÑÓÇáÉ íÖÚ Ýí ÚÏÇÏ ãÊäÇÞÕ ÞíãÉ ãÇ –ÚÔæÇÆíÇ – æ ÓíÌíÈ ÚäÏãÇ ÊäÚÏã. ÍÊì áÇ íÌíÈ ßáø ÇáãÖíøÝíä Ýí ÇáæÞÊ äÝÓå æáÇ ÊÊÍãá ÇáÔÈßÉ ÚÈÆÇ ÒÇÆÏÇ . æÍíä íÌíÈ ÇáãÖíÝ íÑÓá ÑÓÇáÉ Åáì ÚäæÇä ÇáÒãÑÉ ÝíÊáÞÇåÇ ßá ÇáãÖíÝíä ÇáÃÚÖÇÁ. ÝáÇ íÌíÈæä ÈÃäÝÓåã ÅÐ íßÝí ãÖíÝ æÇÍÏ ÍÊì íÊÚÇãá ãÓÇÑ ÇáÔÈßÉ ÇáÝÑÚíÉ ãÚ ÇáÑÓÇÆá ÇáãÊÑÇÓáÉ áåÐå ááÒãÑÉ

ÅÐÇ ÇäÓÍÈ ßáø ÇáãÖíøÝíä ãä ÇáÒãÑÉ ÝáÇ ÃÍÏ ÓíÌíÈ¡ ÚäÏÆÐ íÞÑÑ ÇáãÓÇÑ Ãä áÇ ÃÍÏ íåÊã ÈåÐå ÇáÒãÑÉ ÝíÊÑßåÇ æ áÇ íæÌå ÅáíåÇ Ãí ÑÓÇáÉ. ÎíÇÑ ÂÎÑ ãÏÚæã Ýí IGMPv2 åæ Ãä íÑÓá ÇáãÖíÝ ÑÓÇáÉ ÇäÓÍÇÈ ãä ÇáÒãÑÉ Åáì ÇáÚäæÇä 224.0.0.2.

 

æÇÌåÉ ÈÑãÌÉ ÇáÊØÈíÞÇÊ API

ÍÓÈ ÇáÎÈÑÉ ÇáÓÇÈÞÉ Ýí ÈÑãÌÉ ÇáãÞÇÈÓ¡ ÓíÌÏ ÇáÞÇÑÆ ÎãÓÇ ãä ÚãáíÇÊ ÇáãÞÇÈÓ ÇáÌÏíÏÉ ÝÞØ áíÊÚÇãá ãÚ ÎíÇÑÇÊ ÇáÊÑÇÓá . ÇáÏÇáÉ 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


 

ÇáÇäÖãÇã IP_ADD_MEMBERSHIP

áíäÖã ãÓÚì process Åáì ÒãÑÉ íÑÓá ÈãÞÈÓ ÈÇáÏÇáÉ setsockopt(). æ æÓíØåÇ ÈäíÉ ip_mreq: ÍíË ÍÞáåÇ ÇáÃæá imr_multiaddr Ýíå ÚäæÇä ÇáÒãÑÉ ÇáãÞÕæÏÉ ¡ æ ÇáËÇäí imr_interface Ýíå ÚäæÇä æÇÌåÉ ÇáãÖíÝ.

 

ÇáÇäÓÍÇÈ IP_DROP_MEMBERSHIP

ÇÓÊÚãá åÐÇ ÇáÎíÇÑ ááÇäÓÍÇÈ ãä ÇáÒãÑÉ. ÍÞæá ÇáÈäíÉ ip_mreq ãÓÊÚãáÉ ßãÇ Ýí ÇáÇäÖãÇã.

 

ÊÍÏíÏ ÇáÇÓÊáÇã IP_MULTICAST_IF

ÇÓÊÚãá åÐÇ ÇáÎíÇÑ áÊÍÏíÏ æÇÌåÉ ÇáÔÈßÉ ÇáÊí íÓÊÚãáåÇ ÇáãÞÈÓ ááÊÑÇÓá. ÍÞæá ÇáÈäíÉ ip_mreq ãÓÊÚãáÉ ßãÇ Ýí ÇáÇäÖãÇã.

 

ÊÍÏíÏ ÇáÚãÑ IP_MULTICAST_TTL

ÍÏÏ Èå ÚãÑ TTL Time To Live ÑÒã ÇáÊÑÇÓáÇáãÑÓáÉ ÈÇáãÞÈÓ. ÇáÞíãÉ ÊáÞÇÆíÇ 1 Ãí Ãä ÑÒãÉ ÇáÈíÇäÇÊ áä ÊÊÌÇæÒ ÇáÔÈßÉ ÇáÝÑÚíÉ.

 

ÇáÇÑÊÌÇÚ IP_MULTICAST_LOOP

Ííä íÑÓá ãÓÚì 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

ÇÖÛØ åäÇ ááÊäÈíå Úä ÎØÃ Ãæ ÇÑÓÇá ãáÇÍÙÇÊß Çáì áíäßÓ ÝæßÇÓ
ãÚáæãÇÊ Úä ÇáÊÑÌãÉ:
es -> -- Angel Lopez
es -> en Javier Palacios
en -> ar Øå ÒÑæÞí

2001-05-21, generated by lfparser version 2.13