簡體   English   中英

如何正確接收組播UDP報文?

[英]How to receive multicast UDP packets correctly?

我是多播網絡的新手,我需要通過Windows框上的NIC之一從多播通道接收UDP數據包,之后是Microsoft docs和一些博客條目,但仍然有問題。

我通過創建一個套接字

ls = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

呼叫。 然后將sockopt設置為SO_REUSEADDR

unsigned int reuse = 1;
if( setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) < 0 )
{
    LOG4CXX_ERROR(logger, "Reusing ADDR failed. Err: " << WSAGetLastError());
}

如果插座好

int result = bind(ls, reinterpret_cast<SOCKADDR*>(&server), sizeof(server));

哪里

server.sin_family      = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port        = htons(myport);

如果綁定成功

struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("e.f.g.h");
mreq.imr_interface.s_addr = htonl(INADDR_ANY);

if( setsockopt(ls, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char*)&mreq, sizeof(mreq)) < 0 )
{
    LOG4CXX_ERROR(logger, "setsockopt multicast group add membership failed. Err: " << WSAGetLastError());
}

我需要在其中接收數據包的盒子上有四個NIC,網絡管理員告訴我,我必須使用第三個,例如,它具有abcd IPv4地址

他們還告訴我,mcast IP是efgh

如果我在Windows框中運行windump.exe -i 3 ,我會看到類似的內容

... 12:53:58.454987 IP iklmxxxxx> efghmyport:UDP,長度58 ...

初始化UDP套接字后,我調用recvfrom

sz = recvfrom(ls, buffer, DATA_BLOCK_SIZE, 0, reinterpret_cast<SOCKADDR*>(&client), &size);

其中sz是一個int,ls是我的套接字,buffer是一個“合適的緩沖區”,DATA_BLOCK_SIZE是緩沖區大小,客戶端是一個SOCKADDR指針,用於接收來自發送者的信息,而size是接收到的消息大小。

我的代碼卡在recvfrom調用中,什么也沒收到。

我顯然在某處犯了一個錯誤,但不了解在哪里以及更糟的原因。

如果有人能解釋我的情況,將不勝感激。

解決了 ...

我只更改了這些行

struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("e.f.g.h");
mreq.imr_interface.s_addr = htonl(INADDR_ANY);

struct ip_mreq mreq;
inet_pton(AF_INET, "e.f.g.h", &(mreq.imr_multiaddr));
inet_pton(AF_INET, "a.b.c.d", &(mreq.imr_interface));

正如我猜到的那樣,我沒有在結構ip_mreq中正確指出這是用於多播消息的網絡接口。

這都是我的錯。 對不起,噪音。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM