我使用原始套接字设置了发送器和接收器程序。我希望接收器只接收从发送器发送的特定数据包。但是我收到了接口卡上的所有数据包。
我尝试将数据包类型(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语句获取了一些垃圾值。我正确地进行了吗?有人可以纠正我或建议更好的方法吗?