红联Linux门户
Linux帮助

在linux平台上发送一个以太网数据帧

发布时间:2011-10-17 09:46:33来源:红联作者:whx508
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define IFALIASZ 256
typedef char INT8;

#define VSTRONG_PROTOCOL 0x0807
#define DEBUGMSG(cond,printf_exp)
int main(int argc, char **argv) {
int i,send_flag=0;
struct sockaddr_ll stTagAddr;
char szBuff[68];
memset(&stTagAddr, 0 , sizeof(stTagAddr));
stTagAddr.sll_family = PF_PACKET;//填写AF_PACKET,不再经协议层处理
stTagAddr.sll_protocol = htons(VSTRONG_PROTOCOL);
int ret;
int ERR;
struct ifreq req;
int sd;
sd = socket(AF_PACKET,SOCK_RAW,htons(ETH_P_IP));//这个sd就是用来获取eth0的index,完了就关闭 d = socket(PF_INET,SOCK_DGRAM,0) AF_INET,SOCK_DGRAM,0 SOCK_PACKET
strncpy(req.ifr_name,"eth0",4);//通过设备名称获取index
ret=ioctl(sd,SIOCGIFFLAGS,&req);

//close(sd);
if (ret==-1)
{
DEBUGMSG(1,("Level:%d [Searcher main]Get eth0 index err \n", ERR));
}
stTagAddr.sll_ifindex = req.ifr_ifindex;//网卡eth0的index,非常重要,系统把数据往哪张网卡上发,就靠这个标识
stTagAddr.sll_pkttype = PACKET_OUTGOING;//标识包的类型为发出去的包
stTagAddr.sll_halen = 6; //目标MAC地址长度为6

//填写目标MAC地址
stTagAddr.sll_addr[0] = 0xff;
stTagAddr.sll_addr[1] = 0xff;
stTagAddr.sll_addr[2] = 0xff;
stTagAddr.sll_addr[3] = 0xff;
stTagAddr.sll_addr[4] = 0xff;
stTagAddr.sll_addr[5] = 0xff;

//填充帧头和内容

memset(szBuff, 1, 68);

for (i=0;i<68;i++)
printf("%d\n",szBuff[i]);
send_flag=sendto(sd, (INT8 *)szBuff, sizeof(szBuff), 0, (const struct sockaddr *)&stTagAddr, sizeof(stTagAddr));
}
这个是我改得程序,send_flag返回-1
文章评论

共有 2 条评论

  1. 于 2014-05-26 14:42:28发表:

    LZ很棒啊!至少写出了完整的程序。给我不少帮助啊。我sendto也没成功。
    填充帧头和内容那里会影响结果吗?

  2. 于 2013-12-07 16:56:09发表:

    文章最后一句话表明----LZSB!