本文主要介紹如何在sylixos上使用組播功能。
組播傳輸,即在傳送者和每一接收者之間實現點對多點網路連線通訊。正常大家會參考linux使用組播的方法:把本機加入組播位址,即本機網絡卡作為組播成員,只有加入組才能收到組播訊息。通過setsockopt設定加入組播,這樣便可以接收組播資訊。linux參考**如程式清單 2.1和程式清單 2.2所示。
程式清單 2.1 mcastserver
#include
#include
#include
#include
#include
#include
#include
#include
#define
buflen 255
intmain
(int
argc
, char
**argv)
/* *
設定要加入組播的位址
*/ bzero
(&mreq
, sizeof
(struct
ip_mreq));
if(argv
[1])
} else
bcopy
((void
*) group
->
h_addr
, (void
*) &
ia,
group
->
h_length
); /*
* 設定組位址
*/ bcopy
(&ia
, &mreq
.imr_multiaddr
.s_addr
, sizeof
(struct
in_addr));
/* *
設定傳送組播訊息的源主機的位址資訊
*/ mreq
.imr_inte***ce
.s_addr
= htonl
(inaddr_any
); /*
* 把本機加入組播位址,即本機網絡卡作為組播成員,只有加入組才能收到組播訊息
*/ if
(setsockopt
(sockfd
, ipproto_ip
, ip_add_membership
, &mreq
, sizeof
(struct
ip_mreq)) == -1)
socklen
= sizeof
(struct
sockaddr_in);
memset
(&peeraddr
, 0,
socklen
); peeraddr
.sin_family
= af_inet
; if
(argv
[2])
else
if(argv
[1])
} else
/* *
繫結自己的埠和
ip資訊到
socket
上 */
if(bind
(sockfd
, (struct
sockaddr *) &
peeraddr
, sizeof
(struct
sockaddr_in)) == -1)
/* *
迴圈接收網路上來的組播訊息
*/ for
(;;)
else
} return
0; }
程式清單 2.2 mcastclient
#include
#include
#include
#include
#include
#include
#define
buflen 255
intmain
(int
argc
, char
**argv)
socklen
= sizeof
(struct
sockaddr_in);
/* *
設定對方的埠和
ip資訊
*/ memset
(&peeraddr
, 0,
socklen
); peeraddr
.sin_family
= af_inet
; if
(argv
[2])
else
if(argv
[1])
} else
/* *
設定自己的埠和
ip資訊
*/ memset
(&myaddr
, 0,
socklen
); myaddr
.sin_family
= af_inet
; if
(argv
[4])
else
if(argv
[3])
} else
myaddr
.sin_addr
.s_addr
= inaddr_any
; /*
* 繫結自己的埠和
ip資訊到
socket
上 */
if(bind
(sockfd
, (struct
sockaddr *) &
myaddr
, sizeof
(struct
sockaddr_in))
== -1)
/* *
迴圈接受使用者輸入的訊息傳送組播訊息
*/ for
(;;)
/* *
傳送訊息
*/ if
(sendto
(sockfd
, recmsg
, strlen
(recmsg
), 0,(
struct
sockaddr *)
&peeraddr
, sizeof
(struct
sockaddr_in))< 0)
printf
("'%s' send ok\n"
, recmsg
); }
return
0; }
把linux的組播程式移植到sylixos上編譯,匯入執行sylixos的板卡上,執行結果如圖 2.1所示。
圖 2.1 組播執行結果
根據圖 2.1所示mcastclient組播資訊沒有被mcastserver接收到,而該測試**在linux上執行正常。經過分析發現linux在網路協議棧中預設開啟ip_multicast_loop,即允許組播進行本地回環通訊,而sylixos的網路協議棧預設沒有開啟該選項。所以在sylixos的組播**中新增使用setsockopt設定ip_multicast_loop,即允許組播本地回環的選項。在mcastclient程式中新增**如程式清單 2.3所示。
程式清單 2.3 setsockopt設定
intloop
= 1;
if(setsockopt
(sockfd
, ipproto_ip
, ip_multicast_loop
, &loop
, sizeof
(loop
)) == -1)
重新編譯mcastclient上傳執行,結果如圖 2.2所示。
圖 2.2 組播執行正常
《realevo-ide使用手冊》
IP組播與組播協議
在internet上,多 業務諸如 圖1.1 1.ip組播 ip組播是指乙個ip報文向乙個 主機組 的傳送,這個包含零個或多個主機的主機組由乙個單獨的 ip位址標識。主機組位址也稱為 組播位址 或者d類位址。除了目的位址部分,組播報文與普通報文沒有區別,網路盡力傳送組播報文但是並不保證一定送達。主機...
組播位址,IP組播位址
ip組播位址 組播協議的位址在 ip協議中屬於 d類位址。d類位址是從 224.0.0.0 到239.255.255.255 之間的ip 位址其中 224.0.0.0 到224.0.0.255 是被保留的位址。組播協議的位址範圍類似於一般的單播位址,被劃分為兩個大的位址範圍,239.0.0.0 23...
IP組播與組播協議
在internet上,多 業務諸如 流 伺服器必須為每乙個接收者提供乙個相同內容的ip報文拷貝,同時 網路上也重複地傳輸相同內容的報文,占用了大量資源。如圖1.1所示。雖然ip廣播允許乙個主機把乙個ip報文傳送給同乙個網路的所有主機,但是由於不是所有的主機都需要這些報文,因而浪費了網路資源。在這種情...