【发布时间】:2015-06-16 21:28:45
【问题描述】:
我有一个绑定到 eth2 的原始套接字。
#define DEVICE_NAME "eth2"
// open a socket
int Socket = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (Socket < 0)
{
perror("socket() error");
return -1;
}
// create a interface request structure
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
// set the interface name
strncpy(ifr.ifr_name, DEVICE_NAME, IFNAMSIZ);
// get interface index
ioctl(Socket, SIOCGIFINDEX, &ifr);
int Socket_Index = ifr.ifr_ifindex;
// bind the socket to the interface
struct sockaddr_ll Socket_Addr;
Socket_Addr.sll_family = AF_PACKET;
Socket_Addr.sll_protocol = htons(ETH_P_ALL);
Socket_Addr.sll_ifindex = Socket_Index;
bind(Socket, (struct sockaddr *)&Socket_Addr, sizeof(Socket_Addr));
// add multicast addresses to the socket, based on Unit Number
struct packet_mreq mreq;
mreq.mr_ifindex = Socket_Index;
mreq.mr_type = PACKET_MR_MULTICAST;
mreq.mr_alen = ETH_ALEN;
memcpy(mreq.mr_address, Addresses[UNITS_1_2], ETH_ALEN);
setsockopt(Socket, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
memcpy(mreq.mr_address, Addresses[UNIT_3], ETH_ALEN);
setsockopt(Socket, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
Addresses[UNITS_1_2] 解析为 03:00:00:01:04:00,Addresses[UNIT_3] 解析为 02:00:00:01:04:01。
套接字只接收多播数据包,而不接收单播数据包。在调试时,我启动了 tcpdump,然后低调地进入混杂模式就成功了。
我的问题是:我可以在没有混杂模式的情况下在同一个原始套接字上同时接收多播和单播数据包吗?我尝试使用 maddr 将 02:00:00:01:04:01 添加到 eth0s mac 地址,但没有成功。
【问题讨论】:
-
你可以尝试添加 sll_pkttype = PACKET_HOST | PACKET_MULTICAST。我不完全确定这是否可行,但很有可能它应该。
-
终于有机会尝试一下...这解决了我的问题(让我看到两种类型)。我希望这是一个“答案”,所以我可以选择它作为正确的答案...谢谢!
-
嗯 - 我不确定 - 所以我没有把它作为答案! 'man 7 packet' 也提供了非常丰富的信息。
标签: sockets multicast ethernet raw-sockets