c语言 原始套接字编程,原始套接字编写Sniffer失败??

原始套接字编写Sniffer失败??

希望有过原始套接字编程经验的朋友帮忙看一下:

#include

#include

#include

#pragma comment (lib,"ws2_32.lib")

//#define SIO_RCVALL 0x98000001

#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)

void main()

{

SOCKET Sniffer;

int timeout=1000;//接收超时

struct sockaddr_in addr;

DWORD dwret=0;

WSADATA wsa;

int ret,i;

BOOL flag=TRUE;

char RecvBuf[6144];//6KB的接收缓冲区

if(WSAStartup(MAKEWORD(2,1),&wsa))

{

printf("套接字版本协商出错!\n");

return;

}

Sniffer=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);//创建原始套接字

if(INVALID_SOCKET ==Sniffer)

{

printf("创建套接字失败!\n");

return;

}

setsockopt(Sniffer, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)); //设置 IP 头操作选项

//设置套接字接收超时

if(SOCKET_ERROR ==setsockopt(Sniffer,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout)))

{

printf("设置套接字超时失败!\n");

closesocket(Sniffer);

WSACleanup();

return;

}

memset(&addr,0,sizeof(addr));

addr.sin_family=AF_INET;

//设置本地地址

addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

//设置监听端口

addr.sin_port=htons(1234);

//绑定端口

if(SOCKET_ERROR==bind(Sniffer,(struct sockaddr *)&addr,sizeof(addr)))

{

printf("绑定本地端口失败!错误号:%d\n",WSAGetLastError());

closesocket(Sniffer);

WSACleanup();

return;

}

if(SOCKET_ERROR==ioctlsocket(Sniffer, SIO_RCVALL, (unsigned long*)&dwret))

{

printf("设置Socket I/O模式出错!\n");

closesocket(Sniffer);

WSACleanup();

return;

}

//循环接收数据

while(1)

{

ret=recv(Sniffer, RecvBuf,sizeof( RecvBuf),0);

if(SOCKET_ERROR==ret)

{

if(WSAETIMEDOUT==WSAGetLastError())continue;

printf("接收数据包出错!\n");

closesocket(Sniffer);

return;

}

i++;

printf("接收到数据包%d",i);

}

WSACleanup();

return;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值