Winpcap是windows平台下的一个专业Winpcap是一个强大的网络开发库,可以实现许多功能:获取可用的网络适配器;获取指定适配器信息(比如名称和描述信息);捕获指定网卡的数据封包;发送数据封包;过滤捕获的包以获取特定包等。
1. 到官网www.winpcap.org下载安装winpcap,为应用程序的运行做准备,如wireshark就需要先安装此包;
2.到www.winpcap.org/devel.html下载程序员开发包,解压后除了一些文档、example和demo,要用到的就是include和Lib文件夹;
3.打开vc6.0在project Settings中添加刚才include和Lib的路径(或者直接把第二部解压得到的.Lib和.h直接放到vc安装目录对应位置);
4.在Link选项卡加入wpcap.lib ws2_32.lib Packet.lib
5.在预定义宏添加WPCAP,HAVE_REMOTE或直接在pcap.h文件中加入
#define WPCAP
#define HAVE_REMOTE
在编译程序时出现wpdpack\include\pcap-stdinc.h(79) : error C2144: syntax error : missing ';' before type 'unsigned int' ,因为vc6.0版本太低,需要安装psdk。或者直接定位到错误处把_W64删除就ok了。
基于openswan klips的IPsec VPN实现分析之数据接收
转载请注明出处:http://blog.csdn.net/rosetta
接收数据解密和加密发送数据处理基本相似,无非就是逆过程。
Klips对接收数据的处理流程如下:
数据解密过程(以esp为例)
ipsec_rcv()
->ipsec_rcv_decap()
->ipsec_rcv_decap_once()//proto_funcs = esp_xform_funcs(当然这里还有ah,ipcomp对应的结构体指针赋值)
->proto_funcs->rcv_checks
->proto_funcs->rcv_setup_auth
->proto_funcs->rcv_decrypt
解完密后由 netif_rx(irs->skb);发送给上层协议栈处理。
下面详细分析数据接收并解密过程。
Ipsec_rcv()从物理网卡获取到数据包,这个处理函数是在ipsec_klips_init()中的openswan_inet_add_protocol()增加协议支持时注册的,首先判断skb是否有数据并确保skb是一份拷贝数据,然后判断是否是ESP包、AH包或者是COMP包,如果是则再判断物理网卡是否有对应的虚拟网卡绑定,然后走到ipsec_rcv_decap()。
在ipsec_rcv_decap()里依据ESP、AH或COMP选择对应的xform_functions结构体,此结构包含认证函数指针、解密函数指针。再进入ipsec_rcv_decap_once() proto_funcs->rcv_checks检查ESP包是否是4字节对齐(rfc24062.4节),接着判断是否存在有效的SA;proto_funcs->rcv_setup_auth设置哈希检验函数相关结构体;
proto_funcs->rcv_decrypt解密,解完密的数据再去查询SP,如果查找匹配的SP(eroute)就调用netif_rx()把数据包扔给上层协议栈处理。
在JNI原理及实现中,只是实现了一个Helloworld。
回忆一下JNI的实现步骤:
1.编写native声明的JAVA类;
2.使用javac命令编译所编写的java类;
3.使用Javah生成JNI头文件.h;
4.编写本地方法实现方法;
5.生成动态库;(如果方法实现是cpp写的话就一定要用g++来编译)
6.在java中调用。
下面的一个例子是C\C++与Java之间进行对象的操作。
1.创建Student类
/*
* FileName:Student.java
* Description:Class Student
* */
package pojo;
public class Student {
private int id;
private String name;
public Student(){}
public Student(int _id,String _name)
{
this.id=_id;
this.name=_name;
}
public void setId(int _id)
{
this.id=_id;
}
public void setName(String _name)
{
this.name=_name;
}
public int getId()
{
return id;
}
public String getName()
{
return name;
}
public String toString()
{
return "Name:"+name+" id:"+id;
}
}
2.创建主调类
/*
* FileName:JniMain.java
* Description:Main class
* */
package pojo;
public class JniMain {
static{
System.loadLibrary("studentbean");
}
public static native void sayHello();
public native int getId();
public native void setId(int i);
public native void setName(String _name);
public native Student getStudent();
public static void main(String[] args) {
// TODO Auto-generated method stub
JniMain test=new JniMain();
test.setId(101);
test.setName("Rose");
Student tmp=test.getStudent();
System.out.println("Id:"+tmp.getId());
System.out.println("Name:"+tmp.getName());
test.sayHello();
}
}
3.编译java,生成.h
sudo javac pojo/JniMain.java pojo/Student.java
javah -classpath . -jni pojo.JniMain
4.根据.h文件写函数实现
创建pojo_JniMain.cpp
#include"pojo_JniMain.h"
#include <iostream>
#include <stdio.h>
using namespace std;
int id=1;
jobject student;
jstring name;
JNIEXPORT void JNICALL Java_pojo_JniMain_sayHello
(JNIEnv *evn, jclass cla)
{
printf("shit~\n");
}
JNIEXPORT jint JNICALL Java_pojo_JniMain_getId
(JNIEnv *evn, jobject thiz)
{
return id;
}
JNIEXPORT void JNICALL Java_pojo_JniMain_setId
(JNIEnv *evn, jobject thiz, jint ji)
{
id=ji;
}
JNIEXPORT void JNICALL Java_pojo_JniMain_setName
(JNIEnv *env, jobject thiz, jstring _name)
{
//name=env->GetStringUTFChars(_name, 0);
jclass studentClass = env->FindClass("pojo/Student");
jmethodID studentMethod = env->GetMethodID(studentClass,"<init>","()V");
jfieldID mId = env->GetFieldID(studentClass,"id","I");
jfieldID mstudentName = env->GetFieldID(studentClass,"name","Ljava/lang/String;");
jobject studentObject = env->NewObject(studentClass,studentMethod);
env->SetObjectField(studentObject,mstudentName,_name);
env->SetIntField(studentObject,mId,id);
student = studentObject;
}
JNIEXPORT jobject JNICALL Java_pojo_JniMain_getStudent
(JNIEnv *env, jobject thiz)
{
return student;
}5.编译动态库
sudo g++ -shared -I /usr/local/lib/jdk1.6.0_29/include/ -I /usr/local/lib/jdk1.6.0_29/include/linux/ pojo_JniMain.cpp -o libstudentbean.so
6.运行
结果如下:
参考: Java JNI由浅入深(包括:Java和C++互传ArrayList泛型对象参数)-http://blog.csdn.net/u_xtian/article/details/6033963