Winpcap学习笔记

Winpcap学习笔记
Winpcap学习笔记

说明:本系列文章是我阅读winpcap手册后整理的一个学习笔记。文章中出现的所有代码是我根据winpcap手册中的示例代码进行了学习,并调试通过,其中对部分代码作了修改,关于代码的版权我尊重winpcap手册中的版权说明,如果你使用了本系列文章中的代码而引起任何的版权或造成安全威胁等问题,我将不负任何责任。

下载好了WpdPack_3_2_alpha1.zip(下载地址:https://www.360docs.net/doc/e816490799.html,/install/bin/WpdPack_3_2_alpha1.zip),解压后除了有文档,例子外还有Include和lib,于是想用TC2来做开发环境,但是编译的时候老是出问题,于是放弃。后来阅读了Winpcap手册后才知道因为是在windows上开发,所以它推荐用VC++6.0,于是改用VC。

第一个试验是:

#include

#include

int main() {

pcap_if_t *alldevs;

pcap_if_t *d;

int i = 0;

char errbuf[PCAP_ERRBUF_SIZE];

/* Retrieve the device list from the local machine*/

if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1)

{

printf("Error in pcap_findalldevs_ex: %s\n", errbuf);

exit(1);

}

/* Print the list */

for (d = alldevs; d != NULL; d = d->next)

{

/* Print the device’s name */

printf("%d. %s", ++ i, d->name);

/* Print the device’s dscription */

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 0;

}

/* We don’t need any more the device list. Free it */

pcap_freealldevs(alldevs);

return 1;

}

编译的时候又遇到问题——“无法打开pcap.h”。又查看开发手册才找到解决方法:

1.安装Winpcap驱动。下载地址:https://www.360docs.net/doc/e816490799.html,/install/bin/WinPcap_3_1.exe。

2.将Winpcap的Include,Lib目录添加进VC6.0的环境变量中;

3. 针对每一个项目,先用VC打开项目,然后在"Project->Settings",标签栏出选择"C/C++",在"Preprocessor definitions"的输入框里添加"WPCAP",再选择"Link",在"Object/library modules"的输入框里添加"wpcap.lib Packet.lib"。

再编译时终于OK了。之后,阅读代码并查看开发手册学到了下面的东西:

pcap_if是一个结构体,具体点它是一个链表的结点,他的定义如下:

struct pcap_if {

struct pcap_if *next;

char *name;

char *description;

struct pcap_addr *addresses;

u_int flags;

}

另外,在pcap.h中有一句“typedef struct pcap_if pcap_if_t;”,所以也可以用pcap_if_t

代替pcap_if。

int pcap_findalldevs_ex(char * source,

struct pcap_rmtauth * auth,

pcap_if_t ** alldevs,

char * errbuf

)

这个函数是’pcap_findalldevs()’的一个超集。’pcap_findalldevs()’比较老,他只允许列出本地机器上的设备。然而,’pcap_findalldevs_ex()’除了可以列出本地及其上的设备,还可以列出远程机器上的设备。此外,它还能列出所有可用的pcap文件到指定的文件夹。’pcap_findalldevs_ex()’是平台无关的,然而它以来于标准的’pcap_findalldevs()’来获得本地机器的地址。

今天在阅读Winpcap Manual的时候发现一句话:

“This means that on shared media (like non-switched Ethernet), WinPcap will be able to capture the packets of other hosts.”

我理解为:如果在通过没有交换功能的集线器连接的网络上,只要把网卡设置为混杂(promiscuous)模式,winpcap能够捕获到其他主机通信的数据包。如果是具有交换功能的集线器连接的网络winpcap还能管用吗?这个在后边的实习中将会进行试验。

试验程序2:

/*

* 截获数据包的试验。先打印出所有网络适配器的列表,然后选择

* 想在哪个适配器上截获数据包。然后通过pcap_loop()函数将截获

* 的数据包传给回调函数packet_handler()处理。

* 通过该程序初步了解了使用winpcap截获数据包的步骤以及一些在

* 截获数据包时非常重要的函数和结构体。

* 2006-1-26

*/

#include

#include

/* Prototype of the packet 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];

/* Retrieve the devices list on the local machine */

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)

{

/* Print name */

printf("%d. %s", ++ i, d->name);

/* Print description */

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;

}

/* Select an adapter */

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, i = 0; i < inum - 1; d = d->next, ++ i);

/*Open the device */

if ((adhandle = pcap_open(d->name, /* name of the device */

65536, /* portion of the packet to capture */

/* 65535 guarantees that the whole packet will be captured on all the link layers */

PCAP_OPENFLAG_PROMISCUOUS, /* promiscuous mode */

1000, /* read timeout */

NULL, /* authentication on the remote machine */

errbuf /* error buffer */

)) == NULL)

