Linux消息。 Sendto()udp,只有recvfrom()raw

时间:2015-02-18 08:49:12

标签: sockets embedded-linux

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

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);

我们错过了什么吗?你能帮助我们吗? 在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

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

您需要在发件人部分初始化套接字,如下所示:

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