原始套接字:如何仅接收特定类型的数据包

时间:2012-05-28 17:45:00

标签: c sockets

我使用原始套接字设置了发送器和接收器程序。我希望接收器只接收从发送器发送的特定数据包。但是我收到了接口卡上的所有数据包。

我尝试将数据包类型(sll_pkttype)设置为PACKET_OTHERHOST。

int create_raw_socket(char *dev) 
{   
    struct sockaddr_ll sll;
    struct ifreq ifr;
    int fd, ifi, rb;

    bzero(&sll, sizeof(sll)); 
    bzero(&ifr, sizeof(ifr));

    fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

    assert(fd != -1);

    strncpy((char *)ifr.ifr_name, dev, IFNAMSIZ);
    ifi = ioctl(fd, SIOCGIFINDEX, &ifr);
    assert(ifi != -1);
    sll.sll_protocol = htons(ETH_P_ALL);
    sll.sll_family = PF_PACKET;
    sll.sll_pkttype = PACKET_OTHERHOST;
    sll.sll_ifindex = ifr.ifr_ifindex;
    rb = bind(fd, (struct sockaddr *)&sll,sizeof(sll));
    assert(rb != -1);

    return fd;
}

接收者:

int x= recvfrom(sock_fd,&mypacket,sizeof(struct packet),0,&addr,&fromlen);

    struct sockaddr_ll* temp;
    temp = (struct sockaddr_ll*)(&addr);

    printf("\n packet type is :%c \n " , temp->sll_pkttype);

我为最后一个printf语句获取了一些垃圾值。我正确地进行了吗?有人可以纠正我或建议更好的方法吗?

0 个答案:

没有答案