资源简介
简单的路由程序,winpcap,vs2010,c++,没写界面。
改进:利用线程&arp缓存表
代码片段和文件信息
#include
#include
#include
#include
#include“标头.h“
#pragma comment (lib“ws2_32.lib“)
using namespace std;
#pragma pack(1)
typedef struct frameHeader_t//帧首部
{
BYTE DesMac[6];
BYTE SrcMac[6];
WORD frameType;
}frameHeader_t;
typedef struct IPHeader_t { //IP首部
BYTE Ver_HLen; //版本与协议类型
BYTE TOS; //服务类型
WORD TotalLen; //总长度
WORD ID; //标识
WORD Flag_Segment; //标志和片偏移
BYTE TTL; //生存周期
BYTE Protocol; //协议
WORD Checksum; //校验和
ULONG SrcIP; //源IP地址
ULONG DstIP; //目的IP地址
} IPHeader_t;
typedef struct IPData_t { //包含帧首部和IP首部的数据包
frameHeader_t frameHeader;
IPHeader_t IPHeader;
} IPData_t;
typedef struct ARPframe_t//ARP帧
{
frameHeader_t frameHeader;
WORD HardwareType;
WORD ProtocolType;
BYTE HLen;
BYTE PLen;
WORD Operation;
BYTE SendHa[6];
DWORD SendIP;
BYTE RecvHa[6];
DWORD RecvIP;
}ARPframe_t;
#pragma pack()
void print(ULONG IP);
bool ARPRequest(pcap_t *p UCHAR *srcMAC ULONG scrIP ULONG targetIP);
int main()
{
int number = 0;
bool flag = 0;//是否得到IPv4包,0为没有得到。
BYTE my_mac[6];
BYTE its_mac[6];
ULONG my_ip;
router_table * rt = new router_table[RT_TABLE_SIZE];
int rt_length = 0;//路由表的初始长度
pcap_if_t * alldevs;
pcap_if_t *d;
pcap_addr_t *a;
ULONG targetIP;
char errbuf[PCAP_ERRBUF_SIZE];
int num = 0;//记录有几个网络接口卡
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING
NULL
&alldevs
errbuf) == -1)
{
cout << “have errors“ << endl;
}
for (d = alldevs; d != NULL; d = d->next)
{
cout << “number“ << num + 1 << “:“ << endl;
cout << “NAME : “ << d->name << endl;//输出网络接口卡设备的名字
cout << “DEscriptION: “ << d->description << endl;//获取该网络接口卡设备的描述信息
num++;
for (a = d->addresses; a != NULL; a = a->next)
{
if (a->addr->sa_family == AF_INET)
{
cout << “IP地址:“;
print((((sockaddr_in *)a->addr)->sin_addr).s_addr);
cout << “子网掩码:“;
print((((sockaddr_in *)a->netmask)->sin_addr).s_addr);
cout << “广播地址:“;
print((((sockaddr_in *)a->broadaddr)->sin_addr).s_addr);
cout << endl;
// cout << “目的地址:“;
// print((((sockaddr_in *)a->dstaddr)->sin_addr).s_addr);
}
}
}
cout << “共有“ << num << “个网络接口卡“ << endl;
cout << “你想打开第几个网络接口卡?“ << endl;
int in;
cin >> in;
in--;
int i = 0;
for (d = alldevs; d != NULL&&i != in; d = d->next)
{
i++;
}
////////////////打印出来IP等///////
for (a = d->addresses; a != NULL; a = a->next)
{
if (a->addr->sa_family == AF_INET)
{
cout << “IP地址:“;
print((((sockaddr_in *)a->addr)->sin_addr).s_addr);
cout << “子网掩码:“;
print((((sockaddr_in *)a->netmask)->sin_addr).s_addr);
cout << “广播地址:“;
print((((sockaddr_in *)a->broadaddr)->sin_addr).s_addr);
cout << endl;
// cout << “目的地址:“;
// print((((sockaddr_in *)a->dstaddr)->sin_addr).s_addr);
ULONG NetMask DesNet NextHop;
DesNet = (((sockaddr_in *)a->addr)->sin_ad
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 1973 2014-09-16 08:49 标头.h
文件 16825 2014-09-16 08:52 源.cpp
----------- --------- ---------- ----- ----
18798 2
评论
共有 条评论