windows环境下如何进行raw socket编程抓取MAC封装的数据包?(已有linux下的程序)

人见人厌 2012-11-04 09:14:05
如题,linux环境下的代码我已经有啦,但是也不知怎么改动使其能够在windows环境下工作(主要是包含的头文件不知怎么样改动),有高手帮忙么? linux环境下的代码如下:
#include<sys/socket.h>
#include<sys/ioctl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<linux/if_ether.h>
#include<linux/if_packet.h>
#include<linux/if.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<netinet/in.h>
#include<netdb.h>
#include<linux/errno.h>
void showpacket(unsigned char* buffer);

int main (int argc,char *argv[])
{
int rawsock;
int ret;
int sd;
int Len,recv_len,socklen,bcount;

int i,j;
int k=0;
FILE *fd;
extern int errno;
struct ifreq req;
struct sockaddr_ll addr;
struct sockaddr_ll in_addr;
unsigned char buffer[2048] = {0};
unsigned char buff[2000] ={0};
unsigned char buffbmp[76800] ={0};
unsigned char buffrec2[64][1200] ={0};
bzero(buffbmp,sizeof(buffbmp));

char path[]="/home/jiaojiao/jiaodi.txt";
char s[]="hello,jiaodi";
socklen=sizeof(struct sockaddr_ll);

rawsock=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
if((rawsock=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL)))<0)
{
printf("error:create raw socket!!!\n");
exit(0);
}
memset(&addr, 0 , sizeof(addr));
addr.sll_family = AF_PACKET;//填写AF_PACKET,不再经协议层处理
addr.sll_protocol = htons(ETH_P_ALL);

strcpy(req.ifr_name,"eth1");//通过设备名称获取index
ret=ioctl(rawsock,SIOCGIFINDEX,&req);
printf("ret=%d\n",ret);

addr.sll_ifindex = req.ifr_ifindex;//网卡eth0的index,非常重要,系统把数据往哪张网卡上发,就靠这个标识
addr.sll_pkttype = PACKET_OUTGOING;//标识包的类型为发出去的包
addr.sll_halen = 6; //目标MAC地址长度为6
addr.sll_addr[0] = 0x6c;
addr.sll_addr[1] = 0xf0;
addr.sll_addr[2] = 0x49;
addr.sll_addr[3] = 0x78;
addr.sll_addr[4] = 0x55;
addr.sll_addr[5] = 0x22;

//组装数据
/*for( i=0;i<64;i++)
{
buffer[0]=0x6c;
buffer[1]=0xf0;
buffer[2]=0x49;
buffer[3]=0x78;
buffer[4]=0x55;
buffer[5]=0x22; //目的MAC

buffer[6]=0x00;
buffer[7]=0xb0;
buffer[8]=0xc4;
buffer[9]=0x01;
buffer[10]=0x9b;
buffer[11]=0xe5; //源MAC
buffer[12]=0x04;
buffer[13]=0xb2; //数据长度
buffer[14]=0x00;
buffer[15]=0x00;
for(j=16;j<1216;j++)
{
buffer[j]=j%256;
}
Len = sendto(rawsock, buffer,1216, 0, (const struct sockaddr *)&addr, sizeof(addr));
//注意 此处的发送缓冲区长度不能与接收缓冲区长度一样,否则报错发送字节太长,应 设为发送字节的长度
memset(buffer, 0 , sizeof(buffer));
}
//显示发送数据
printf("Len=%d\n",Len);
perror("sendto");
*/
while(k<64)
{
bzero(buff,sizeof(buff));

recv_len =recvfrom(rawsock, buff,sizeof(buff), 0, (struct sockaddr*)&addr,&socklen);
if(recv_len==-1) continue ;
if(buff[1]==0xb0)
{
printf("%d:\n",k);
printf("recv_len=%d\n",recv_len);
memcpy(buffrec2[k],buff+16,1200);
k++;
}
}
//生成bmp文件
unsigned char header[54]={0};
bzero(header,sizeof(header));
const char *file;
const char *wfile;
FILE *pFile = 0; /**< 文件指针 */
FILE *wpFile = 0;
/** 打开文件,并检查错误 */
pFile = fopen("bmphead", "rb");
if(pFile == 0)
return -1;
/** 读入位图文件头信息 */

fread(header,54,1,pFile);
wpFile = fopen("bmpoutput.bmp", "wb");
if(wpFile == 0)
return -1;

fwrite(header,54,1,wpFile);
int kk=0;
for(kk=0;kk<64;kk++)
fwrite(buffrec2[k], 1200, 1, wpFile);
fclose(wpFile);
fclose(pFile); /**< 关闭文件 */
}
...全文
696 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Geoff08Zhang 2012-11-06
  • 打赏
  • 举报
回复
用WinCap可以抓到MAC层的数据,在网上搜一下,有实现的例子.
人见人厌 2012-11-05
  • 打赏
  • 举报
回复
引用 1 楼 Geoff08Zhang 的回复:
Windows上没法用socket抓MAC层的数据,只能用raw socket抓到IP层及之上的数据.如果你想参考raw socket的代码,这里有Ping, Traceroute用raw socket的: http://download.csdn.net/detail/geoff08zhang/4571358
啊啊 怎么能这样呀 导师给我的任务 让我今天就完成的 也就是windows下永远不可能实现?
zjcqoo 2012-11-05
  • 打赏
  • 举报
回复
不难。已经封装的很完善。和socket用法差不多。仔细看下文档两三天差不多可以了。
人见人厌 2012-11-05
  • 打赏
  • 举报
回复
引用 3 楼 zjcqoo 的回复:
想简单就用winpcap。复杂点用ddk里的ndisprot驱动模版稍微改下就行。
winpcap难不难呢 我对这个什么都不懂呀 编好一个接收FPGA发出的MAC封装的数据的程序的话 一个星期够不够呢?
zjcqoo 2012-11-05
  • 打赏
  • 举报
回复
想简单就用winpcap。复杂点用ddk里的ndisprot驱动模版稍微改下就行。
Geoff08Zhang 2012-11-04
  • 打赏
  • 举报
回复
Windows上没法用socket抓MAC层的数据,只能用raw socket抓到IP层及之上的数据.如果你想参考raw socket的代码,这里有Ping, Traceroute用raw socket的: http://download.csdn.net/detail/geoff08zhang/4571358

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