Chương 3: Lập trình Multicasting - Lập trình mạng | Trường Đại học Bách khoa Hà Nội

Root multicast: một thành viên đóng vai trò là root phát tán thông tin tới các lá leaf, root truyền thông tin đồng thời tới các lá, lá chỉ truyền thông tin về root mà không thể truyền thông tin sang lá khác. Tài liệu được sưu tầm, giúp bạn ôn tập và đạt kết quả cao. Mời bạn đọc đón xem!

Chương 3: Lp trình Multicasting
Chương 3
1. Giithiuv multicast
- Multicast : phát tán thông tin ti mt nhóm địa ch mt cách đồng thi.
Root multicast và non –root multicast
o Root multicast: mt thành viên đóng vai trò là root phát tán thông tin ti các
lá leaf, root truyn thông tin đồng thi ti các lá, lá ch truyn thông tin v
root mà không th truyn thông tin sang lá khác
o Non root multicast: tt c các thành viên là các lá (leaf) , lá truyn thông tin
ti tt c các lá khác
Chương 3
1. Giithiuv multicast
- Unicast: giao tiếpch mt bên givàmt bên nhn
- Broadcast: Giao tiếpgit mt đimtittc các đim khác, broadcast
ch mt đimgi đi duy nht.
Chương 3
2. Địach IP dùng cho Multicast
-S dng địa ch lp D t 224.0.0.0 ti 239.255.255.255
-Mts địa ch IP đặc bit dùng cho multicast
Chương 3
2. Địach IP dùng cho Multicast
- Thành viên phi tham gia vào nhóm minhndư liu multicast được
-Chương trình gigi cho nhóm thi mi thành viên trong nhóm đềunhn đc
dư liu
Sender
Group
Member 1
Group
Member 1
Group
Member 1
Group
Member 2
Receiver
Receiver
Receiver
Sender & Receiver
Chương 3
2. Địach IP dùng cho Multicast
Giao thc IGMP (Internet Group Management Protocol ) :
- Là giao thc mà mi máy nhntraođổi thông tin vibô tìm đường
multicast ccbô (Local Multicast Router ) đê trơ thành mt thành viên
ca nhóm multicast
- Cung cpmtphương thc qua nó mt thành viên có thê tham gia hocri
bo nhóm multicast
- Đê tham gia nhóm thành viên gimt thông báo yêu cu tham gia nhóm
-Cácbô tìm đường multicast gi IGMP query titt c các thành viên đê
xem các thành viên còn trong nhóm hay không.
Chương 3
2. Địach IP dùng cho Multicast
Giao thc IGMP (Internet Group Management Protocol ) :
Joining a Group
R1 R2 R3
224.1.2.3
Report
Chương 3
2. Địach IP dùng cho Multicast
Giao thc IGMP (Internet Group Management Protocol ) :
Maintaining a Group
R1 R2 R3
224.1.2.3
224.1.2.3
Report
224.1.2.3
Suppressed
Suppressed
XX
Query
tìm đường định ky giquery ti 224.0.0.1 (tt c các thành viên trong mng
này)
Các thành viên có thê tra li report hoc không (còn tham gia hoc không)
Chương 3
3. Truyn/ nhn multicast
Gi multicast
-Hiuchnh li địach trong hàm sendto cho phù hp, địach nhóm cn
multicast
Nhn multicast
-Trước khi multicast, cn tham gia vào nhóm multicast bng cách gihàm
setsockopt
struct ip_mreq mreq;
setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));
ip_mreq có cu trúc như sau:
struct ip_mreq
{
struct in_addr imr_multiaddr; /* multicast group to join */
struct in_addr imr_interface; /* interface to join on */
}
Chương 3
3. Truyn/ nhn multicast
d tham gia vào mt nhóm multicast
SOCKET s;
SOCKADDR_IN localif;
struct ip_mreq mreq;
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
localif.sin_family = AF_INET;
localif.sin_port = htons(5150);
localif.sin_addr.s_addr = htonl(INADDR_ANY);
bind(s, (SOCKADDR *)&localif, sizeof(localif));
mreq.imr_interface.s_addr = inet_addr("157.124.22.104");
mreq.imr_multiaddr.s_addr = inet_addr("234.5.6.7");
setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq));
Chương 3
3. Truyn/ nhn multicast
Nhnd liu
nbytes=recvfrom(s,msgbuf,MSGBUFSIZE,0, (struct sockaddr *) &localif,
sizeof(localif))) ;
Chương 3
4. Gitin cy
Thiếtlp quá trình gitin cy qua các bước sau:
1. To socket multicast tin cy
2. Bind socket to INADDR_ANY.
3. Thiết lp địa ch giao tiếp là RM_SET_SEND_IF.
4. Kết ni socket ti địa ch nhóm multicast.
Chương 3
4. Gitin cy
d quá trình gitin cy:
SOCKET s;
ULONG sendif;
SOCKADDR_IN localif,
multi; char buf[1024];
int buflen=1024;
s = socket(AF_INET, SOCK_RDM, IPPROTO_RM); // SOCK_RDM ging SOCK_DGRAM
// Bind to INADDR_ANY
localif.sin_family = AF_INET;
localif.sin_port = htons(0);
localif.sin_addr.s_addr = htonl(INADDR_ANY);
bind(s, (SOCKADDR *)&localif, sizeof(localif));
Chương 3
4. Gitin cy
// Set the outgoing interface
sendif = inet_addr("157.124.22.104");
setsockopt(s, IPPROTO_RM, RM_SET_SEND_IF, (char *)&sendif, sizeof(sendif));
// Connect the socket to the multicast destination
multi.sin_family = AF_INET;
multi.sin_port = htons(5150);
multi.sin_addr.s_addr =
inet_addr("234.5.6.7"); connect(s, (SOCKADDR *)&multi, sizeof(multi));
// Send the data
send(s, buf, buflen, 0); // Close up the session
closesocket(s);
Chương 3
5. Nhn tin cy
Thiếtlp quá trình nhntin cy qua các bước sau:
1. To socket multicast tin cy
2. Bind socket địa ch nhóm multicast.
3. Nếu chương trình nhn cn lng nghe trên giao tiếp c th thì gi
setsockopt và RM_ADD_RECEIVE_IF cho tng interface đó
4. Gi listen
5. Ch đợi accept
Chương 3
5. Nhn tin cy
Ví d nhn tin cy:
SOCKET s, ns;
SOCKADDR_IN multi, safrom;
ULONG localif;
char buf[1024];
int buflen=1024, fromlen, rc;
s = socket(AF_INET, SOCK_RDM, IPPROTO_RM);
multi.sin_family = AF_INET;
multi.sin_port = htons(5150);
multi.sin_addr.s_addr = inet_addr("234.5.6.7");
bind(s, (SOCKADDR *)&multi, sizeof(multi));
listen(s, 10);
Chương 3
Ví d nhn tin cy:
localif = inet_addr("157.124.22.104");
setsockopt(s, IPPROTO_RM, RM_ADD_RECEIVE_IF, (char *)&localif, sizeof(localif));
fromlen = sizeof(safrom);
ns = accept(s, (SOCKADDR *)&safrom, &fromlen);
closesocket(s);
// Don't need to listen anymore
// start receiving data . . .
while (1) {
rc = recv(ns, buf, buflen, 0);
if (rc == SOCKET_ERROR)
{ if (WSAGetLastError() == WSAEDISCON)
break;
else { // An unexpected error }
}
}
closesocket(ns);
5. Nhn tin cy
| 1/17

Preview text:

Chương 3: Lập trình Multicasting Chương 3
1. Giới thiệu về multicast -
Multicast : phát tán thông tin tới một nhóm địa chỉ một cách đồng thời.
Root multicast và non –root multicast o
Root multicast: một thành viên đóng vai trò là root phát tán thông tin tới các
lá leaf, root truyền thông tin đồng thời tới các lá, lá chỉ truyền thông tin về
root mà không thể truyền thông tin sang lá khác o
Non root multicast: tất cả các thành viên là các lá (leaf) , lá truyền thông tin
tới tất cả các lá khác Chương 3
1. Giới thiệu về multicast -
Unicast: giao tiếp chỉ có một bên gửi và một bên nhận -
Broadcast: Giao tiếp gửi từ một điểm tới tất cả các điểm khác, broadcast
chỉ có một điểm gửi đi duy nhất. Chương 3
2. Địa chỉ IP dùng cho Multicast -
Sử dụng địa chỉ ở lớp D từ 224.0.0.0 tới 239.255.255.255 -
Một số địa chỉ IP đặc biệt dùng cho multicast Chương 3
2. Địa chỉ IP dùng cho Multicast -
Thành viên phải tham gia vào nhóm mới nhận dữ liệu multicast được -
Chương trình gửi gửi cho nhóm thì mọi thành viên trong nhóm đều nhận đc dữ liệu Receiver Receiver Group Group Member 1 Member 1 Receiver Group Member 2 Sender Group Member 1 Sender & Receiver Chương 3
2. Địa chỉ IP dùng cho Multicast
Giao thức IGMP (Internet Group Management Protocol ) : -
Là giao thức mà mỗi máy nhận trao đổi thông tin với bộ tìm đường
multicast cục bộ (Local Multicast Router ) để trở thành một thành viên của nhóm multicast -
Cung cấp một phương thức qua nó một thành viên có thể tham gia hoặc rời bỏ nhóm multicast -
Để tham gia nhóm thành viên gửi một thông báo yêu cầu tham gia nhóm -
Các bộ tìm đường multicast gửi IGMP query tới tất cả các thành viên để
xem các thành viên còn trong nhóm hay không. Chương 3
2. Địa chỉ IP dùng cho Multicast
Giao thức IGMP (Internet Group Management Protocol ) : Joining a Group 224.1.2.3 R1 R2 R3 Report Chương 3
2. Địa chỉ IP dùng cho Multicast
Giao thức IGMP (Internet Group Management Protocol ) : Maintaining a Group 224.1.2.3 224.1.2.3 224.1.2.3 R1 R2 R3 X X Suppressed Report Suppressed Query
Bộ tìm đường định kỳ gửi query tới 224.0.0.1 (tất cả các thành viên trong mạng này)
Các thành viên có thể trả lời report hoặc không (còn tham gia hoặc không) Chương 3
3. Truyền/ nhận multicast Gửi multicast -
Hiệu chỉnh lại địa chỉ trong hàm sendto cho phù hợp, địa chỉ là nhóm cần multicast Nhận multicast -
Trước khi multicast, cần tham gia vào nhóm multicast bằng cách gọi hàm setsockopt struct ip_mreq mreq;
setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));
ip_mreq có cấu trúc như sau: struct ip_mreq {
struct in_addr imr_multiaddr; /* multicast group to join */
struct in_addr imr_interface; /* interface to join on */ } Chương 3
3. Truyền/ nhận multicast
Ví dụ tham gia vào một nhóm multicast SOCKET s; SOCKADDR_IN localif; struct ip_mreq mreq;
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); localif.sin_family = AF_INET;
localif.sin_port = htons(5150);
localif.sin_addr.s_addr = htonl(INADDR_ANY);
bind(s, (SOCKADDR *)&localif, sizeof(localif));
mreq.imr_interface.s_addr = inet_addr("157.124.22.104");
mreq.imr_multiaddr.s_addr = inet_addr("234.5.6.7");
setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)); Chương 3
3. Truyền/ nhận multicast Nhận dữ liệu
nbytes=recvfrom(s,msgbuf,MSGBUFSIZE,0, (struct sockaddr *) &localif, sizeof(localif))) ; Chương 3 4. Gửi tin cậy
Thiết lập quá trình gửi tin cậy qua các bước sau: 1.
Tạo socket multicast tin cậy 2. Bind socket to INADDR_ANY. 3.
Thiết lập địa chỉ giao tiếp là RM_SET_SEND_IF. 4.
Kết nối socket tới địa chỉ nhóm multicast. Chương 3 4. Gửi tin cậy
Ví dụ quá trình gửi tin cậy: SOCKET s; ULONG sendif; SOCKADDR_IN localif, multi; char buf[1024]; int buflen=1024;
s = socket(AF_INET, SOCK_RDM, IPPROTO_RM); // SOCK_RDM giống SOCK_DGRAM // Bind to INADDR_ANY localif.sin_family = AF_INET; localif.sin_port = htons(0);
localif.sin_addr.s_addr = htonl(INADDR_ANY);
bind(s, (SOCKADDR *)&localif, sizeof(localif)); Chương 3 4. Gửi tin cậy // Set the outgoing interface
sendif = inet_addr("157.124.22.104");
setsockopt(s, IPPROTO_RM, RM_SET_SEND_IF, (char *)&sendif, sizeof(sendif));
// Connect the socket to the multicast destination multi.sin_family = AF_INET; multi.sin_port = htons(5150); multi.sin_addr.s_addr =
inet_addr("234.5.6.7"); connect(s, (SOCKADDR *)&multi, sizeof(multi)); // Send the data
send(s, buf, buflen, 0); // Close up the session closesocket(s); Chương 3 5. Nhận tin cậy
Thiết lập quá trình nhận tin cậy qua các bước sau: 1.
Tạo socket multicast tin cậy 2.
Bind socket địa chỉ nhóm multicast. 3.
Nếu chương trình nhận cần lắng nghe trên giao tiếp cụ thể thì gọi
setsockopt và RM_ADD_RECEIVE_IF cho từng interface đó 4. Gọi listen 5. Chờ đợi accept Chương 3 5. Nhận tin cậy Ví dụ nhận tin cậy: SOCKET s, ns; SOCKADDR_IN multi, safrom; ULONG localif; char buf[1024]; int buflen=1024, fromlen, rc;
s = socket(AF_INET, SOCK_RDM, IPPROTO_RM); multi.sin_family = AF_INET; multi.sin_port = htons(5150);
multi.sin_addr.s_addr = inet_addr("234.5.6.7");
bind(s, (SOCKADDR *)&multi, sizeof(multi)); listen(s, 10); Chương 3 5. Nhận tin cậy Ví dụ nhận tin cậy:
localif = inet_addr("157.124.22.104");
setsockopt(s, IPPROTO_RM, RM_ADD_RECEIVE_IF, (char *)&localif, sizeof(localif)); fromlen = sizeof(safrom);
ns = accept(s, (SOCKADDR *)&safrom, &fromlen); closesocket(s);
// Don't need to listen anymore // start receiving data . . . while (1) {
rc = recv(ns, buf, buflen, 0); if (rc == SOCKET_ERROR)
{ if (WSAGetLastError() == WSAEDISCON) break;
else { // An unexpected error } } } closesocket(ns);