|
|
This document is available in: English Castellano Deutsch Francais Nederlands Russian Turkce Arabic |
������ 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