ticle/details/52550514
參考博文:
解決接收不到組播包的問題 - justlinux2010的專欄 - 部落格頻道 - csdn.net
1、問題描述
實現在多網絡卡裝置上傳送組播訊息,實現裝置搜尋,並接收通過組播返回的搜尋資訊。
裝置為多網絡卡nvr,有乙個常規網絡卡和乙個pppoe口;在進行傳送組播搜尋ipc時,只可以在常規網絡卡上接收到反饋的組播資訊,而在ppoe上沒有
2、問題原因及解決方法
關鍵**(組播socket的初始化):
3、綜述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;
}
在多網絡卡裝置上實現組播需要特別注意: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 增加網段路...