Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 原始套接字多播_Sockets_Multicast_Ethernet_Raw Sockets - Fatal编程技术网

Sockets 原始套接字多播

Sockets 原始套接字多播,sockets,multicast,ethernet,raw-sockets,Sockets,Multicast,Ethernet,Raw Sockets,我有一个绑定到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;

我有一个绑定到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));
#定义设备名称“eth2”
//打开插座
int Socket=Socket(PF_数据包、SOCK_原始、htons(ETH_P_全部));
如果(插座<0)
{
perror(“套接字()错误”);
返回-1;
}
//创建接口请求结构
结构ifreq-ifr;
memset(&ifr,0,sizeof(ifr));
//设置接口名称
strncpy(ifr.ifr\U名称、设备名称、IFNAMSIZ);
//获取接口索引
ioctl(插座、SIOCGIFINDEX和ifr);
int Socket_Index=ifr.ifr_ifindex;
//将套接字绑定到接口
结构sockaddr\u ll Socket\u Addr;
Socket\u Addr.sll\u family=AF\u数据包;
Socket\u Addr.sll\u协议=htons(ETH\u P\u ALL);
Socket_Addr.sll_iIndex=Socket_索引;
绑定(Socket,(struct sockaddr*)和Socket_Addr,sizeof(Socket_Addr));
//根据单元号向套接字添加多播地址
结构包_mreqmreq;
mreq.mr_iIndex=插座指数;
mreq.mr\u type=数据包\u mr\u多播;
mreq.mr_alen=ETH_alen;
memcpy(mreq.mr_地址,地址[单位1_2],以太伦);
setsockopt(套接字、SOL_数据包、数据包添加_成员资格和mreq、sizeof(mreq));
memcpy(mreq.mr_地址,地址[UNIT_3],ETH_ALEN);
setsockopt(套接字、SOL_数据包、数据包添加_成员资格和mreq、sizeof(mreq));
其中地址[UNITS_1_2]解析为03:00:00:01:04:00,地址[UNIT_3]解析为02:00:00:01:04:01

套接字只接收多播数据包,而不是单播数据包。在调试过程中,我启动了tcpdump和low,然后进入了混杂模式


我的问题是:我可以在同一个原始套接字上接收多播和单播数据包而不使用混杂模式吗?我已尝试使用maddr将02:00:00:01:04:01添加到eth0s mac地址,但没有成功。

从Gabijit偷袭:尝试添加

Socket_Addr.sll_pkttype = PACKET_HOST | PACKET_MULTICAST;

您可以尝试添加sll_pkttype=PACKET_HOST | PACKET_多播吗。我不完全确定这是否有效,但很有可能它应该有效。终于有机会尝试一下。。。这解决了我的问题(允许我同时看到这两种类型)。我希望这是一个“答案”,这样我就可以选择它作为正确的答案。。。非常感谢。嗯,我不确定,所以我没有回答!此外,“Man7数据包”的信息量也非常丰富。到目前为止,我的解决方案是进入混乱模式。我想这可能就是我一直在寻找的。我要试试这个。非常感谢。