Linux message. Sendto() udp, only recvfrom() raw



我们制作了一个网络设备驱动程序(eth2)来通过spi总线发送消息。当我们收到消息时,问题就开始了。司机工作不错。我们知道消息的协议号是

htons(ETH_P_IPV6)

因为

skb->protocol=0x86dd

struct sk_buff *skb;
skb->protocol = eth_type_trans(skb, dev);

在设备1中,我们创建了一个套接字来发送消息:

sock = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
memset(&client, 0, sizeof(client)); 
client.sin6_family = AF_INET6;           
client.sin6_addr = in6addr_any;
client.sin6_port = htons(20000); 
client.sin6_scope_id=if_nametoindex("eth2");
memset(&from, 0, sizeof(from));  
from.sin6_family = AF_INET6;  
inet_pton(AF_INET6,"ff02::2",(void*)&from.sin6_addr.s6_addr);
from.sin6_port = htons(15118);
bind(sockEnvio,(struct sockaddr *)&client,sizeof(client));
sendto(sockEnvio, data, localIPLen, 0, (struct sockaddr *) &from, sizeof(from)) ;

在设备2中,我们创建了一个套接字来接收消息

sock = socket(AF_INET6, SOCK_DGRAM, htons(ETH_P_IPV6))) < 0)
memset(&client, 0, sizeof(client)); 
client.sin6_family = AF_INET6;           
client.sin6_addr = in6addr_any;
client.sin6_port = htons(20000); 
client.sin6_scope_id=if_nametoindex("eth2");
bind(sockEnvio,(struct sockaddr *)&client,sizeof(client));
recvfrom(sockEnvio,buffer, BUFFER_SIZE , 0 , (struct sockaddr *) &from , &from_size);

当我们将套接字类型更改为时,我们收到消息

socket(AF_PACKET , SOCK_RAW , htons(ETH_P_IPV6))) < 0);

我们遗漏了什么吗?你能帮我们吗?提前感谢您的帮助。

您似乎使用协议0发送,但使用协议htons(ETH__p_IPV6)接收。

在SOCK_RAW的情况下,无论ETH标头中的协议字段如何,您都可以从网络获取所有数据包。

您需要在发送方初始化套接字,如下所示:

sock = socket(AF_INET6, SOCK_DGRAM, htons(ETH_P_IPV6))) < 0)

最新更新