红联linux Linux通用技术 - Linux发行版技术 - 企业应用 - 实验室  Linux论坛

您的位置: 红联linux >> Linux通用技术 >>

Linux编程与内核

>> 查看内容 -学Linux必读Linux学习教程推荐下载发新话题 (游客可发贴)

原始套接字 发送错误sendto: erron=0x29 value=13=0xd

newstyle发布于 2015-8-18 | 次阅读   字号:     (网友评论 0 条) 我要评论


使用原始套接字发送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");
}

 我要评论
发表评论,与各位同人交流。回复请点击下方的我要评论按钮(游客可回复),要发表贴子请点击 发新话题 (游客可发贴)
 关注热点

Linux教程下载?
Linux学习教程推荐下载”(请点击),Linux教程免费下载。

求助Linux问题?
论坛有39版块,覆盖所有Linux技术层面。前往“红联Linux论坛

 

Linux系统教程 | Linux入门 | Linux管理 | Linux技巧 | Linux命令 | Ubuntu系统 | Linux服务器 | Linux数据库 | Linux开发

合作 | 关于我们 | 联系我们 | 导航 | 会员注册

©2017 红联 Powered by SupSite