#define HAVE_REMOTE
#include
#include
/* 4 bytes IP address /
typedef struct ip_address
{
u_char byte1;
u_char byte2;
u_char byte3;
u_char byte4;
}ip_address;
/ IPv4 header /
typedef struct ip_header
{
u_char ver_ihl; / Version (4 bits) + Internet header length (4 bits)*/
u_char tos; /* Type of service /
u_short tlen; / Total length /
u_short identification; / Identification /
u_short flags_fo; / Flags (3 bits) + Fragment offset (13 bits)*/
u_char ttl; /* Time to live /
u_char proto; / Protocol /
u_short crc; / Header checksum /
ip_address saddr;/ Source address /
ip_address daddr;/ Destination address /
u_int op_pad; / Option + Padding /
}ip_header;
/ UDP header /
typedef struct udp_header
{
u_short sport; / Source port /
u_short dport; / Destination port /
u_short len; / Datagram length /
u_short crc; / Checksum /
}udp_header;
/ Prototype of the pachet handler /
void packet_handler(u_char param, const struct pcap_pkthdr* header, const u_char* pkt_data);
int main() {
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;
/* Retrieve the device list /
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
{
fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}
/ Print the list*/
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");
/* Free the device list /
pcap_freealldevs(alldevs);
return -1;
}
/ Jump to the selected adapter /
for (d = alldevs; d; d = d->next);
/ Open the adapter /
if ((adhandle = pcap_open(d->name, /*name of the device */
65536, / portion of the packet to capture /
/ 65536 grants that the whole packet will be captured on all the MACs /
PCAP_OPENFLAG_PROMISCUOUS, / promiscuous mode /
1000, / read timeout /
NULL, / remote authentication /
errbuf / error buffer /
)) == NULL)
{
fprintf(stderr, "\nUnable to open the adapter. %s is not supported by Winpcap\n");
/ Free the devices list /
pcap_freealldevs(alldevs);
return -1;
}
/ Check the link layer. We support only Ethernet for simplicity /
if (pcap_datalink(adhandle) != DLT_EN10MB)
{
fprintf(stderr, "\nThis program works only on Ethernet networks.\n");
/ Free the devices list /
pcap_freealldevs(alldevs);
return -1;
}
if (d->addresses != NULL)
{
/ Retrieve the mask of the first address of the interface /
netmask = ((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
}
else
{
/ If the interface is without addresses we suppose to be in a C class network /
netmask = 0xffffffff;
}
/ complie the filter /
if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) < 0)
{
fprintf(stderr, "\nUnable to compile the packet filter. Check the syntax.\n");
/ Free the devices list /
pcap_freealldevs(alldevs);
return -1;
}
/ set the filter /
if (pcap_setfilter(adhandle, &fcode) < 0)
{
fprintf(stderr, "\nError setting the filter.\n");
/ Free the devices list /
pcap_freealldevs(alldevs);
return -1;
}
printf("\nlistening on %s ...\n", d->description);
/ At this point,we don't need any more the device list. Free it /
pcap_freealldevs(alldevs);
/ Start the capture /
pcap_loop(adhandle, 0, packet_handler, NULL);
return 1;
}
/ Callback function invoked by libpcap for every incoming packet /
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;
/* convert the timestamp to readable format convert the TIMESTAMP to可读格式*/
ltime = localtime(&header->ts.tv_sec);
strftime(timestr, sizeof(timestr), "%H:%M:%S", ltime);
/* print timestamp and length of the packet /
printf("%s.%.6d len: %d ", timestr, header->ts.tv_usec, header->len);
/ retrieve the position of the ip header /
ih = (ip_header)(pkt_data + 14); /* length of ethernet header /
/ retrieve the position of the udp header /
ip_len = (ih->ver_ihl & 0xf) * 4;
uh = (udp_header)((u_char*)ih + ip_len);
/* convert from network byte order to host byte order /
/*sport = ntohs(uh->sport);
dport = ntohs(uh->dport);/
/* print ip addresses and udp ports /
printf("%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*/);
}
为什么显示窗口,已停止工作?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
悬赏问题
- ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
- ¥15 用visualstudio2022创建vue项目后无法启动
- ¥15 x趋于0时tanx-sinx极限可以拆开算吗
- ¥500 把面具戴到人脸上,请大家贡献智慧
- ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
- ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
- ¥30 c#打开word开启修订并实时显示批注
- ¥15 如何解决ldsc的这条报错/index error
- ¥15 VS2022+WDK驱动开发环境
- ¥30 关于#java#的问题,请各位专家解答!