C++ &引用;“需要目的地地址”;尝试通过SOCK_原始套接字发送数据时

C++ &引用;“需要目的地地址”;尝试通过SOCK_原始套接字发送数据时,c++,sockets,network-programming,freebsd,C++,Sockets,Network Programming,Freebsd,我试图发送一个数据包(不是ip数据包,而是EAP请求标识),但send()函数返回-1 int sockfd = socket(AF_INET, SOCK_RAW, 0); printf("socket: %d\n", sockfd); struct sockaddr_in sock; printf("creating packet\n"); char packet[27]; memcpy(packet + 0, (u_char* ) ethernet->ether_dhost,

我试图发送一个数据包(不是ip数据包,而是EAP请求标识),但send()函数返回-1

    int sockfd = socket(AF_INET, SOCK_RAW, 0);
printf("socket: %d\n", sockfd);
struct sockaddr_in sock;
printf("creating packet\n");
char packet[27];
memcpy(packet + 0, (u_char* ) ethernet->ether_dhost, 6);
memcpy(packet + 6, (u_char* ) ethernet->ether_shost, 6);
memcpy(packet + 12, (u_char* ) ethernet + 12, 2);
memcpy(packet + 14, (u_char *)reqid, 1);
memcpy(packet + 15, (u_char *)reqid+1, 1);
memcpy(packet + 16, (u_char *)reqid+2, 4);
memcpy(packet + 20, (u_char *)reqid+6, 1);
memcpy(packet + 21, (u_char *)reqid+7, 1);
memcpy(packet + 22, (u_char *)reqid+8, 4);
memcpy(packet + 26, (u_char *)reqid+12, 1);
printf("sending packet\n");
if(send(sockfd, packet, sizeof(packet), 0) == -1)
{
     printf("packet not sent\n");
     //return;
}
该数据包由一个以太网数据包和一个请求标识组成。 我知道包裹很好,每个值都在正确的位置。但是send()函数失败。
errno显示“需要目标地址”,sockfd值为4。 顺便说一下,这是免费的。
谢谢 编辑:我没有目标的IP地址。我只有它的MAC地址。

从手册页:

send()调用只能在套接字处于已连接状态时使用(以便知道预期的收件人)


我相信您希望
sendto
,而不是
send

当使用原始套接字时,您不需要指定以太网地址。原始套接字允许您创建IP数据报,您可以在其中仅发送有效负载,网络堆栈将配置IP头,或者如果启用了IP_HDRINCL套接字选项,您还可以指定IP头。这里不能指定以太网地址。阅读:

如果您没有IP地址,只有以太网地址,那么这是另一个需要以不同方式解决的问题

首先,您需要使用数据包套接字并向另一个节点发送以太网帧


问题是另一个节点将把该帧传递给上层(设备驱动程序将执行此操作)。在那里,如果上层没有看到它的IP地址,它将丢弃消息。因此,您可能希望发送RARP消息,并期望其他节点通过其IP地址响应您。另一种可能是您实现了自己的第2层协议…

在这些答案和进一步的阅读之后,我认为没有办法使用FreeBSD中的套接字来实现我的目的。
因此,现在我使用
libpcap
来实现这一点。使用
pcap\u sendPacket()
我可以用以太网地址发送数据包。

感谢您的帮助

什么是
错误
sockfd
有效吗?ISTR
SOCK_RAW
需要root@LightnessRacesinOrbit需要目标地址。@LightnessRacesinOrbit也是,是的,sockfd有效。它的值是4。我是root用户,好的。最好在问题中显示所有这些细节。但问题是
sendto
需要目标IP地址。我没有。我只有它的MAC地址。@ipinland:两者都有。唯一的区别是
send
从连接上下文中获取目的地,这里没有。您应该能够使用port=0和address=NULL,尽管您可能还需要创建带有标志
IP\u HDRINCL
的套接字,以便API不会预先设置自己的IP头。你用的是哪本指南?哦,或者你可以用目的地的MAC地址。我不能确切地用它,但它给了我一些想法。谢谢:)我看看还能找到什么。