为什么tcpdump启用此代码?

时间:2013-02-16 16:01:19

标签: linux multicast tcpdump

我有一个由2个主机(OS X和Linux)组成的小型网络,它们之间有切换。当我运行以下程序对时,接收器(linux)看不到任何多播数据包。但是,当我跑

  

tcpdump -i eth0 -s 512 udp

在Linux机器上,一切都开始工作了。有人能告诉我为什么运行tcpdump使这个工作?

请注意,两台计算机都启用了IPv6(如果这很重要)。代码中的主机地址是本地接口的IPv4地址。

在OS X机器上,我运行:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define BUFLEN  256

int                     s;
int                     count;
struct in_addr          local_address;
struct sockaddr_in      multicast_address;
char                    buffer[BUFLEN];

int
main (int argc, char *argv[]) {
        int             port = 12345;
        int             retval = 0;
        char            *host_ip = "192.168.1.31";
        char            *multicast_ip = "224.0.0.251";

        count = (int)time(NULL);


        s = socket(AF_INET, SOCK_DGRAM, 0);
        printf("s=%d\n", s);


        local_address.s_addr = inet_addr(host_ip);
        retval = setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, (char *)&local_address, sizeof(local_address));
        printf("setsockopt=%d\n", retval);


        memset((char *)&multicast_address, 0, sizeof(multicast_address));
        multicast_address.sin_family = AF_INET;
        multicast_address.sin_addr.s_addr = inet_addr(multicast_ip);
        multicast_address.sin_port = htons(port);


        while (1) {
                sprintf(buffer, "Message number %d", count);
                count++;

                retval = sendto(s, buffer, BUFLEN, 0, (struct sockaddr*)&multicast_address, sizeof(multicast_address));
                printf("sendto=%d\n", retval);
                sleep(3);
        }

        return 0;
}

在linux框中,我运行:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define BUFLEN          256

int                     s;
struct ip_mreq          multicast_group;
struct sockaddr_in      localSock;
char                    buffer[BUFLEN];

int
main(int argc, char *argv[]) {
        int             reuse = 1;
        int             retval = 0;
        int             port = 12345;
        char            *host_ip = "192.168.1.131";
        char            *multicast_ip = "224.0.0.251";

        s = socket(AF_INET, SOCK_DGRAM, 0);
        printf("s = %d\n", s);


        setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse));
        printf("REUSEADDR = %d\n", retval);


        memset((char *) &localSock, 0, sizeof(localSock));
        localSock.sin_family = AF_INET;
        localSock.sin_port = htons(port);
        localSock.sin_addr.s_addr = INADDR_ANY;
        retval = bind(s, (struct sockaddr*)&localSock, sizeof(localSock));
        printf("bind = %d\n", retval);


        multicast_group.imr_multiaddr.s_addr = inet_addr(multicast_ip);
        multicast_group.imr_interface.s_addr = inet_addr(host_ip);
        retval = setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&multicast_group, sizeof(multicast_group));
        printf("ADD_MEMBERSHIP = %d\n", retval);


        while (1) {
                retval = read(s, buffer, BUFLEN);
                printf("%d => [%s]\n", retval, buffer);
        }

        return 0;
}

感谢。

0 个答案:

没有答案