[英]Sending and receiving multicast on the same Linux machine from different interfaces
[英]Not receiving multicast data using code which works on another machine
我們將多播數據接收到兩台機器——Prod 和 Dev。 下面的代碼在 Prod 上工作,但從未在 Dev 上工作過(即使這些框應該設置相同)。 但是,當我跑步時
tshark -i <interface> -c 50
正在從與 Prod 相同的多播地址和端口接收開發數據包。
我已經發布了下面的代碼。 該程序到達日志行“偵聽數據包”,但隨后似乎只是在recvfrom()
上阻塞。
我想澄清一下我沒有做任何愚蠢的事情。 還有什么我可以檢查的,看看數據包發生了什么? 我還不能與我們的供應商交談,因為他們只會運行 tshark 並說問題一定出在我們的代碼上。
std::string address("1.2.3.4"); // Not real address
const char *group = address.c_str();
int port = 26477;
_sock = socket(AF_INET, SOCK_DGRAM, 0);
assert(_sock >= 0);
u_int yes = 1;
int result = setsockopt(_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes));
assert(result >= 0);
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(port);
result = bind(_sock, (struct sockaddr *)&addr, sizeof(addr));
assert(result >= 0);
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(group);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
result = setsockopt(_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq));
assert(result >= 0);
LOG("Listening for packets...."); // CODE REACHES HERE
while (1)
{
socklen_t addrlen = sizeof(addr);
const size_t maxNumBytesToRead = MSGBUFSIZE - 1;
// I think code is just blocking here, waiting for packets
const int nbytes = recvfrom(_sock, msgbuf, maxNumBytesToRead, 0, (struct sockaddr *)&addr, &addrlen);
}
您指定INADDR_ANY
作為加入多播組的接口。 這意味着系統將選擇一個默認界面。 如果您的系統有多個活動界面,它可能不是您想要的。
這里可能發生的情況是您的 PROD 機器碰巧正在加入所需的接口,而 DEV 機器正在加入不同的接口。
更改mreq.imr_interface
以包含要綁定到的網絡接口的 IP 地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.