Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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

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
原始插座-Ethertype和receive';s算法-C_C_Sockets_Network Programming_Raw Sockets - Fatal编程技术网

原始插座-Ethertype和receive';s算法-C

原始插座-Ethertype和receive';s算法-C,c,sockets,network-programming,raw-sockets,C,Sockets,Network Programming,Raw Sockets,我正在使用C语言中的原始套接字。 我需要发送和接收原始以太网数据包。 数据包应以IEEE 802.3报头开始: MAC DST[0-5]-MAC SRC[6-11]-ETH型[12-13] 使用wireshark捕获数据包我看到以下结构: MAC DST[0-5]-MAC SRC[6-11]-长度[12-13]-拖车[14-58]- 这是我的代码: ... sraw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_802_3)); ... retVal = s

我正在使用C语言中的原始套接字。 我需要发送和接收原始以太网数据包。 数据包应以IEEE 802.3报头开始:

MAC DST[0-5]-MAC SRC[6-11]-ETH型[12-13]

使用wireshark捕获数据包我看到以下结构:

MAC DST[0-5]-MAC SRC[6-11]-长度[12-13]-拖车[14-58]-

这是我的代码:

...
sraw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_802_3));
...
retVal = setsockopt(sraw, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr));
...
val = 3;
retVal = setsockopt(sraw, SOL_SOCKET, SO_PRIORITY, &val, sizeof (val));
...
memcpy(ptr_eth_header->DstMac, dst_mac, 6);
memcpy(ptr_eth_header->SrcMac, src_mac, 6);
ptr_eth_header->Type = htons(ETH_P_802_3);
memcpy(buffer + ETHHDR_SIZE, data, 60);
...
sockaddr.sll_family = htons(PF_PACKET);
sockaddr.sll_protocol = htons(ETH_P_802_3);
sockaddr.sll_ifindex = ifr.ifr_ifru.ifru_ivalue;
sockaddr.sll_halen = 6;
memcpy(&(sockaddr.sll_addr), dst_mac, 6);
...
bytes = sendto(sraw, buffer, sizeof(buffer), 0, (struct sockaddr *) &(sockaddr), sizeof (struct sockaddr_ll));
sraw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_802_3));
...
retVal = setsockopt(sraw, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr));
...
val = 3;
retVal = setsockopt(sraw, SOL_SOCKET, SO_PRIORITY, &val, sizeof (val));
...
val = CLIENT_PACKET_SIZE;
retVal = setsockopt(sraw, SOL_SOCKET, SO_RCVBUF, &val, sizeof (val));

sockaddr.sll_family    = htons(PF_PACKET);
sockaddr.sll_ifindex   = ifr.ifr_ifindex;
sockaddr.sll_protocol  = htons(ETH_P_802_3);

buffer = malloc(CLIENT_PACKET_SIZE * sizeof(char));
while (count < PACKET_COUNT) {
    bytes = recvfrom(sraw, buffer, CLIENT_PACKET_SIZE, 0, (struct sockaddr *)&sockaddr, (socklen_t*)sizeof(sockaddr));
    ...
}
这只是一个有线鲨鱼的“问题”吗?有什么想法吗

我的第二个问题是关于原始消息的接收。 进程卡在recvfrom上

这是我的代码:

...
sraw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_802_3));
...
retVal = setsockopt(sraw, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr));
...
val = 3;
retVal = setsockopt(sraw, SOL_SOCKET, SO_PRIORITY, &val, sizeof (val));
...
memcpy(ptr_eth_header->DstMac, dst_mac, 6);
memcpy(ptr_eth_header->SrcMac, src_mac, 6);
ptr_eth_header->Type = htons(ETH_P_802_3);
memcpy(buffer + ETHHDR_SIZE, data, 60);
...
sockaddr.sll_family = htons(PF_PACKET);
sockaddr.sll_protocol = htons(ETH_P_802_3);
sockaddr.sll_ifindex = ifr.ifr_ifru.ifru_ivalue;
sockaddr.sll_halen = 6;
memcpy(&(sockaddr.sll_addr), dst_mac, 6);
...
bytes = sendto(sraw, buffer, sizeof(buffer), 0, (struct sockaddr *) &(sockaddr), sizeof (struct sockaddr_ll));
sraw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_802_3));
...
retVal = setsockopt(sraw, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr));
...
val = 3;
retVal = setsockopt(sraw, SOL_SOCKET, SO_PRIORITY, &val, sizeof (val));
...
val = CLIENT_PACKET_SIZE;
retVal = setsockopt(sraw, SOL_SOCKET, SO_RCVBUF, &val, sizeof (val));

sockaddr.sll_family    = htons(PF_PACKET);
sockaddr.sll_ifindex   = ifr.ifr_ifindex;
sockaddr.sll_protocol  = htons(ETH_P_802_3);

buffer = malloc(CLIENT_PACKET_SIZE * sizeof(char));
while (count < PACKET_COUNT) {
    bytes = recvfrom(sraw, buffer, CLIENT_PACKET_SIZE, 0, (struct sockaddr *)&sockaddr, (socklen_t*)sizeof(sockaddr));
    ...
}
sraw=socket(PF_数据包,SOCK_原始,htons(ETH_P_802_3));
...
retVal=setsockopt(sraw,SOL_SOCKET,SO_BINDTODEVICE,(void*)和ifr,sizeof(ifr));
...
val=3;
retVal=setsockopt(sraw,SOL_SOCKET,SO_PRIORITY,&val,sizeof(val));
...
val=客户端\数据包\大小;
retVal=setsockopt(sraw、SOL_SOCKET、SO_RCVBUF和val、sizeof(val));
sockaddr.sll_系列=htons(PF_数据包);
sockaddr.sll_iIndex=ifr.ifr_iIndex;
sockaddr.sll_协议=htons(ETH_P_802_3);
buffer=malloc(客户端数据包大小*sizeof(字符));
while(计数<数据包计数){
bytes=recvfrom(sraw、缓冲区、客户端数据包大小、0、(结构sockaddr*)和sockaddr、(socklen_t*)sizeof(sockaddr));
...
}
你能帮我吗


提前谢谢

我找到了关于我的第一个问题的答案:我使用Ethertype==0x0001而不是Ethertype>=0x0600

第二个问题呢?
我的代码怎么了?

你的问题很难用一个词来回答。但是如果你问我为什么recvfrom会被代码卡住,我会说你可能没有得到任何满足过滤条件的数据包。确实要以预期格式传递ifindex值吗?我看到您通过了ifindex sockaddr.sll_ifindex=ifr.ifr_ifru.ifru\u ivalue;像仙都这样

其他原因可能是,内核不支持您在套接字上设置的缓冲区大小,或者内核正在耗尽缓冲区,以及其他许多原因。但发生上述任何一种情况的可能性都很小


另外,对于您的场景,我建议使用非阻塞套接字而不是阻塞。只有当您知道有数据包等待读取时,才调用recvfrom

你的页眉结构打包了吗?缓冲区的大小是多少?是的<代码>类型定义结构{char DstMac[6];char SrcMac[6];短整型;}头
sizeof(buffer)
为64。您是否能够独立于您的程序使用Wireshark验证NIC发送/接收数据包?是的。我经常使用wireshark。它无法识别(在本例中)数据包的正确格式,或者我发送了错误的类型。我用wireshark看到了正确的位序列。(ETH_P_802_3=0x0001)