?
由? pcap_findalldevs_ex() ?返回的每一個? pcap_if ?結構體,都包含一個? pcap_addr ?結構體,這個結構體由如下元素組成:
- 一個地址列表
- 一個掩碼列表 (each of which corresponds to an entry in the addresses list).
- 一個廣播地址列表 (each of which corresponds to an entry in the addresses list).
- 一個目的地址列表 (each of which corresponds to an entry in the addresses list).
另外, 函數? pcap_findalldevs_ex() ?還能? 返回遠程適配器信息? 和 ?一個位于所給的本地文件夾的pcap文件列表 。
下面的范例使用了ifprint()函數來打印出? pcap_if ?結構體中所有的內容。程序對每一個由? pcap_findalldevs_ex() ?函數返回的pcap_if,都調用ifprint()函數來實現打印。
?
1
#include
"
pcap.h
"
2
#pragma
comment(lib, "wpcap.lib")
3
#pragma
comment(lib, "Packet.lib")
4
#pragma
comment(lib, "wsock32.lib")
5
6
7
8
#ifndef WIN32
9
#include <sys/socket.h>
10
#include <netinet/
in
.h>
11
#else
12
#include <winsock.h>
13
#endif
14
15
16
//
函數原型
17
void
ifprint(pcap_if_t *
d);
18
char
*iptos(u_long
in
);
19
char
* ip6tos(
struct
sockaddr *sockaddr,
char
*address,
int
addrlen);
20
21
22
int
main()
23
{
24
pcap_if_t *
alldevs;
25
pcap_if_t *
d;
26
char
errbuf[PCAP_ERRBUF_SIZE+
1
];
27
char
source[PCAP_ERRBUF_SIZE+
1
];
28
29
printf(
"
Enter the device you want to list:\n
"
30
"
rpcap:// ==> lists interfaces in the local machine\n
"
31
"
rpcap://hostname:port ==> lists interfaces in a remote machine\n
"
32
"
(rpcapd daemon must be up and running\n
"
33
"
and it must accept 'null' authentication)\n
"
34
"
file://foldername ==> lists all pcap files in the give folder\n\n
"
35
"
Enter your choice:
"
);
36
37
fgets(source, PCAP_ERRBUF_SIZE, stdin);
38
source[PCAP_ERRBUF_SIZE] =
'
\0
'
;
39
40
/*
獲得接口列表
*/
41
if
(pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) == -
1
)
42
{
43
fprintf(stderr,
"
Error in pcap_findalldevs: %s\n
"
,errbuf);
44
exit(
1
);
45
}
46
47
/*
掃描列表并打印每一項
*/
48
for
(d=alldevs;d;d=d->
next)
49
{
50
ifprint(d);
51
}
52
53
pcap_freealldevs(alldevs);
54
55
return
1
;
56
}
57
58
59
60
/*
打印所有可用信息
*/
61
void
ifprint(pcap_if_t *
d)
62
{
63
pcap_addr_t *
a;
64
char
ip6str[
128
];
65
66
/*
設備名(Name)
*/
67
printf(
"
%s\n
"
,d->
name);
68
69
/*
設備描述(Description)
*/
70
if
(d->
description)
71
printf(
"
\tDescription: %s\n
"
,d->
description);
72
73
/*
Loopback Address
*/
74
printf(
"
\tLoopback: %s\n
"
,(d->flags & PCAP_IF_LOOPBACK)?
"
yes
"
:
"
no
"
);
75
76
/*
IP addresses
*/
77
for
(a=d->addresses;a;a=a->
next) {
78
printf(
"
\tAddress Family: #%d\n
"
,a->addr->
sa_family);
79
80
switch
(a->addr->
sa_family)
81
{
82
case
AF_INET:
83
printf(
"
\tAddress Family Name: AF_INET\n
"
);
84
if
(a->
addr)
85
printf(
"
\tAddress: %s\n
"
,iptos(((
struct
sockaddr_in *)a->addr)->
sin_addr.s_addr));
86
if
(a->
netmask)
87
printf(
"
\tNetmask: %s\n
"
,iptos(((
struct
sockaddr_in *)a->netmask)->
sin_addr.s_addr));
88
if
(a->
broadaddr)
89
printf(
"
\tBroadcast Address: %s\n
"
,iptos(((
struct
sockaddr_in *)a->broadaddr)->
sin_addr.s_addr));
90
if
(a->
dstaddr)
91
printf(
"
\tDestination Address: %s\n
"
,iptos(((
struct
sockaddr_in *)a->dstaddr)->
sin_addr.s_addr));
92
break
;
93
/*
94
case AF_INET6:
95
printf("\tAddress Family Name: AF_INET6\n");
96
if (a->addr)
97
printf("\tAddress: %s\n", ip6tos(a->addr, ip6str, sizeof(ip6str)));
98
break;
99
*/
100
default
:
101
printf(
"
\tAddress Family Name: Unknown\n
"
);
102
break
;
103
}
104
}
105
printf(
"
\n
"
);
106
}
107
108
109
110
/*
將數字類型的IP地址轉換成字符串類型的
*/
111
#define
IPTOSBUFFERS 12
112
char
*iptos(u_long
in
)
113
{
114
static
char
output[IPTOSBUFFERS][
3
*
4
+
3
+
1
];
115
static
short
which;
116
u_char *
p;
117
118
p = (u_char *)&
in
;
119
which = (which +
1
== IPTOSBUFFERS ?
0
: which +
1
);
120
sprintf(output[which],
"
%d.%d.%d.%d
"
, p[
0
], p[
1
], p[
2
], p[
3
]);
121
return
output[which];
122
}
123
124
125
/*
126
char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen)
127
{
128
socklen_t sockaddrlen;
129
130
#ifdef WIN32
131
sockaddrlen = sizeof(struct sockaddr_in6);
132
#else
133
sockaddrlen = sizeof(struct sockaddr_storage);
134
#endif
135
136
137
if(getnameinfo(sockaddr,
138
sockaddrlen,
139
address,
140
addrlen,
141
NULL,
142
0,
143
NI_NUMERICHOST) != 0) address = NULL;
144
145
return address;
146
}
147
*/
?
結果:
?
此處只能顯示電腦的ipv4的網卡信息,不知道為什么不能有ipv6的代碼時,不能編譯通過,不知道是包不支持,還是系統不支持;
?
?
int
pcap_findalldevs_ex (
char
*
source,
struct
pcap_rmtauth *
auth,
pcap_if_t
**
alldevs,
char
*
errbuf
)
?
·該函數請查看前一篇;
?
struct
pcap_rmtauth{
int
type
//
Type of the authentication required.
char
*
username
//
Zero-terminated string containing the username that has to be used on the remote machine for authentication.
char
*
password
//
Zero-terminated string containing the password that has to be used on the remote machine for authentication.
};
?
?
typedef struct? pcap_if ? pcap_if_t ;
struct
pcap_if {
pcap_if
*
next
//
if not NULL, a pointer to the next element in the list; NULL for the last element of the list
char
*
name
//
a pointer to a string giving a name for the device to pass to pcap_open_live()
char
*
description
//
if not NULL, a pointer to a string giving a human-readable description of the device
pcap_addr *
addresses
//
a pointer to the first element of a list of addresses for the interface
u_int flags
//
PCAP_IF_ interface flags. Currently the only possible flag is PCAP_IF_LOOPBACK, that is set if the interface is a loopback interface.
};
?
typedef struct? pcap_addr ? pcap_addr_t ;
struct
pcap_addr
{
pcap_addr
*
next
//
if not NULL, a pointer to the next element in the list; NULL for the last element of the list
sockaddr *
addr
//
a pointer to a struct sockaddr containing an address
sockaddr *
netmask
//
if not NULL, a pointer to a struct sockaddr that contains the netmask corresponding to the address pointed to by addr.
sockaddr *
broadaddr
//
if not NULL, a pointer to a struct sockaddr that contains the broadcast address corre- sponding to the address pointed to by addr; may be null if the interface doesn't support broadcasts
sockaddr *
dstaddr
//
if not NULL, a pointer to a struct sockaddr that contains the destination address corre- sponding to the address pointed to by addr; may be null if the interface isn't a point- to-point interface
};
?
struct
sockaddr {
unsigned
short
sa_family;
char
sa_data[
14
];
};
?
? ·詳細的請看前面的socket編程;
?
struct
sockaddr_in{
short
sin_family;
unsigned
short
sin_port;
struct
in_addr sin_addr;
char
sin_zero[
8
];
};
?
?
in_addr
The? in_addr ?structure represents a host by its Internet address.
struct
in_addr {
union {
struct
{ u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct
{ u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
};
Members
- S_un_b
- Address of the host formatted as four u_chars.
- S_un_w
- Address of the host formatted as two u_shorts.
- S_addr
- Address of the host formatted as a u_long.?
?
?
fgets, fgetws
Get a string from a stream.
char
*fgets(
char
*
string
,
int
n, FILE *
stream );
wchar_t
*fgetws( wchar_t *
string
,
int
n, FILE *stream );
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

