linux 在多網絡卡下的裝置的UDP 組播問題總結

2021-08-28 23:47:25 字數 2274 閱讀 5496

ticle/details/52550514

參考博文:

解決接收不到組播包的問題 - justlinux2010的專欄 - 部落格頻道 - csdn.net

1、問題描述

實現在多網絡卡裝置上傳送組播訊息,實現裝置搜尋,並接收通過組播返回的搜尋資訊。

裝置為多網絡卡nvr,有乙個常規網絡卡和乙個pppoe口;在進行傳送組播搜尋ipc時,只可以在常規網絡卡上接收到反饋的組播資訊,而在ppoe上沒有

2、問題原因及解決方法

關鍵**(組播socket的初始化):

int createmuticastsocket(const std::string ðx, int port)

/*test ip*/

struct sockaddr_in localaddr = ;

localaddr.sin_family = af_inet;

localaddr.sin_port = htons(port);

localaddr.sin_addr.s_addr = htonl(inaddr_any);

ret = bind(sockfd,(struct sockaddr*)&localaddr,sizeof(struct sockaddr));

if(-1 == ret)

int reuse = 1;

if(setsockopt(sockfd, sol_socket, so_reuseaddr, (char *)&reuse, sizeof(reuse)) < 0)

/*設定是否支援本地回環接收*/

int loopback=1;

ret = setsockopt(sockfd,ipproto_ip, ip_multicast_loop, &loopback, sizeof(loopback));

if(-1 == ret)

/*將本地socket新增到多播組中,注意,此處針對struct ip_mreq結構體需要填充兩個成員,

成員ipmr.imr_inte***ce.s_addr的值指定的是將要傳送的網絡卡的ip位址,

成員impr.imr_multiaddr指定的是組播位址;

如果指定為inaddr_any則系統會繫結乙個預設網絡卡的具體ip(根據預設閘道器選擇),則會出現特定網絡卡可以傳送和接收組播資訊,另一網絡卡不可以。即指定inaddr_any並不能把所有網絡卡都新增多播組中,必須明確指定對應網絡卡ip才可以。*/

struct in_addr addr = ;

addr.s_addr=inet_addr(get_local_ip(ethx).c_str());

struct ip_mreq ipmr;

ipmr.imr_inte***ce.s_addr = addr.s_addr;

ipmr.imr_multiaddr.s_addr = inet_addr(const_multicast_ip_v4);

ret=setsockopt(sockfd,ipproto_ip,ip_add_membership,(const char*)&ipmr,sizeof(ipmr));

/*此處指定組播資料的出口網絡卡,如果不設定則會根據路由表指定預設路由出口*/

if(-1 == setsockopt(sockfd, ipproto_ip, ip_multicast_if, (char *)&addr, sizeof(addr)))

struct timeval tv;

tv.tv_sec = 2;

tv.tv_usec = 0;

ret = setsockopt(sockfd,sol_socket,so_rcvtimeo,(char*)&tv,sizeof(tv));

if(-1 == ret)

return sockfd;

}

3、綜述

在多網絡卡裝置上實現組播需要特別注意:

1、使用setsockopt設定ip_add_membership組播位址時,對應的本地位址必須被明確指定為要傳送組播資料報的網絡卡的ip位址,而不可以使用inaddr_any設定;如果使用inaddr_any,則系統會預設根據路由表繫結乙個明確的位址,則在接收組播資訊時,無法從傳送的網絡卡處接收到資料,傳送的網絡卡沒有被新增到組播組中。

2、必須使用setsockopt設定ip_multicast_if選項,從而修改預設的組播出口網絡卡。否則系統根據路由表傳送到預設閘道器。而不一定是指定的網絡卡。

3、在多網絡卡實現多播(如裝置搜尋)相關的功能時,可以針對多個網絡卡分別執行一次操作,同時可以區分裝置是從哪個網絡卡搜尋到的。

Linux下配置多網絡卡多閘道器

比較典型的一種場景 一台 linux 伺服器上有三個網口並接入三個不同運營商的網路,以實現不同運營商使用者訪問其對應的網路線路,來減少網路延時。伺服器及對應網路資訊如下 一台 ubuntu 16.04 server,這裡一共使用三塊網絡卡。假定網路資訊如下 這裡 ip 只是為了區分各運營商線路做的示...

Linux下獲取多網絡卡資訊

支援多網絡卡,主要是使用ioctl函式系統呼叫實現,通過指定裝置名實現指定功能.之前使用socket 函式,獲取檔案描述符.在此基礎可以很輕鬆的擴充套件,如獲取net mask,mac address等 include stdio.h include sys types.h include sys ...

linux下多網絡卡路由設定

在linux多網絡卡情況下,如不能正確設定路由將導致部分網路不通。一 檢視路由 使用命令 route 二 預設路由設定 1 刪除預設路由 route del default 2 增加預設路由 route add default gw ip 如 192.168.1.1 三 網段路由設定 1 增加網段路...