{

fprintf(stderr, "\nnable to open the adapter. %s is not supported by Winpcap\n", d->name);

/* 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];

/* convert the timestamp to readable format */

ltime = localtime(&header->https://www.360docs.net/doc/e816490799.html,_sec);

strftime(timestr, sizeof(timestr), "%H:%M:%S", ltime);

printf("%s, %.6d len:%d\n", timestr, header->https://www.360docs.net/doc/e816490799.html,_usec, header->len);

}

函数1:

pcap_t *pcap_open(const char * source,

int snaplen,

int flags, [Page]

int read_timeout,

struct pcap_rmtauth * auth,

char * errbuf

)

为捕获/发送数据打开一个普通的源。pcap_open()能够替代所有的pcap_open_xxx()函数,它隐藏了不同的pcap_open_xxx()之间的差异,所以程序员不必使用不同的open函数。

source:的是包含要打开的源名称的以’\0’结尾的字符串。源名称得包含新的源规范语法(Source Specification Syntax),并且它不能为NULL。为了方便的使用源语法,请记住:(1)pcap_findalldevs_ex()返回的适配器(网卡)可以直接被pcap_open()使用;(2)万一用户想传递他自己的源字符串给pcap_open(),pcap_createsrcstr()可以创建正确的源标识。

snaplen:需要保留的数据包的长度。对每一个过滤器接收到的数据包,第一个‘snaplen’字节的内容将被保存到缓冲区,并且传递给用户程序。例如,snaplen等于100,那么仅仅每一个数据包的第一个100字节的内容被保存。简言之就是从每一个包的开头到snaplen的那段内容将被保存。

flags:保存一些由于抓包需要的标志。Winpcap定义了三种标志:

l PCAP_OPENFLAG_PROMISCUOUS:1,它定义了适配器(网卡)是否进入混杂模式(promiscuous mode)。

l PCAP_OPENFLAG_DA TA TX_UDP:2,它定义了数据传输(假如是远程抓包)是否用UDP协议来处理。

l PCAP_OPENFLAG_NOCAPTURE_RPCAP:4,它定义了远程探测器是否捕获它自己产生的数据包。

read_timeout:以毫秒为单位。read timeout被用来设置在遇到一个数据包的时候读操作不必立即返回,而是等待一段时间,让更多的数据包到来后从OS内核一次读多个数据包。并非所有的平台都支持read timeout;在不支持read timeout的平台上它将被忽略。

auth:一个指向’struct pcap_rmtauth’的指针,保存当一个用户登录到某个远程机器上时的必要信息。假如不是远程抓包,该指针被设置为NULL。

errbuf:一个指向用户申请的缓冲区的指针,存放当该函数出错时的错误信息。

返回值是一个’pcap_t’指针,它可以作为下一步调用(例如pcap_compile()等)的参数,并且指定了一个已经打开的Winpcap会话。在遇到问题的情况下,它返回NULL并且’errbuf’变量保存了错误信息。

函数2:

int pcap_loop( pcap_t* p,

int cnt,

pcap_hander callback,

u_char* user

)

收集一群数据包。pcap_loop()与pcap_dispatch()类似,但是它会一直保持读数据包的操作直到cnt包被处理或者发生了错误。当有活动的读超时(read timeout)时它并不返回。然而,对pcap_open_live()指定一个非0的读超时(read timeout),当发生超时的时候调用pcap_dispatch()来接收并处理到来的所有数据包更好。Cnt指明了返回之前要处理数据包的最大数目。如果cnt为负值,pcap_loop()将一直循环(直到发生错误才停止)。如果出错时返回-1;如果cnt用完时返回0;如果在任何包被处理前调用pcap_breakloop()来中止循环将返回-2。所以,如果程序中使用了pcap_breakloop(),必须准确的来判断返回值是-1还是-2,而不能简单的判断<0。

函数3:

hypedef void (* pcap_handler)(u_char* user,

const struct pcap_pkthdr* pkt_header,

const u_char* pkt_data)

接收数据包的回调函数原型。当用户程序使用pcap_dispatch()或者pcap_loop(),数据包以这种回调的方法传给应用程序。用户参数是用户自己定义的包含捕获会话状态的参数,它必须跟pcap_dispatch()和pcap_loop()的参数相一致。pkt_hader是与抓包驱动有关的头。pkt_data指向包里的数据,包括协议头。

结构体1:

struct pcap_pkthdr {

struct timeval ts;

bpf_u_int32 caplen;

bpf_u_int32 len;

}

ts:时间戳

cpalen:当前分组的长度

len:数据包的长度

今天的试验程序与前天的功能是一样的,只是在捕获数据包的时候前天的程序用的是pcap_loop(),今天的代码用的是pcap_next_ex()。基于pcap_loop()抓包机制的回调很方便而且在某些情况下是一个不错的选择。但是,处理回调有些时候不适用——它使得程序更复杂,尤其是在应用程序与多线程或C++类有关的情况下。而pcap_next_ex()有的时候用起来更加方便。

试验代码3:

#include

#include

int main() {

pcap_if_t* alldevs;

pcap_if_t* d;

int inum;

int i = 0;

pcap_t* adhandle;

int res;

char errbuf[PCAP_ERRBUF_SIZE];

struct tm* ltime;

char timestr[16];

struct pcap_pkthdr* header;

u_char* pkt_data;

/* Retrieve the device list on the local machine */

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;

}

/* Select an adapter */

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 adpater */

for (d = alldevs, i = 0; i < inum - 1; d = d->next, ++ i);

/* Open the device */

if ((adhandle = pcap_open(d->name, /* name of the device */

65536, /* portion of the packet to capture */

/* 65536 guarantees that the whole packet will be captured on all the link layers */

PCAP_OPENFLAG_PROMISCUOUS, /* promiscuous mode */

1000, /* read timeout */

NULL, /* authentication on the remote machine */

errbuf /* error buffer */

)) == NULL)

{

fprintf(stderr, "\nUnable to open the adapter. %s is not supported by Winpcap\n", d->name);

/* 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);

/* Retrieve the packets */

while ((res = pcap_next_ex(adhandle, &header, &pkt_data)) >= 0)

{

if (res == 0)

{

/* Timeout elapsed */

continue;

}

/* convert the timestamp to readable format */

ltime = localtime(&header->https://www.360docs.net/doc/e816490799.html,_sec);

strftime(timestr, sizeof(timestr), "%H:%M:%S", ltime);

printf("%s, %.6d len:%d\n", timestr, header->https://www.360docs.net/doc/e816490799.html,_usec, header->len);

}

if (res == -1)

{

printf("Error reading the packets: %s\n", pcap_geterr(adhandle));

return -1;

}

return 1;

}

函数1:

pcap_next_ex(pcap_t* p,

struct pcap_pkthdr** pkt_header,

const u_char* pkt_data

)

从一个网络接口或离线捕获方式(例如读文件)读取一个数据包。该函数被用来重新获得下一个可用的数据包,没有使用libpcap提供的传统的回调方法。pcap_next_ex用指向头和下一个被捕获的数据包的指针为pkt_header和pkt_data参数赋值。

返回值有下列几种情况:

1,数据包被正确读取

0,pcap_open_live()设置的超时时间到。在这种情况下pkt_header和pkt_data不指向有效数据包

-1,发生错误

-2,离线捕获的时候读取到EOF

我们通常使用pcap_next_ex()而不是pcap_next(),因为pcap_next()有些缺点。首先,pcap_next()效率低,因为它隐藏了回调方法但是还是依赖于pcap_dispatch;第二,它不能检测EOF,所以当从一个文件获取数据包时它不是很有用。

函数2:

u_char* pcap_next(pcap_t* p, [Page]

struct pcap_pkthdr* h

)

返回下一个可用的数据包并且返回一个u_char指向该数据包数据部分的指针。如果发生错误或者活动的抓包没有读取到数据包(例如:数据包不能通过包过滤器而被丢弃,或者在支持读超时(read timeout)的平台上在任何数据包到来之前就超时终止,又或者是抓包设备的文件描述符在非阻塞(non-blocking)模式下并且没有数据包可以被读取),或者文件已被读完时返回NULL。不幸的是,没有办法检测是否发生错误。

本篇文章来源于中国协议分析网|https://www.360docs.net/doc/e816490799.html, 原文链接:https://www.360docs.net/doc/e816490799.html,/Class/winpcap/200610/16294.html

Winpcap提供(libpcap也提供)的一个强大特性是过滤引擎(filtering engine)。它提供了一个非常有效的接收网络流量的方法,并且它通常与Winpcap提供的抓包机制集成在一起。用于过滤数据包的函数是pcap_complie()和pcap_setfilter()。

pcap_complie()使用一个包含高级布尔表达式的字符串并且产生一个能被过滤引擎集成到数据包驱动中的低级字节码。

pcap_setfilter()把一个过滤器与核心驱动抓包会话关联起来。一旦pcap_setfilter()被调用,相关的过滤器将被应用到所有的来自网络的数据包上,并且所有的一致的数据包将被复制给应用程序。

抓包和过滤

经过前面几天的知识准备,现在我们将把前面的知识综合后应用于一个简单的实际应用程序。下面试验的目的是如何解析和解释被捕获的数据包的协议头。应用程序运行的结果是打印出一组我们的网络上的UDP通信数据。我们之所以选择解析和显示UDP协议是因为它比起其他协议(例如:TCP)更易于理解,对于初学者更适合。

试验代码:

#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 */ [Page]

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 */

ltime = localtime(&header->https://www.360docs.net/doc/e816490799.html,_sec);

strftime(timestr, sizeof(timestr), "%H:%M:%S", ltime);

/* print timestamp and length of the packet */

printf("%s.%.6d len: %d ", timestr, header->https://www.360docs.net/doc/e816490799.html,_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*/);

}

函数1:

int pcap_datalink(pcap_t* p)

返回链路层上的一个适配器。返回链路层的类型,链路层的类型包括:

DLT_NULL:BSD回路封装;链路层协议头是一个4字节的域,以主机字节顺序(host byte order),包含一个从socket.h来的PF_value。主机字节顺序(host byte order)是捕获数据包的机器的字节顺序,而PF_value是捕获数据包的机器的OS。如果一个读取一个文件,字节顺序和PF_value不一定是抓取文件的那些机器。

DLT_EN10MB:以太网(10Mb, 100Mb, 1000Mb, 或者更高)。

DLT_IEEE802:IEEE802.5令牌环网。

DLT_ARCNET:ARCNET。

DLT_SLIP:SLIP。

DLT_PPP:PPP;如果第一个字节是0xff或0x03,它是类HDLC帧上的PPP。

DLT_FDDI:FDDI

DLT_ATM_RFC1483:RFC1483LLC/SNAP ATM;数据包以IEEE802.2 LLC头开始。

DLT_RAW:原始IP(raw IP);数据包以IP头开始。

DLT_PPP_SERIAL:按照RFC1662,基于类HDLC帧的PPP,或者按照RFC1547的4.3.1,基于HDLC帧的Cisco PPP;前者的第一个字节是0xFF,后者的第一个字节是0x0F或0x8F。

DLT_PPP_ETHER:按照RFC2516,PPPoE;数据包以PPPoE头开始。

DLT_C_HDLC:按照RFC1547的4.3.1,基于HDLC帧的Cisco PPP。

DLT_IEEE802_11:IEEE 802.11无线局域网。

DLT_FRELAY:帧中继(Frame Relay)。

DLT_LOOP:OpenBSD回路封装。

DLT_LINUX_SLL:Linux抓包封装。

DLT_LTALK:苹果的LocalTalk,数据包以AppleTalk LLAP头开始。

DLT_PFLOG:OpenBSD pflog。

DLT_PRISM_HEADER:后接802.11头的棱镜监视器模式(Prism monitor mode)信息。

DLT_IP_OVER_FC:RFC2625 IP-over-Fiber 频道,以RFC2625中定义的Network_Header 开始。

DLT_SUNATM:SunA TM设备。

DLT_IEEE802_11_RADIO:后接802.11头的链路层信息。

DLT_ARCNET_LINUX:没有异常帧的ARCNET。

DLT_LINUX_IRDA:Linux-IrDA数据包,DLT_LINUX_SLL头后接IrLAP头。

函数2:

int pcap_compile(pcap_t* p,

struct bpf_program* fp,

char* str, [Page]

int optimize,

bpf_u_int32 netmask)

编译一个数据包过滤器,将一个能被核心态(kernel-level)过滤器引擎解释的程序中的高层过滤表达式(filtering expression)进行转化。pcap_compile()被用来将字符串str编译进过滤器程序(fp),程序(fp)是一个指向bpf_program结构体并被pcap_compile()赋值的指针。optimize控制是否对目标代码(resulting code)的性能进行优化。Netmask表明IPv4掩码,它仅在检查过滤器程序中的IPv4广播地址的时候被使用。如果网络掩码对于程序是不可知的或者数据包是在Linux的”任何(any)”伪接口上被捕获的,则赋值0;IPv4广播地址的测试将不被正确进行,但过滤器程序中的其他所有的测试都不会有问题。返回-1表示发生了错误,此时,pcap_geterr()将被用来显示错误信息。

函数3:

int pcap_setfilter(pcap_t* p,

struct bpf_program* fp)

把一个过滤器同一次抓包关联起来。pcap_setfilter被用来指定一个过滤器程序。fp是一个指向bpf_program结构体的指针,通常是pcap_compile()执行的结果。当失败时返回-1,此时,pcap_geterr()被用来显示错误信息;返回0表示成功。

首先,首先我们设置过滤器为“ip and udp”。用这个方法我们可以确保packet_handler()仅接收IPv4上的UDP数据包:这就简化了解析过程并且提高了程序的效率。

我们还创建了IP和UDP两个结构体,这些结构体被packet_handler()用来定位不同的头域。

packet_handler()展现了像tcpdump/WinDump这些复杂的嗅探器(sniffer)如何解析网络数据包。因为我们不关心MAC头,所以我们跳过它。为了简便起见,抓包前我们用pcap_datalink()检查MAC层,以确保我们处理的是以太网。该方法可以确保MAC头是14字节。

IP头的定位在MAC头定位之后。我们从IP包头中取出源IP地址和目标IP地址。

展开UDP包头有点复杂,因为IP包头不是定长的。

本篇文章来源于中国协议分析网|https://www.360docs.net/doc/e816490799.html, 原文链接:https://www.360docs.net/doc/e816490799.html,/Class/winpcap/200610/16295.html

处理离线的存储文件(offline dump file)

Winpcap提供了一些函数把网络通信保存到文件并且可以读取这些文件的内容。dump 文件的格式跟libpcap是一样的。它以二进制形式保存了被捕获的数据包的数据并且其他网络工具(包括WinDump,Ethereal,Snort)也以此为标准。

处理dump文件的程序结构跟前面的程序结构大致是一样的,只是这里出现了几个新的函数:(试验代码略)

函数1:

pcap_dumper_t* pcap_dump_open(pcap_t* p,

const char* fname)

打开一个保存数据包的文件。“-”的含义跟stdout是一样的。发生错误时返回NULL。p是一个由pcap_open_offline()或pcap_open_live()返回的pcap结构体;fname指定了文件的名字。你也可以调用pcap_dump_fopen()把数据包保存到一个已存在的流fp中,在Windows 中,这个流必须以二进制方式打开。如果返回NULL,pcap_geterr()会显示错误信息。

函数2:

void pcap_dump(u_char* user,

const struct pcap_pkthdr* h,

const u_char* sp)

把数据包保存到硬盘。pcap_dump()把数据包输出到pcap_dump_open()打开的文件中。注意,它的参数要跟pcap_dispatch()或pcap_loop()的回调函数的参数一致。如果直接被调用,则user这个参数的类型应该是pcap_dumper_t,也就是pcap_dump_open()的返回值类型。

在读取dump文件的内容时,用pcap_open_offline()来打开dump文件,然后用pcap_loop()来顺序读取数据包。读数据包跟接收数据包的过程是一样的。

函数3:

int pcap_live_dump(pcap_t* p,

char* filename,

int maxsize,

int maxpacks)

保存数据包到文件。pcap_live_dump()把网络通信从一个接口保存到一个文件中。这个函数将运行在核心态(kernel level),因此它的效率比pcap_dump()的更高。它的参数是一个用pcap_open_live()获得的接口描述符,一个dump文件名的字符串,文件的最大尺寸(maxsize,以字节为单位)和文件能容纳的数据包的最大个数(maxpcaks)。把maxsize或maxpacks设置为0意味着没有限制。当达到maxsize或maxpacks时,存储结束。注意,当两个限制(maxsize,maxpacks)中的一个到达时,存储将停止,但是文件仍然是被打开的。为了正确的保存数据并且使文件处于一致状态,必须用pcap_close()关闭适配器。

基于winpcap的嗅探器设计与实现

基于winpcap的嗅探器设计与实现

计算机与信息学院 《计算机网络系统实践》报告 设计题目:嗅探器的设计与实现 学生姓名:*** 学号:2010**** 专业班级:信息安全****

2013 年9 月25 一、设计要求 1.不限平台,可以使用Libpcap、WinPcap 或 Linux的原始套接字; 2.实现一个功能比较简单的、具有图形界面的Sniffer,主线程响应用户界 面操作,工作线程完成抓包等工作; 3.能够解析出IP层和传输层的协议头,能够过滤TCP、UDP等数据包; 4.能够输出文本方式传送的数据包的内容; 5.能够进行简单的流量统计。 二、开发环境与工具

操作系统:windows7 开发工具:visual studio 开发语言:C++ 附加库:Winpcap 三、设计原理 网络嗅探器是一种常用的监听网络的工具。所谓嗅探器( Sniffer) ,是一种利用计算机网络接口截获网络数据的软件或硬件,可用于网络管理、网络协议分析以及网络安全等众多方面。嗅探器不同于一般的键捕获工具,后者只能捕获当地终端控制台上的按键内容,而嗅探器所“嗅”到的是动态的以信息包形式( 如IP 数据包或者以太网包) 封装的信息流。其中可能携带了重要数据或敏感信息。可以将这些捕获到的信息包存档,以利用相应工具可以作进一步分析。 计算机网络的设计为嗅探器的使用创造了最基本的条件。在目前的网络环境中,所有计算机节点都是共享传输介质,任意节点发出或发往任意节点的数据帧必将经过网内每一个节点的网络接口,此时只需对嗅探节点的网络接口( 网卡) 进行适当的设置便可为实现嗅探的做好准备工作。在计算机网络系统中,网卡是用来接收网络上其他节点发来的数据帧,其内嵌的单片处理程序会检测数据帧来源的MAC 地址,并根据网卡所设置的接收方式来是否接收处理数据,如果认为应该处理,则网卡就会产生中断信号通知中央处理器,接收该数据帧并传输给操作系统处理。否则就简单丢弃,所对应节点的网卡就截断,计算机的中央处理器并不参与。 网卡是网络中节点主机的关键硬件设备。对数据的接收一般有四种设置模式: 广播模式: 接收在网络中进行广播数据信息。组播模式: 接收组播数据信息。单播模式: 只有匹配的目的网卡才能接收数据信息。混杂模式: 网卡能够可以接收一切通过它的数据信息。 四、系统功能描述及软件模块划分 系统功能设计 本系统的基本功能为实现网络数据包的捕获, 并将其数据内容解析显示。网络数据包捕获功能主要负责从网络中捕获和过滤数据,这可以通过调

名词解释第二次作业1

名词解释第二次作业 10商英1班曹婉10020103 1.Romanticism At the turn of the 18th and 19th centuries romanticism appeared in England as a new trend in literature. It rose and under the impetus of the Industrial Revolution and French Revolution. Romanticism prevailed in england during the period 1798---1832.generally speaking,the romanticists expressed the ideology and sentiment of these classes and social strata who were discontent with,and opposed to,the development of capitalism.but owing to difference in social and political attitudes ,they split into two schools. Some romantic writers reflected the thinking of classes ruined by the bourgeoisie, and by way of protest against capitalist development turned to the feudal past. These were the elder generation of romanticists, sometimes called escapist romanticists, including Wordsworth, Coleridge and Southey. Others expressed the aspirations of the classes created by capitalism and held out an ideal, though a vague one, of a future society free from oppression and exploitation. These were the younger generation of romanticists and sometimes called active romanticists represented by Byron, Shelley and Keats. So the general feature of the works of the romanticists is dissatisfaction with the bourgeois society. Their writings are filled with strong-willed heroes, formidable events, tragic situations, powerful conflicting passions, and exotic pictures. Sometimes they resort to symbolic methods. With the active romanticists, symbolic pictures represent a vague idea of some future society, while with the escapist romanticists; these often take on a mystic color. Romantic prose of the time was represented by Lamb, Hazlitt, De Q uincey and Hunt. The only great novelist in this period was Walter Scott. 2 English Critical Realism In the period of tense class struggle appeared a new literary trend-critical realism. English critical realism of the 19th century flourished in the forties and in the early fifties. The critical realists described with much vividness and great artistic skill the chief traits of the English society and criticized the capitalist system from a democratic viewpoint. The English critical realists of the 19th century not only gave a satirical portrayal of the bourgeoisie and all the ruling classes, but also showed profound sympathy for the common people. The major contribution made by the 19th century critical realists lies in their perfection of the novel.Humour and satire were used in the English realistic novels of the 19th century. Through the sketches of various negative characters given birth to by the capitalist system, critical realism reveals the corrupting influence of the rule of cash o upon human nature. Here lies the root of the democratic and humanistic character of the critical realism of the 19th century Charles Dickens was the greatest representative of English critical realism. With striking force and truthfulness, he creates pictures of bourgeois civilization, describing the misery and sufferings of the common people.David Copperfield was his favourite among all his books. Thackeray, like Dickens, was a representative of critical realism in 19th century England. One of his masterpieces is Vanity Fair.

Excel中常用函数应用举例

Excel中常用函数应用举例 1.求和函数SUM 求和 SUM(number1,number2,...)。 使用求和函数SUM,操作步骤如下: (1)打开“员工业绩表”工作簿,选择D10单元格,如图所示。 (2)单击“插入函数”按钮,在弹出的“插入函数”对话框中选择SUM函数,单击“确定”按钮,如图所示。

(3)在打开的“函数参数”对话框中,“Number1”文本框中默认引用D3:D9单元格区域,单击“确定”按钮,如图所示。 (4)求出的和值即可显示在D10单元格中,如图所示。

2.平均值函数A VERAGE 平均值函数的原理是将所选单元格区域中的数据相加,然后除以单元格个数,返回作为结果的算术平均值,其语法结构为:A VERAGE(number1,number2,...)。 使用平均值函数A VERAGE,操作步骤如下: (1)打开“员工业绩表”工作簿,选择D11单元格,如图所示。

(2)单击“插入函数”按钮,在弹出的“插入函数”对话框中选择A VERAGE函数,单击“确定”按钮,如图所示。 (3)在打开的“函数参数”对话框中,在“Number1”文本框中输入D3:D9,设定计算平均值的单元格区域,单击“确定”按钮,如图所示。

(4)求出的平均值即显示在D11单元格中,如图所示。 3.条件函数IF 条件函数可以实现真假值的判断,它根据逻辑计算的真假值返回两种结果。该函数的语法结构为:IF(logical_test,value_if_true,value_if_false)。其中,logical_test表示计算结果为true或false的任意值或表达式;value_if_true表示当logical_test为true时返回的值;value_if_false表示当logical_test为false时返回的值。

【必考题】中考九年级历史下第四单元经济危机和第二次世界大战第一次模拟试卷(含答案)(2)

一、选择题 1.第二次世界大战是人类历史上的一次空前浩劫,下列是与“二战”有关的重大历史事件,按时间先后顺序排列,正确的是 ①斯大林格勒战役②德国突袭波兰③诺曼底登陆④雅尔塔会议 A.①②③④B.②①③④C.②①④③D.②③①④ 2.历史概念图是一种空间网络结构图,可以把隐性知识显性化,也可以把碎片知识系统化。“第二次世界大战”的概念支架图如下,图中括号处应该是 A.开辟欧洲第二战场 B.发表《开罗宣言》 C.发表《波茨坦公告》 D.签署《联合国家宣言》 3.二战后期,1943年5月,北非战事结束。9月,轴心国集团开始解体的事件是 A.日本宣布投降B.意大利宣布投降 C.德国宣布投降D.第二战场开辟 4.1940年7—10月,德国对英国发动了猛烈的空袭和潜艇战,虽然实力悬殊,但英国军民始终坚持战斗,极大地消耗了德军兵力,不列颠空战的胜利为日后盟军反攻欧洲大陆奠定了基础。当时领导英国军民抵抗的英国首相是 A.张伯伦B.丘吉尔C.艾登D.达拉第 5.20世纪30年代,大量的犹太人被迫抛弃财产,逃往世界其他国家,中国也接受和保护了不少犹太人。当时犹太人主要受害于 A.第一次世界大战B.日本法西斯 C.意大利法西斯D.德国法西斯 6.1933年5月面对因经济危机而陷入极端贫困的民众。美国联邦救济署把单纯救济的方案进行修改,这一做法极大地恢复了失业者的自尊心和自立精神,受到广泛赞誉。美国政府的做法是 A.逐渐恢复银行信用B.规定雇员的谈判权 C.建立社会保障制度D.推行“以工代赈” 7.“1929年10月24日,纽约股市突然打了个喷嚏,这个喷嚏迅速蔓延全球,所有资本

主义国家都感冒了。”美国医治“感冒”的有效药方是() A.国家干预经济 B.建立法西斯专政 C.兴建公共工程 D.实行计划经济 8.今天恐怖活动已对人类社会构成了严重的威胁,20世纪30年代笼罩着世界的恐怖力量是 A.反革命势力B.殖民势力C.垄断组织势力D.法西斯势力 9.某班同学围绕“20世纪三四十年代威胁世界和平与安全的主要因素”进行讨论,提出了下列看法,你认为最主要的是 A.英、法操纵国联,美国拒绝参加 B.德、意、日法西斯国家结盟,四处侵略 C.美国爆发经济危机,波及世界 D.苏联实施第一个、第二个五年计划 10.世界反法西斯的胜利,给人类留下了哪些历史启迪?() ①只有加强国际合作,才能求得共同发展 ②意识形态不同的国家始终难以合作 ③所有国家都应互不侵犯,和平共处 ④和平来之不易,世界大战悲剧不能重演 A.②④B.①③④ C.①②D.①②③④ 11.“20世纪20年代后期是繁荣、稳定与和解的几年;20世纪30年代则是萧条、危机和战争的十年。”为了摆脱“萧条、危机”,资本主义国家采取了不同的应对措施,下列叙述中与此无关的是 A.美国采取国家干预经济的办法B.德国走上对外扩张的道路 C.日本军部上台组阁D.意大利建立法西斯专政 12.“其实罗斯福新政之所以成为神话,与其说是因为它经济上的成功,不如说是政治上的成功。”该观点主要说明“新政 A.极大改善了美国人民的生活B.使经济缓慢地恢复过来 C.调整和巩固了资本主义制度D.形成了美国的中央集权 13.如下表格有助于我们从整体上了解历史事件的先后顺序和发展历程。下表“重大转折”处的事件是

WinPcap开发-零基础知识入门基础

WinPcap开发(一):零基础入门 *原创作者:追影人 0×00 前言 网络编程在网络安全方面具有举足轻重的作用,如何快捷高效的监听、分析、构造网络流量,成为很多安全从业者需要解决的重点问题。而winpcap这一免费开源项目恰好可以为win32应用程序提供访问网络底层的能力,所以其成为了相关网络编程的首选开发工具。 0×01 winpcap是什么? winpcap(windows packet capture)是windows平台下一个免费的网络访问系统,可用于windows系统下的网络编程。著名的wireshark便是基于winpcap开发的,大家在安装wireshark中可以看到winpcap驱动程序的安装过程。 有关winpcap的介绍网络上很多,百科里面介绍的也很详细,我就不再copy了。需要注意的一点是,winpcap并不是一个简单的library,而是一个针对Win32平台上的抓包和网络分析的一个架构,它包括一个核心态的包过滤器,一个底层的动态链接库(packet.dll)和一个高层的不依赖于系统的库(wpcap.dll)。所以它只能“嗅探”到物理线路上的数据包,而不具备拦截的能力,因此不适用于个人防火墙等项目。 0×02 你需要准备些什么?

本系列文章主要带大家认识和了解如何利用winpcap网络编程技术进行网络的协议分析、流量统计及网络探测扫描等,这里我们并不会去深硬的解读相关源代码,而是以轻松的方式结合实验来对相关原理进行深入理解。在本系列文章中,笔者从简到难,简明介绍winpcap架构原理、相关环境搭建及快速编写核心代码。但是在开始前,读者需要有一些相关基础:了解网络协议相关基础知识,掌握一门winpc ap开发库支持的编程语言,自己能动手实践编写一些例子。Winpcap提供的开发接口原生是c语言的,不过热心肠的程序猿们已经为其他语言的使用提供了封装,比如java、.net、python,好像连易语言都有。本系列文章将使用c语言来进行各种实验,有兴趣的读者可以将其转换成自己熟悉的语言来动手实践。 0×03 你能学到什么? 有关winpcap开发的文章在网上很容易找到,但是更多的都是对于代码的讲解,笔者在本文尽量系统性的从原理层面结合各个应用场景来介绍相关知识:

第二次作业答案

1、在系统不受外力作用的非弹性碰撞过程中 ( C ) (A) 动能和动量都守恒; (B) 动能和动量都不守恒; (C) 动能不守恒、动量守恒; (D) 动能守恒、动量不守恒。 2、粒子B 的质量是粒子A 的质量的4倍,开始时粒子A 的速度为)43(j i +,粒子B 的速 度为)72(j i -,由于两者的相互作用,粒子A 的速度变为)47(j i -,此时粒子B 的 速度等于 ( A ) (A) )5(j i -; (B) )72(j i -; (C) 0; (D) )35(j i -。 3、力kN j i F )53( +=,其作用点的矢径为m j i r )34( -=,则该力对坐标原点的力矩大 小为 ( B ) (A)m kN ?-3; (B) m kN ?29; (C) m kN ?19; (D) m kN ?3。 4、对一个绕固定水平轴O 匀速转动的转盘,沿图示的同一水平直 线从相反方向射入两颗质量相同、速率相等的子弹,并停留在盘中,则子弹射入后转盘的角速度应 ( B ) (A)增大; (B) 减小; (C) 不变; (D) 无法确定。 1一飞轮作匀减速运动,在5s 内角速度由40πrad/s 减到10πrad/s ,则飞轮在这5s 内总共转过了 62.5 圈。 2如图所示,一弹簧竖直悬挂在天花板上,下端系一个质量为m 的重物,在O 点处平衡,设x 0为重物在平衡位置时弹簧的伸长量。以弹簧原长O' 处为弹性 势能和重力势能零点,则在平衡位置O 处的重力势能为___0mgx -_________。 3一人站在转动的转台上,在他伸出的两手中各握有一个重物,若此人向着胸部 缩回他的双手及重物,忽略所有摩擦,则系统的角动量____保持不变________,系统的转动动能_____增大_______。(填增大、减小或保持不变) 4一长为l ,质量均匀的链条,放在光滑的水平桌面上,若使其长度的很小一段悬于桌边下 (长度近似为0),然后由静止释放,任其滑动,则它全部离开桌面时的速率为 。(重力加速度为g )

半命题作文《第二次_______________》作文指导

半命题作文《第二次_______________》作文指导 【文题设计】 人生有无数的第一次,也有着无数的第二次。第二次也许是第一次的重复,但可能有全新的发现;第二次也许会趋于平淡,但更可能绽放精彩。第二次是一种坚持,是一种回味,是一次新生…… 请你以“第二次______”为题写一篇文章。 要求:(1)将标题补充完整(2)除诗歌外,文体不限,字数不少于600 (3)文中不得出现真实的人名、地名、校名。 一、题解 以“第二次____”为题,写一篇文章。承袭前几年的命题方式采用了半命题作文的形式,使学生有较大的自由取材空间,但与以往的半命题作文、话题作文又有很大不同,有了“第二次”这个限制词,考生套优秀作文结构的可能性就相对缩小。命题旨意引导学生关注自己的个性生活体验,以第一次为铺垫,突出这“第二次”的独特感悟。 二、思路导引 A. 生活叙事类独占先机:第二次泪流满面、第二次起跑、第二次握住你的手、第二次搬家、第二次放声高歌、第二次遇见你、第二次回眸、第二次选择、第二次不再有恨、第二次感动、第二次别离、第二次我找回自信、第二次感受父爱(母爱)、第二次过母亲节、第二次超越、第二次失眠、第二次凝望老街、第二次走近乡村、第二次贴近爸爸、第二次给母亲洗脚、第二次放手、第二次单车载爱……此类作文因情真意切而更能打动阅卷老师。 B、自然之悟:第二次等待花开、第二次观萤火虫、第二次观潮…… 以“第二次观萤火虫”为例: 第一次所见时,不屑,“只是包着漂亮皮囊的小飞虫,不自量力,很快会死……” 第二次感悟,一只萤火虫微不足道,却也能托起一片美好,百只,便能亮起一片光明,托起夏夜的美好…… C、阅读新感观(温故而知新):第二次读《西游》、第二次品《三国》、第二次看《海的女儿》、第二次听《听妈妈的话》(注:周杰伦的歌)…… D 、议论说理类:第二次比第一次更好、第二次更应珍惜、第二次是新生、第二次的痛苦是生……此类文章往往作者目标明确,但少了生活材料的支撑而言之无物,停留于第一与第二次之间的比较纠缠。 E 、热点地震文难写。 本次作文不少考生将目光聚焦到了512汶川地震,联想到生命、关爱、奉献、坚强、团结、民族精神

第二次作业及参考答案

第二次作业及参考答案 1如何设计实验条件使欲了解的电极基本过程(如电化学反应过程)成为电极系统的受控过程? 答:设计实验条件使欲了解的电极基本过程成为电极系统的受控过程,需要了解该电极过程在电极总过程中的具体位置。例如对于简单电极过程,电极过程等效电路为: 要使电化学反应过程(等效电路元件为Rct)成为电化学测量过程中电极过程的受控步骤,即要使得电极过程的等效电路简化为 则应该设计如下实验条件: (1)采用鲁金毛细管、高导电率的支持电解质或断电流法、恒电位仪正反馈法等措施,以减小或补偿掉电解液欧姆电阻,电极的电子导体选用高导电率材料作电子导电物质,以减小或忽略掉电子导体的欧姆电阻; (2)电化学测量时采用小幅值外加激励信号,当外加激励作用于电极一段时间、双电层充(放)电结束但浓差极化还没出现时进行测量,以忽略双电层充放电过程和浓差极化的影响。 (3)当电化学反应物可溶时,可采用旋转圆盘电极、在适宜的高转速下对电极进行测量,以忽略浓差极化对电极过程研究的干扰。 2什么是支持电解质?作用是什么? 答:支持电解质:电导率强、浓度大、在电化学测量过程中承担溶液电迁移任务而不参与电化学反应的物质。可以使溶液的离子强度和电导率在测量过程中保持稳定,获得重现性良好的可靠数据。作用:(1)增强溶液导电性,减小溶液欧姆压降;(2)承担溶液电迁移任务,消除反应物或产物的电迁移传质;(3)支持电解质浓度大,离子迁移数大,溶液离子强度主要取决于支持电解质,可以忽略测量过程中因反应物或产物离子消耗引起的离子强度的变化,电极反应各物种扩散系数可近似视为常数;(4)有利于紧密双电层电容的构建,减小分散层电势(1电势)的影响;(5)加入支持电解质后溶液密度大,可以忽略因电活性物质浓度梯度引起的溶液密度差,从而减小或忽略界面附近的对流传质。 3 工作电极分类? 答:按电极是否作为反应物参与电极反应,工作电极分为两类:第一类工作电极和第二类工作电极。第一类工作电极可称为活性工作电极,电极既承担电子导电的任务,又作为反应物参与电极反应。第二类工作电极又称为惰性工作电极,

工作中最常用的excel函数公式大全

工作中最常用的e x c e l函 数公式大全 -标准化文件发布号:(9556-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

工作中最常用的excel函数公式大全,帮你整理齐了,拿来即用 一、数字处理 1、取绝对值 =ABS(数字) 2、取整 =INT(数字) 3、四舍五入 =ROUND(数字,小数位数) 二、判断公式 1、把公式产生的错误值显示为空 公式:C2 =IFERROR(A2/B2,"") 说明:如果是错误值则显示为空,否则正常显示。 2、IF多条件判断返回值 公式:C2 =IF(AND(A2<500,B2="未到期"),"补款","")

说明:两个条件同时成立用AND,任一个成立用OR函数。 三、统计公式 1、统计两个表格重复的内容 公式:B2 =COUNTIF(Sheet15!A:A,A2) 说明:如果返回值大于0说明在另一个表中存在,0则不存在。 2、统计不重复的总人数 公式:C2 =SUMPRODUCT(1/COUNTIF(A2:A8,A2:A8))

说明:用COUNTIF统计出每人的出现次数,用1除的方式把出现次数变成分母,然后相加。 四、求和公式 1、隔列求和 公式:H3 =SUMIF($A$2:$G$2,H$2,A3:G3) 或 =SUMPRODUCT((MOD(COLUMN(B3:G3),2)=0)*B3:G3) 说明:如果标题行没有规则用第2个公式 2、单条件求和 公式:F2

=SUMIF(A:A,E2,C:C) 说明:SUM IF函数的基本用法 3、单条件模糊求和 公式:详见下图 说明:如果需要进行模糊求和,就需要掌握通配符的使用,其中星号是表示任意多个字符,如"*A*"就表示a前和后有任意多个字符,即包含A。 4、多条件模糊求和 公式:C11

社区工作在线作业第一次和第二次

社区工作在线作业第一次 一. 单选. (共10 小题,40 分) 1. 社区工作者经常与居民领袖并肩工作,帮助群众或团体维护自己的利益,运用传媒的力量向政府施压,影响正式组织的决策过程,在这里,工作者扮演的角色是(B )。 A .倡导者 B .行动者 C .教育者 D .资源提供者 2. 社会行动通常是由最温和的方法起步,当行不通时才提升行动的层次。这是社会行动的( B )。 A .A、让步原则 B .渐进原则 C .破坏原则 D .连串性原则 3. 关于社会策划模式下的社区工作者角色,下列说法错误的是(D)。 A .项目的规划者角色指的是工作者担当专家的角色 B .项目经理的角色是指工作者主要担当已经决策的项目的管理人员 C .监督实施的角色是指工作者主要扮演项目执行过程中的监督、反馈和协调的角色 D .专业人员的协调角色是指工作者担当专家的角色 4. 所谓社区发展的(C )是指在社区中要完成的具体的实质性的工作项目,或者是要解决的具体的社区问题。 A .宏观目标 B .微观目标 C .任务目标 D .过程目标 5. 60年代末期,美国学者罗斯曼提出的三大经典社区实务模式不包括以下哪一项?( A ) A .社区整合 B .地区发展 C .社会规划 D .社会行动 6. 社区发展计划最基本的工作是(B )。 A .建立目标 B .地方领导人才的选拔与训练 C .促使人民热心参加社区工作 D .发动并组织妇女青年参加各种社区发展工作 7. (A )称为西方社会救济立法和贫民救济事业史上的一个重要里程碑,对各国社会事业的制度化发展产生了深远的影响。 A .伊丽莎白济贫法 B .德国的汉堡制 C .英、美的慈善组织会社 D .德国爱尔伯福制 第 1 页共6 页

第二次作业答案

第二次作业答案标准化管理部编码-[99968T-6889628-J68568-1689N]

1.指令中为什么使用隐地址方式。 答:简化地址结构。 2.简述堆栈操作的特点,并举例说明。 答:先进后出(或后进先出),例子略。 3. 指令字长16位,可含有3、2、1或0个地址,每个地址占4位。请给出一个操作码扩展方案。 和CISC的中文名称是什么。 RISC(Reduced Instruction Set Computer):精简指令集计算机 CISC(Complex Instruction Set Computer):复杂指令集计算机 5.简述80%和20%规律。 答:80%的指令是简单指令,占运行时间的20%;20%的指令是复杂指令,占运行时间的80%。 6.简化地址结构的基本方法是什么 答:采用隐地址 7.如何用通用I/O指令实现对各种具体设备的控制 答: 1)I/O指令中留有扩展余地 2)I/O接口中设置控制/状态寄存器 8.什么是I/O端口 答:I/O接口中的寄存器 9.对I/O设备的编址方法有哪几种请简要解释。 1)单独编址:I/O地址空间不占主存空间,可与主存空间重叠。 具体分为编址到寄存器和编址到设备两种。 编址到设备:每个设备有各自的设备编码;I/O指令中给出设备码,并指明访问该设备的哪个寄存器。 编址到寄存器:为每个寄存器(I/O端口)分配独立的端口地址;I/O指令中给出端口地址。 2)统一编址:为每个寄存器(I/O端口)分配总线地址;访问外设时,指令中给出总线地址。I/O端口占据部分主存空间。 10.用堆栈存放返回地址,则转子指令和返回指令都要使用的寄存器是什么 答:堆栈指针SP 11.给出先变址后间址、先间址后变址和相对寻址三种寻址方式对有效地址的计算方法。 先变址后间址:EA =((R)+D) 先间址后变址:EA =(R)+(D) 相对寻址:EA =(PC)±D 12.各种寻址方式的操作数放于何处,如何形成操作数的有效地址。 答:除寄存器直接寻址方式操作数放在寄存器中之外,其它寻址方式操作数均在主存中。 立即寻址:指令中提供操作数 直接寻址:指令直接给出操作数地址 寄存器寻址:指令中给出寄存器号就是有效地址 间接寻址:指令中给出间址单元地址码(操作数地址的地址),按照该地址访问主存中的某间址单元,从中取出操作数的地址

工作中最常用的excel函数公式大全

工作中最常用的excel函数公式大全,帮你整理齐了,拿来即用 一、数字处理 1、取绝对值 =ABS(数字) 2、取整 =INT(数字) 3、四舍五入 =ROUND(数字,小数位数) 二、判断公式 1、把公式产生的错误值显示为空 公式:C2 =IFERROR(A2/B2,"") 说明:如果是错误值则显示为空,否则正常显示。 2、IF多条件判断返回值 公式:C2 =IF(AND(A2<500,B2="未到期"),"补款","")

说明:两个条件同时成立用AND,任一个成立用OR函数。 三、统计公式 1、统计两个表格重复的内容 公式:B2 =COUNTIF(Sheet15!A:A,A2) 说明:如果返回值大于0说明在另一个表中存在,0则不存在。 2、统计不重复的总人数 公式:C2

=SUMPRODUCT(1/COUNTIF(A2:A8,A2:A8)) 说明:用COUNTIF统计出每人的出现次数,用1除的方式把出现次数变成分母,然后相加。 四、求和公式 1、隔列求和 公式:H3 =SUMIF($A$2:$G$2,H$2,A3:G3) 或 =SUMPRODUCT((MOD(COLUMN(B3:G3),2)=0)*B3:G3) 说明:如果标题行没有规则用第2个公式 2、单条件求和

公式:F2 =SUMIF(A:A,E2,C:C) 说明:SUM IF函数的基本用法 3、单条件模糊求和 公式:详见下图 说明:如果需要进行模糊求和,就需要掌握通配符的使用,其中星号是表示任意多个字符,如"*A*"就表示a前和后有任意多个字符,即包含A。

4、多条件模糊求和 公式:C11 =SUMIFS(C2:C7,A2:A7,A11&"*",B2:B7,B11) 说明:在sumifs中可以使用通配符* 5、多表相同位置求和 公式:b2 =SUM(Sheet1:Sheet19!B2) 说明:在表中间删除或添加表后,公式结果会自动更新。 6、按日期和产品求和 公式:F2

winpcap环境部署(VC6.0出现找不到“pcap.h_'”文件解决方法)

Winpcap 环境部署 (VC6.0出现“pcap.h': No such file or directory”问题解决方法)Winpcap简介及Winpcap安装包和开发包下载地址: Winpcap是一个强大的网络开发库,可以实现许多功能:获取可用的网络适配器;获取指定适配器信息(比如名称和描述信息);捕获指定网卡的数据封包;发送数据封包;过滤捕获的包以获取特定包等。 首先到https://www.360docs.net/doc/e816490799.html,/install/default.htm下载安装winpcap 驱动和DLL组件。 注意下图被红线圈起来的地方,即使下载地址,点击进入 然后到https://www.360docs.net/doc/e816490799.html,/devel.htm.下载winpcap开发包,解压到指定目录,这里我解压到C:\WpdPack_4_0_2\WpdPack,可以看到里面包含了:Lib,Include,文档

和示例程序。 把安装包和开发包下载下来后,执行安装包,这样你的机子就能运行winpcap程序了,解压开发包里面有 具体解决方法: 这里的include和lib文件夹里的东西因为vc6.0里没有,所以编译一些程序时我们要手动添加。如果出现fatal error C1083: Cannot open include file: 'pcap.h': No such file or directory这个问题,就需要添加了。 下面是具体添加步骤: 第一步:

点菜单栏上的“工具”,再点击下拉菜单中的“选项”弹出“选项”对话框 点“目录”在“目录【S】”的下面选择include files然后按底下的添加符号,把你写的winpcap 开发包解压到的具体路径添加进去,如上图我的路径是

工作中最常用的excel函数公式大全

工作中最常用的excel函数公式大全 一、数字处理 1、取绝对值=ABS(数字) 2、取整=INT(数字) 3、四舍五入=ROUND(数字,小数位数) 二、判断公式 1、把公式产生的错误值显示为空 公式:C2=IFERROR(A2/B2,"") 说明:如果是错误值则显示为空,否则正常显示。 2、IF多条件判断返回值公式: C2=IF(AND(A2<500,B2="未到期"),"补款","") 说明:两个条件同时成立用AND,任一个成立用OR函数。

1、统计两个表格重复的内容 公式:B2=COUNTIF(Sheet15!A:A,A2) 说明:如果返回值大于0说明在另一个表中存在,0则不存在。 2、统计不重复的总人数 公式:C2=SUMPRODUCT(1/COUNTIF(A2:A8,A2:A8)) 说明:用COUNTIF统计出每人的出现次数,用1除的方式把出现次数变成分母,然后相加。

1、隔列求和 公式:H3=SUMIF($A$2:$G$2,H$2,A3:G3) 或=SUMPRODUCT((MOD(COLUMN(B3:G3),2)=0)*B3:G3) 说明:如果标题行没有规则用第2个公式 2、单条件求和 公式:F2=SUMIF(A:A,E2,C:C) 说明:SUMIF函数的基本用法

3、单条件模糊求和 公式:详见下图 说明:如果需要进行模糊求和,就需要掌握通配符的使用,其中星号是表示任意多个字符,如"*A*"就表示a前和后有任意多个字符,即包含A。 4、多条件模糊求和 公式:C11=SUMIFS(C2:C7,A2:A7,A11&"*",B2:B7,B11) 说明:在sumifs中可以使用通配符*

【好题】中考九年级历史下第四单元经济危机和第二次世界大战第一次模拟试题(带答案)(2)

一、选择题 1.某学校举办一次题为“第二次世界大战风云”的影视回顾展,以下是某班参展影片的片段——盟军统帅艾森豪威尔说:“我们克服了巨大的困难,盟军已于1944年6月6日突破德军的大西洋防线,法西斯离灭亡不远了。”根据片段判断,该影片为 A.《诺曼底登陆》B.《血染珍珠港》 C.《斯大林格勒战役》D.《柏林战役》 2.“其实罗斯福新政之所以成为神话,与其说是因为它经济上的成功,不如说是政治上的成功。”该观点主要说明“新政 A.极大改善了美国人民的生活B.使经济缓慢地恢复过来 C.调整和巩固了资本主义制度D.形成了美国的中央集权 3.下列图片反映了第二次世界大战进程中的重大战役,按其发生的时间先后排序正确的是( ) A.①②③④B.③①②④C.④②①③D.②④①③ 4.罗斯福在1933年就职演说中说:“只要国家仍处在危急存亡的关头,我就要求国会授予我应付危机的那种唯一最后手段——广泛的行政权。”这说明罗斯福 A.对工业进行了调整 B.逐步走向了独裁 C.要改变资本主义制度 D.要加强国家对经济的干预 5.下图所示内容为某次战争前的情报。情报中的“此举”是为了 A.发动第二次世界大战B.摧毁美军太平洋舰队 C.开辟欧洲第二战场D.彻底消灭法西斯主义 6.与“第二次世界大战”“参战国增多”“达到最大规模”这些关键词直接有关的事件是A.凡尔登战役B.日本偷袭珍珠港C.斯大林格勒保卫战D.诺曼底登陆7.1933年5月面对因经济危机而陷入极端贫困的民众。美国联邦救济署把单纯救济的方

案进行修改,这一做法极大地恢复了失业者的自尊心和自立精神,受到广泛赞誉。美国政府的做法是 A.逐渐恢复银行信用B.规定雇员的谈判权 C.建立社会保障制度D.推行“以工代赈” 8.某班同学围绕“20世纪三四十年代威胁世界和平与安全的主要因素”进行讨论,提出了下列看法,你认为最主要的是 A.英、法操纵国联,美国拒绝参加 B.德、意、日法西斯国家结盟,四处侵略 C.美国爆发经济危机,波及世界 D.苏联实施第一个、第二个五年计划 9.1932年,某政要指出:“世界近两年正在倒退,各国……采取危及世界和平的猜疑、恐惧和威胁的态度。”出现这一形势的主要原因是 A.同盟国和协约国军事对峙B.严重的经济危机波及世界 C.亚洲战争策源地形成D.慕尼黑会议割让苏台德 10.世界反法西斯的胜利,给人类留下了哪些历史启迪?() ①只有加强国际合作,才能求得共同发展 ②意识形态不同的国家始终难以合作 ③所有国家都应互不侵犯,和平共处 ④和平来之不易,世界大战悲剧不能重演 A.②④B.①③④ C.①②D.①②③④ 11.1938年10月,英国首相张伯伦说:“这是我们时代的和平。女士们,先生们。安心睡觉去吧!”丘吉尔则尖锐地指出:“我们正在遭到了一场全面、十足的失败!”这场争论针对的是() A.《凡尔赛和约》签订B.华盛顿会议召开 C.《慕尼黑协定》签定D.杜鲁门主义提出 12.为履行美、英、苏首脑在1943年11月德黑兰会议上达成的协议,以美国为主的盟军在艾森豪威尔将军的指挥下,以2万多空降伞兵为先导,近16万部队在空军的掩护下,一举突破了德军防线—“大西洋壁垒”,置德军于腹背受敌的境地。这一事件是 A.莫斯科保卫战B.日本偷袭珍珠港 C.诺曼底登陆D.斯大林格勒保卫战 13.如下图展示了第二次世界大战的进程。其中的①②分别是指()

WinpCap 编写抓包程序

利用WinpCap 编写抓包程序 网友:yeahilly 发布于:2008.05.20 11:12(共有条评论) 查看评论| 我要评论 WinpCap是一个公开的免费的抓包驱动加开发包,利用它,可以大大缩短我们的开发周期。 首先,先枚举系统中的所有网卡: /* 获取设备列表*/ if (pcap_findalldevs(&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 ( (adhandle= pcap_open_live(d->name, //设备名 65536, // 捕捉完整的数据包 1 , // 混在模式 1, // 读入超时

errbuf // 错误缓冲 ) ) == NULL) { printf("Unable to open the adapter"); pcap_freealldevs(alldevs); return; } 打开设备之后,我们就可以利用adhandle句柄来正式抓包了,先新建一个回调函数,形如 void packet_handler(u_char* packets,const struct pcap_pkthdr *header,const u_char *data) { } 然 后调用pcap_loop(adhandle, 0, packet_handler, NULL);pcap_loop的最后一个参数和packet_handler的packets参数是对应的,用于在函数间传递数据。WinpCap每收 到一个包就自动调用packet_handler函数,将包的内容作为data参数,我们对data作强制类型转化就可以得到数据包各部分的内容。 事实上,WinpCap开发包除了可以用回调函数抓包外,还可以用非回调的方法。在得到adhandle后不调用pcap_loop,而用下面的方法:while(1) { res = pcap_next_ex(adhandle,&header,&data); if(res==0) { Sleep(100); continue; } } 用pcap_next_ex读取数据包内容,至于if(res==0)这一段是为了防止没数据包到达时重复循环。

大学语文第二次作业1

大学语文第三讲----第五讲作业题 一、选择题 1.汉乐府在语言形式上的特点是( c ) A.四言为主,间以杂言 B.七言为主 C.五言为主 D.五七言为主 2.两汉乐府诗基本上是属于( a ) A.叙事型诗歌 B.抒情型诗歌 C.写物型诗歌 D.说理型诗歌3.下面的表述适合汉代乐府诗歌的有( acde ) A.刻画人物细致入微,故事情节较为完整,将古代叙事诗推向成熟。 B.是兴起于楚国的一种诗歌样式。 C.继承《诗经》写实方法。 D.感于哀乐,缘事而发 E.以五言为主 4. 《迢迢牵牛星》中“纤纤擢素手”后面的一句是( c ) A.盈盈一水间 B.皎皎河汉女 C.札札弄机杼 D.脉脉不得语 5.下列作品中,抒写爱情的有( abcd ) A.《湘夫人》 B.《迢迢牵牛星》 C.《上邪》 D.《蒹葭》 6.下面作品中,属于古诗十九首之内的是( c ) A.《湘夫人》 B.《十五从军征》 C.《迢迢牵牛星》 D.《将进酒》 7.下列作品中,叠字运用为其显著特色的有( b ) A.李清照《武陵春》 B.无名氏《迢迢牵牛星》 C.《诗经·蒹葭》 D.《汉乐府·十五从军征》 8.《迢迢牵牛星》中,借外在举止情态来写相思之情的诗句是( d ) A.河汉清且浅,相去复几许? B.迢迢牵牛星,皎皎河汉女。 C.纤纤擢素手,札札弄机杼。 D.盈盈一水间,脉脉不得语。 9.“古诗十九首”是( b )成熟的标志 A.民间四言言诗 B.文人五言诗 C.爱情诗 D.抒情诗 10.汉末文人中,今存诗都是乐府诗,善用乐府旧题写时事,反映当时的社会现实,情感深沉,气韵沉雄,情调苍凉悲壮。他是( b ) A.蔡邕 B.曹操 C.曹植 D.王粲 11.“山不厌高,海不厌深。周公吐哺,天下归心。”这是( d )诗作中的句子。 A.李白《将进酒》 B.杜甫《登高》 C.陶渊明《饮酒》 D.曹操《短歌行》 12.鲁迅在《魏晋风度及文章与药及酒之关系》一文中称( a )为“改造文章的祖师”的人。 A.曹操 B.诸葛亮 C.嵇康 D.司马迁 13.曹操《短歌行》一诗的主旨是( d )

相关文档
最新文档