使用原始套接字发送arp报文,sendto返回-1,求大神解答
/* arp send */
int sock_raw_fd;
struct sockaddr_ll sll; // 原始套接字地址结构
struct ifreq ethreq; // 网络接口地址
char arpmsg[] =
{
// 物理帧头格式
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // dst mac
0x00, 0xa0, 0x1e, 0x58, 0x12, 0x15, // src mac
0x08, 0x06, // ARP帧的类型值
// ARP帧的格式
0x00, 0x01, // 硬件类型:以太网类型值
0x08, 0x00, // 协议类型:上层协议为IP协议
0x06, // 以太网MAC地址长度为 6
0x04, // IP地址长度为 4
0x00, 0x01, // 0x1表示ARP请求包,0x2表示应答包
0x00, 0xa0, 0x1e, 0x58, 0x12, 0x15, // 发送方MAC
192, 168, 6, 15, // 发送方IP
0x74, 0xd4, 0x35, 0xcc, 0xc6, 0x5e, // 接收方MAC
192, 168, 6, 233 // 接收方IP
};
int msg_len = 42;
int len = 0;
sock_raw_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
strncpy(ethreq.ifr_name, "dm0", IFNAMSIZ); // 指定网卡名称
if (-1 == ioctl(sock_raw_fd, SIOCGIFINDEX, ðreq))
{
perror("ioctl");
close(sock_raw_fd);
exit(-1);
}
// 将网络接口赋值给原始套接字地址结构
memset(&sll, 0, sizeof(sll));
sll.sll_ifindex = ethreq.ifr_ifindex;
// 发送数据
len = sendto(sock_raw_fd, arpmsg, msg_len, 0, (struct sockaddr *)&sll, sizeof(sll));
if (-1 == len)
{
perror("sendto");
}