SylixOS組播使用

2021-08-13 23:49:31 字數 3926 閱讀 1485

本文主要介紹如何在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報文傳送給同乙個網路的所有主機,但是由於不是所有的主機都需要這些報文,因而浪費了網路資源。在這種情...