C++ TShark接收的UDP多播数据包,但不是C/C++;应用程序

C++ TShark接收的UDP多播数据包,但不是C/C++;应用程序,c++,c,linux,sockets,multicast,C++,C,Linux,Sockets,Multicast,总结: TShark显示在特定接口上接收到的多播数据包,但当我连接到该接口的inet/本地IP地址(带有多播地址和端口)时,我不会接收到它们 运行tshark显示正在接收的多播数据: 230159 27.010051471 206.1.2.3 -> 233.1.2.3 UDP 121 Source port: 5000 Destination port: 6000 ifconfig显示interface\u name的inet地址: inet 172.1.2.3 我设置了多播地址、端口

总结:

TShark显示在特定接口上接收到的多播数据包,但当我连接到该接口的inet/本地IP地址(带有多播地址和端口)时,我不会接收到它们

运行
tshark
显示正在接收的多播数据:

230159 27.010051471 206.1.2.3 -> 233.1.2.3 UDP 121 Source port: 5000 Destination port: 6000
ifconfig
显示
interface\u name
的inet地址:

inet 172.1.2.3
我设置了多播地址、端口和本地接口地址,但代码只是阻塞了
recvfrom()

我在网上看了三个不同的例子,都试过了,我遇到了同样的问题

从Linux方面看,我们的界面是绑定的(不是这方面的专家,只知道它是绑定的界面)。这是否需要对C/C++进行不同的配置

守则:

    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock < 0) 
    {
        LOG("Error opening datagram socket");
    }

    int reuse=1;
    if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) < 0) 
    {
        close(sock);
        LOG("Error setting SO_REUSEADDR");
    }

    struct sockaddr_in localSock;
    memset((char *) &localSock, 0, sizeof(localSock));
    localSock.sin_family = AF_INET;
    localSock.sin_port = htons(6000);
    localSock.sin_addr.s_addr  = INADDR_ANY;

    if (bind(sock, (struct sockaddr*)&localSock, sizeof(localSock))) 
    {
        close(sock);
        LOG("Error binding datagram socket");
    }

    struct ip_mreq group;
    group.imr_multiaddr.s_addr = inet_addr("233.1.2.3");  // Multicast group address
    group.imr_interface.s_addr = inet_addr("172.1.2.3");  // interface local IP

    if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)) < 0) 
    {
        close(sock);
        LOG("Error adding multicast group");
    }

    LOG("Listening... ");

    while (1) 
    {
        socklen_t addrlen = sizeof(localSock);

        // The -1 is because a '\0' will be written at the end too
        const size_t maxNumBytesToRead = MSGBUFSIZE - 1;
        const int nbytes = recvfrom(sock, msgbuf, maxNumBytesToRead, 0, (struct sockaddr *) &localSock, &addrlen);
        assert(nbytes > 0);

        const HEADER header = *reinterpret_cast<const HEADER*>(&msgbuf[0]);
        const uint64_t seqNum = header.getSeqNum();

        LOG("Received seqNum: " << seqNum);
    }
intsock=socket(AF_INET,sock_DGRAM,0);
if(sock<0)
{
日志(“打开数据报套接字时出错”);
}
int=1;
if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)和reuse,sizeof(reuse))<0)
{
关闭(袜子);
日志(“错误设置SO_REUSEADDR”);
}
localSock中的结构sockaddr_;
memset((char*)&localSock,0,sizeof(localSock));
localSock.sin_family=AF_INET;
localSock.sin_port=htons(6000);
localSock.sin\u addr.s\u addr=INADDR\u ANY;
if(绑定(sock,(struct sockaddr*)和localSock,sizeof(localSock)))
{
关闭(袜子);
日志(“绑定数据报套接字时出错”);
}
结构ip_mreq组;
group.imr_multiaddr.s_addr=inet_addr(“233.1.2.3”);//多播组地址
group.imr_interface.s_addr=inet_addr(“172.1.2.3”);//接口本地IP
if(setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)和group,sizeof(group))<0)
{
关闭(袜子);
日志(“添加多播组时出错”);
}
日志(“倾听…”);
而(1)
{
socklen\u t addrlen=sizeof(localSock);
//-1是因为结尾也将写入“\0”
常量大小\u t maxNumBytesToRead=MSGBUFSIZE-1;
const int nbytes=recvfrom(sock、msgbuf、maxNumBytesToRead、0、(struct sockaddr*)、localSock和addrlen);
断言(n字节>0);
const HEADER=*重新解释强制转换(&msgbuf[0]);
const uint64_t seqNum=header.getSeqNum();

日志(“Received seqNum:”评论不用于扩展讨论;此对话已被删除。