经过上一篇博客的总结,我知道到了原始套接字接收到的字符串的开始字段是IP数据报的首部,所以我想除了之前利用win_pcap可以捕获数据包以外,理论上来说原始套接字也可以实现对IP数据报的捕获。思路也很简单,捕获到字符串以后转换成指向IP首部结构体的指针,再打印相关信息就可以了。
当然由于网卡会默认丢掉不属于本机的数据包,所以需要将套接字设置为接收所有数据。win_pcap是直接对网卡进行设置。ioctlsocket( )函数用于控制套接字上的I/O行为,同时获取与那个套接字上挂起的网络I/O操作的有关信息。
int ioctlsocket(
SOCKET s,//套接字
long cmd,//对s的命令
u_long* argp//命令参数指针
)//如果成功的话返回0,如果失败的话返回错误代码
函数的示例(让socket接收所有数据包):
u_long flag=1;
ioctlsocket(s,SIO_RCVALL,&flag);
于是有了以下一段代码:
#include "stdafx.h"
#include <winsock2.h>
#include <ws2tcpip.h>
#include "mstcpip.h" //自定义
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
struct IPHEADER
{
unsigned char h_verlen; //4位首部长度,4位IP版本号
unsigned char tos; //8位服务类型TOS
unsigned short total_len; //16

本文介绍如何通过原始套接字在Windows上捕获流经本机的IP数据包。作者指出,由于网卡默认行为,需要调整套接字设置以接收所有数据,并对比了原始套接字与win_pcap在捕获数据包数量和信息准确性方面的差异,推测Windows可能对原始套接字的使用有限制。
838

被折叠的 条评论
为什么被折叠?



