Tải bản đầy đủ (.pdf) (17 trang)

lập trình mạng nguyễn cao đạt chương 3 lập trình multicasting sinhvienzone com

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (202.37 KB, 17 trang )

Si

nh
Vi
en

Zo

ne

.C

om

Chương 3: Lập trình Multicasting

SinhVienZone.com

/>

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.

om

-

.C


Root multicast và non –root multicast

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

Si

nh
Vi
en

Zo

ne

o

SinhVienZone.com

/>

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.

Si

nh
Vi
en

Zo

ne

.C

om

-

SinhVienZone.com

/>

Chương 3

2. Địa chỉ IP dùng cho Multicast


nh
Vi
en

Zo

ne

.C

om

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

Si

-

SinhVienZone.com

/>

Chương 3

2. Địa chỉ IP dùng cho Multicast

ne


nh
Vi
en

Zo

Group
Member 1

.C

om

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

Si

-

Group
Member 1

Receiver
Group
Member 2

Sender

Group
Member 1

Sender & Receiver
SinhVienZone.com

/>

Chương 3

2. Địa chỉ IP dùng cho Multicast

Si

nh
Vi
en

Zo

ne

.C

om

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.

SinhVienZone.com

/>

Chương 3

2. Địa chỉ IP dùng cho Multicast

om

Giao thức IGMP (Internet Group Management Protocol ) :

Zo

ne

.C

Joining a Group
R2

R3

Report


Si

nh
Vi
en

R1

224.1.2.3

SinhVienZone.com

/>

Chương 3

2. Địa chỉ IP dùng cho Multicast

om

Giao thức IGMP (Internet Group Management Protocol ) :

Zo

X

R1

224.1.2.3


nh
Vi
en

224.1.2.3

Report

Si

Suppressed

ne

.C

Maintaining a Group
R2

224.1.2.3

X

R3

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)
SinhVienZone.com

/>

Chương 3

3. Truyền/ nhận multicast

.C

om

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

Zo

ne

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

nh
Vi
en


struct ip_mreq mreq;
setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));

Si

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 */
}

SinhVienZone.com

/>

Chương 3

3. Truyền/ nhận multicast

om

Ví dụ tham gia vào một nhóm multicast

.C

SOCKET s;

ne


SOCKADDR_IN localif;
struct ip_mreq mreq;
localif.sin_family = AF_INET;

nh
Vi
en

localif.sin_port = htons(5150);

Zo

s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

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");

Si

mreq.imr_multiaddr.s_addr = inet_addr("234.5.6.7");
setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq));

SinhVienZone.com

/>

Chương 3

3. Truyền/ nhận multicast


om

Nhận dữ liệu

Si

nh
Vi
en

Zo

ne

.C

nbytes=recvfrom(s,msgbuf,MSGBUFSIZE,0, (struct sockaddr *) &localif,
sizeof(localif))) ;

SinhVienZone.com

/>

Chương 3

Thiết lập quá trình gửi tin cậy qua các bước sau:

om


4. Gửi tin cậy
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.

Si

nh
Vi
en

Zo

ne

.C

1.

SinhVienZone.com


/>

Chương 3

4. Gửi tin cậy

om

Ví dụ quá trình gửi tin cậy:

.C

SOCKET s;
ULONG sendif;

ne

SOCKADDR_IN localif,

Zo

multi; char buf[1024];
int buflen=1024;

nh
Vi
en

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);

Si

localif.sin_addr.s_addr = htonl(INADDR_ANY);
bind(s, (SOCKADDR *)&localif, sizeof(localif));

SinhVienZone.com

/>

Chương 3

4. Gửi tin cậy

om

// Set the outgoing interface

.C

sendif = inet_addr("157.124.22.104");

setsockopt(s, IPPROTO_RM, RM_SET_SEND_IF, (char *)&sendif, sizeof(sendif));

ne


// Connect the socket to the multicast destination
multi.sin_port = htons(5150);

nh
Vi
en

multi.sin_addr.s_addr =

Zo

multi.sin_family = AF_INET;

inet_addr("234.5.6.7"); connect(s, (SOCKADDR *)&multi, sizeof(multi));
// Send the data
closesocket(s);

Si

send(s, buf, buflen, 0); // Close up the session

SinhVienZone.com

/>

Chương 3

5. Nhận tin cậy

om


Thiết lập quá trình nhận tin cậy qua các bước sau:
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

ne

.C

1.

Zo

setsockopt và RM_ADD_RECEIVE_IF cho từng interface đó
Gọi listen

5.

Chờ đợi accept

Si

nh

Vi
en

4.

SinhVienZone.com

/>

Chương 3

5. Nhận tin cậy

om

Ví dụ nhận tin cậy:

.C

SOCKET s, ns;
SOCKADDR_IN multi, safrom;
char buf[1024];
int buflen=1024, fromlen, rc;

Zo

ne

ULONG localif;


nh
Vi
en

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");
listen(s, 10);

Si

bind(s, (SOCKADDR *)&multi, sizeof(multi));

SinhVienZone.com

/>

Chương 3

5. Nhận tin cậy

om

Ví dụ nhận tin cậy:

localif = inet_addr("157.124.22.104");


.C

setsockopt(s, IPPROTO_RM, RM_ADD_RECEIVE_IF, (char *)&localif, sizeof(localif));
fromlen = sizeof(safrom);
closesocket(s);
// Don't need to listen anymore

nh
Vi
en

// start receiving data . . .

Zo

ne

ns = accept(s, (SOCKADDR *)&safrom, &fromlen);

while (1) {

rc = recv(ns, buf, buflen, 0);

if (rc == SOCKET_ERROR)

Si

{ if (WSAGetLastError() == WSAEDISCON)
break;


else { // An unexpected error }
}
}
closesocket(ns);
SinhVienZone.com

/>


×