#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
于 2014-05-26 14:42:28发表:
LZ很棒啊!至少写出了完整的程序。给我不少帮助啊。我sendto也没成功。
填充帧头和内容那里会影响结果吗?
于 2013-12-07 16:56:09发表:
文章最后一句话表明----LZSB!