vs2012 c语言 socket,VS2012 抓包代码

// capture.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include "iostream"

#include "winsock2.h"

#include "mstcpip.h"

#pragma comment(lib,"WS2_32")

using namespace std;

void DecodeIPPacket(char * pData);

void DecodeTCPPacket(char * pData);

void DecodeUDPPacket(char * pData);

void DecodeICMPPacket(char * pData);

/*IP分组首部结构*/

typedef struct _IPHeader

{

unsigned char iphVerLen;

unsigned char ipTOS;

unsigned short ipLength;

unsigned short ipID;

unsigned short ipFlags;

unsigned char ipTTL;

unsigned char ipProtocol;

unsigned short ipChecksum;

unsigned long ipSource;

unsigned long ipDestination;

}IPHeader, * PIPHeader;

/*ICMP包头结构*/

typedef struct icmphdr

{

char i_type;

char i_code;

unsigned short i_cksum;

unsigned short i_id;

unsigned short i_seq;

unsigned long timestamp;

}ICMPHeader;

/*UDP包头结构*/

typedef struct _UDPHeader

{

unsigned short sourcePort;

unsigned short destinationPort;

unsigned short len;

unsigned short checksum;

}UDPHeader;

/*TCP包头结构*/

typedef struct _TCPHeader

{

unsigned short sourcePort;

unsigned short destinationPort;

unsigned long sequenceNumber;

unsigned long acknowledgeNumber;

char dataoffset;

char flags;

unsigned short window;

unsigned short checksum;

unsigned short urgentPointer;

}TCPHeader;

int _tmain(int argc, _TCHAR* argv[])

{

WSADATA wsaData;

int ret;

if((ret=WSAStartup(MAKEWORD(2,2),&wsaData))!=0)

{

cout<

return -1;

}

/*创建原始套接字*/

SOCKET sRaw = socket(AF_INET,SOCK_RAW,IPPROTO_IP);

/*获取本地IP地址*/

char sHostName[256];

SOCKADDR_IN addr_in;

struct hostent * hptr;

gethostname(sHostName,sizeof(sHostName));

if((hptr = gethostbyname(sHostName)) == NULL)

{

cout<

WSACleanup();

return -1;

}

char **pptr = hptr->h_addr_list;

/*在屏幕上显示本机所有的IP地址*/

cout<

while(*pptr!=NULL)

{

cout<

pptr++;

}

/*输入想要要监听的接口的IP地址*/

cout<

char snfIP[20];

cin.getline(snfIP,sizeof(snfIP));

/*填写地址结构*/

addr_in.sin_family = AF_INET;

addr_in.sin_port = htons(0);

addr_in.sin_addr.S_un.S_addr = inet_addr(snfIP);

/*绑定网卡IP地址*/

if(bind(sRaw,(PSOCKADDR)&addr_in,sizeof(addr_in)) == SOCKET_ERROR)

{

cout<

closesocket(sRaw);

WSACleanup();

return -1;

}

//调用ioctlsocket将网卡设为混杂模式前,套接字必须绑定该网卡的IP地址

DWORD dwValue = 1;

if(ioctlsocket(sRaw,SIO_RCVALL,&dwValue)!=0)

{

cout<

closesocket(sRaw);

WSACleanup();

return -1;

}

//开始抓取IP分组

char buff[50][4096];

int packetNumber;

cout<

cin>>packetNumber;

cout<

int i,nRet;

for(i=0;i

{

if(i>=50)break;

nRet=recv(sRaw,buff[i],4096,0);

cout<

if(nRet<=0)

{

cout<

break;

}

}

//解析IP包

int j=0;

for(j=0;j

{

cout<

DecodeIPPacket(buff[j]);

}

closesocket(sRaw);

WSACleanup();

return 0;

}

/***IP分组解析函数****/

void DecodeIPPacket(char *pData)

{

IPHeader * pIPHdr =(IPHeader *) pData;

in_addr source,dest;

char szSourceIp[32],szDestIp[32];

/****从IP头中取出源IP地址和目的地址IP***/

source.S_un.S_addr = pIPHdr ->ipSource;

dest.S_un.S_addr = pIPHdr ->ipDestination;

strcpy_s(szSourceIp,inet_ntoa(source));

strcpy_s(szDestIp,inet_ntoa(dest));

cout<

cout<

int nHeaderLen = (pIPHdr-> iphVerLen &0xf) * sizeof(ULONG);

switch (pIPHdr -> ipProtocol)

{

case IPPROTO_TCP:

DecodeTCPPacket(pData + nHeaderLen);

break;

case IPPROTO_UDP:

DecodeUDPPacket(pData + nHeaderLen);

break;

case IPPROTO_ICMP:

DecodeUDPPacket(pData + nHeaderLen);

break;

defualt:

cout<ipProtocol;

}

}

/****TCP包解析函数***/

void DecodeTCPPacket(char * pData)

{

TCPHeader * pTCPHdr =(TCPHeader *) pData;

cout<sourcePort);

cout<destinationPort)<

}

/****UDP包解析函数***/

void DecodeUDPPacket(char * pData)

{

UDPHeader * pUDPHdr =(UDPHeader *) pData;

cout<sourcePort);

cout<destinationPort)<

}

/****ICMP包解析函数***/

void DecodeICMPPacket(char * pData)

{

ICMPHeader * pICMPHdr =(ICMPHeader *) pData;

cout<i_type<i_code<

switch(pICMPHdr -> i_type)

{

case 0:

cout<

case 8:

cout<

case 3:

cout<

case 11:

cout<

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,抓包程序一般是指网络抓包程序,可以通过C语言中的套接字编程实现。以下是一个简单的示例程序,可以抓取网络数据包并将其分析: ```c #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <arpa/inet.h> // 定义回调函数,用于处理抓包结果 void packet_handler(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) { struct iphdr *ip_header = (struct iphdr *)(packet + sizeof(struct ethhdr)); printf("Received a packet with source IP address: %s\n", inet_ntoa(*(struct in_addr *)&ip_header->saddr)); } int main() { char errbuf[PCAP_ERRBUF_SIZE]; pcap_t *handle; struct bpf_program fp; char filter_exp[] = "ip"; bpf_u_int32 mask; bpf_u_int32 net; // 打开网络设备,准备开始抓包 handle = pcap_open_live("eth0", BUFSIZ, 1, 1000, errbuf); if (handle == NULL) { fprintf(stdout, "Couldn't open device: %s\n", errbuf); return 1; } // 获取网络设备的 netmask if (pcap_lookupnet("eth0", &net, &mask, errbuf) == -1) { fprintf(stdout, "Couldn't get netmask for device %s: %s\n", "eth0", errbuf); net = 0; mask = 0; } // 编译BPF过滤器 if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) { fprintf(stdout, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle)); return 1; } // 应用BPF过滤器 if (pcap_setfilter(handle, &fp) == -1) { fprintf(stdout, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle)); return 1; } // 开始抓包 pcap_loop(handle, -1, packet_handler, NULL); // 关闭网络设备 pcap_close(handle); return 0; } ``` 这段代码使用了 libpcap 库来实现网络抓包功能。在此之前,需要先确保系统已经安装了该库。 程序中的 packet_handler 函数用于处理捕获到的数据包,其中第一个参数是用户自定义的参数,在此处为NULL。第二个参数为 pcap_pkthdr 结构体,包含了收到这个数据包的时间戳和数据包的长度等信息。第三个参数是指向实际数据包的指针。 在本例中,我们只是简单地从IP报文中提取出源IP地址,并打印出来。实际应用中,可以根据具体需求对数据包进行更加复杂的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值