「已注销」 2018-05-15 14:45 采纳率: 0%
浏览 1899
已结题

原始套接字捕获数据包

#include "stdafx.h"
#include "pcap.h"
#include"remote-ext.h"

typedef struct ip_address {
u_char byte1;
u_char byte2;
u_char byte3;
u_char byte4;
}ip_address;

typedef struct ip_header {
u_char ver_ihl;
u_char tos;
u_short tlen;
u_short identification;
u_short flags_fo;
u_char ttl;
u_char proto;
u_short crc;
ip_address saddr;
ip_address daddr;
u_int op_pad;
}ip_header;

typedef struct udp_header {
u_short sport;
u_short dport;
u_short len;
u_short crc;
}udp_header;

/* packet handler 函数原型 */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
struct tm *ltime;
char timestr[16];
ip_header *ih;
udp_header *uh;
u_int ip_len;
u_short sport, dport;
time_t local_tv_sec;

local_tv_sec = header->ts.tv_sec;
ltime = localtime(&local_tv_sec);
strftime(timestr, sizeof timestr, "H:%M:%S", ltime);
printf("%s.%.6d len:%d", timestr, header->ts.tv_usec, header->len);
ih = (ip_header *)(pkt_data + 14);
ip_len = (ih->ver_ihl & 0xf) * 4;
uh = (udp_header *)((u_char*)ih + ip_len);
sport = ntohs(uh->sport);
dport = ntohs(uh->dport);
printf("%d.%d.%d.%d.%d -> %d.%d.%d.%d.%d\n",
    ih->saddr.byte1,
    ih->saddr.byte2,
    ih->saddr.byte3,
    ih->saddr.byte4,
    sport,
    ih->daddr.byte1,
    ih->daddr.byte2,
    ih->daddr.byte3,
    ih->daddr.byte4,
    dport);

}

int _tmain(int argc, _TCHAR* argv[])
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i = 0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
u_int netmask;
char packet_filter[] = "ip and udp";
struct bpf_program fcode;

/* 获取本机设备列表 */
if (pcap_findalldevs_ex((char *)PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
{
    fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
    exit(1);
}

/* 打印列表 */
for (d = alldevs; d; d = d->next)
{
    printf("%d. %s", ++i, d->name);
    if (d->description)
        printf(" (%s)\n", d->description);
    else
        printf(" (No description available)\n");
}

if (i == 0)
{
    printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
    return -1;
}

printf("Enter the interface number (1-%d):", i);
scanf("%d", &inum);

if (inum < 1 || inum > i)
{
    printf("\nInterface number out of range.\n");
    /* 释放设备列表 */
    pcap_freealldevs(alldevs);
    return -1;
}

/* 跳转到选中的适配器 */
for (d = alldevs, i = 0; i< inum - 1; d = d->next, i++);

/* 打开设备 */
if ((adhandle = pcap_open(d->name,          // 设备名
    65536,            // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
    PCAP_OPENFLAG_PROMISCUOUS,    // 混杂模式
    1000,             // 读取超时时间
    NULL,             // 远程机器验证
    errbuf            // 错误缓冲池
)) == NULL)
{
    fprintf(stderr, "\nUnable to open the adapter. %s is not supported by WinPcap\n");
    /* 释放设备列表 */
    pcap_freealldevs(alldevs);
    return -1;
}

if (pcap_datalink(adhandle) != DLT_EN10MB)
{
    fprintf(stderr, "\nThis program works only on Ethernet network.\n");
    pcap_freealldevs(alldevs);
    return -1;
}
if (d->addresses != NULL)
    netmask = ((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
else
    netmask = 0xffffff;

if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) < 0)
{
    fprintf(stderr, "\nUnable to compile the packet filter.Check the syntax.\n");
    pcap_freealldevs(alldevs);
    return -1;
}

if (pcap_setfilter(adhandle, &fcode) < 0)
{
    fprintf(stderr, "\nError setting the filter.\n");
    pcap_freealldevs(alldevs);
    return -1;
}
printf("\nlistening on %s...\n", d->description);

/* 释放设备列表 */
pcap_freealldevs(alldevs);

/* 开始捕获 */
pcap_loop(adhandle, 0, packet_handler, NULL);

return 0;

}


调用winpcap实现捕获数据包(pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) 就出现错误转到remote-ext.h定义是这样求解决方案!

如果不用winpcap如何实现原始套接字捕获ip数据包。我在网上找到不少代码,已经基本看懂了原理,编译都没问题但是执行时接收不到任何数据。请大佬帮忙给一份可执行的代码,我的编译环境是vs2017,这周就得交作业了,希望最好能有注释。谢谢

  • 写回答

2条回答 默认 最新

  • threenewbee 2018-05-15 14:48
    关注

    localtime scanf那些换成 _s 后缀的。
    pcap_findalldevs_ex 那个函数的调用,参数前面加上 (char *) 强制转换下
    还有一个错误,但是你的图美看到。

    评论

报告相同问题?

悬赏问题

  • ¥15 pnpm 下载element-plus
  • ¥15 解决编写PyDracula时遇到的问题
  • ¥15 有没有人能解决下这个问题吗,本人不会编程
  • ¥15 plotBAPC画图出错
  • ¥30 关于#opencv#的问题:使用大疆无人机拍摄水稻田间图像,拼接成tif图片,用什么方法可以识别并框选出水稻作物行
  • ¥15 Python卡尔曼滤波融合
  • ¥20 iOS绕地区网络检测
  • ¥15 python验证码滑块图像识别
  • ¥15 根据背景及设计要求撰写设计报告
  • ¥20 能提供一下思路或者代码吗