用JNI实现实例:创建HelloWorld.javaclass HelloWorld{private native void print()public staticvoid main(String[] args){new HelloWorld().print()}static{System.loadLibrary("HelloWorld")}}注意print方法的声明,关键字native表明该方法是一个原生代码实现的。另外注意static代码段的System.loadLibrary
调用,这段代码表示在程序加载的时候,自动加载libHelloWorld.so库。编译HelloWorld.java在命令行中运行如下命令:javac HelloWorld.java在当前文件夹编译生成HelloWorld.class。生成HelloWorld.h在命令行中运行如下命令:javah -jni HelloWorld在当前文件夹中会生成HelloWorld.h。打开HelloWorld.h将会发现如下代码:/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class HelloWorld */#ifndef _Included_HelloWorld#define _Included_HelloWorld#ifdef __cplusplusextern "C" {#endif/* * Class: HelloWorld * Method:print * Signature: ()V */JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *, jobject)#ifdef __cplusplus}#endif#endif该文件中包含了一个函数Java_HelloWorld_print的声明。这里面包含两个参数,非常重要,后面讲实现的时候会讲到。实现HelloWorld.c创建HelloWorld.c文件输入如下的代码:#include <jni.h>#include <stdio.h>#include "HelloWorld.h"JNIEXPORT void JNICALLJava_HelloWorld_print(JNIEnv *env, jobject obj){printf("Hello World!\n")}注意必须要包含jni.h头文件,该文件中定义了JNI用到的各种类型,宏定义等。另外需要注意Java_HelloWorld_print的两个参数,本例比较简单,不需要用到这两个参数。但是这两个参数在JNI中非常重要。env代表java虚拟机环境,Java传过来的参数和c有很大的不同,需要调用JVM提供的接口来转换成C类型的,就是通过调用env方法来完成转换的。obj代表调用的对象,相当于c++的this。当c函数需要改变调用对象成员变量时,可以通过 *** 作这个对象来完成。编译生成libHelloWorld.so在Linux下执行如下命令来完成编译工作:cc -I/usr/lib/jvm/java-6-sun/include/linux/-I/usr/lib/jvm/java-6-sun/include/-fPIC -shared -o libHelloWorld.so HelloWorld.c在当前目录生成libHelloWorld.so。注意一定需要包含Java的include目录(请根据自己系统环境设定),因为Helloworld.c中包含了jni.h。另外一个值得注意的是在HelloWorld.java中我们LoadLibrary方法加载的是“HelloWorld”,可我们生成的Library却是libHelloWorld。这是Linux的链接规定的,一个库的必须要是:lib+库名+.so。链接的时候只需要提供库名就可以了。运行Java程序HelloWorld大功告成最后一步,验证前面的成果的时刻到了:java HelloWorld如果你这步发生问题,如果这步你收到java.lang.UnsatisfiedLinkError异常,可以通过如下方式指明共享库的路径:java -Djava.library.path='.' HelloWorld当然还有其他的方式可以指明路径请参考《在Linux平台下使用JNI》。我们可以看到久违的“Hello world!”输出了。在test.cpp中引用class1(如通过头文件)
Makefile
CC = gcc
CFLAGS = -Wall -Os
LDFLAGS = -llib1.so
all: test
test: test.cpp
$(CC) $(CFLAGS) $(LDFLAGS) $<-o $@
clean:
rm test
编译完成后用
ldd test就可以看到有没有连接成功
DDOS和CC攻击的区别
dos攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动攻击,从而成倍地提高拒绝服务攻击的威力。ddos的攻击方式有很多种,最基本的dos攻击就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应。
CC攻击模拟多个用户(多少线程就是多少用户)不停的进行访问(访问那些需要大量数据 *** 作,就是需要大量CPU时间的页面).这一点用一个一般的性能测试软件就可以做到大量模拟用户并发。CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃。
ddos攻击和cc攻击区别主要是针对对象的不同。DDoS是主要针对IP的攻击,而CC攻击的主要是网页。CC攻击相对来说,攻击的危害不是毁灭性的,但是持续时间长而ddos攻击就是流量攻击,这种攻击的危害性较大,通过向目标服务器发送大量数据包,耗尽其带宽,甚至影响整个机房网络,所以一般的云服务商都是会设置有DDos防御值,比如阿里云都是免费5G的防御值,超过了后会把IP拉入黑洞,由此可看DDoS的威力更大。
那么如何做好CC和DDoS的防御呢?
其中高防服务器和高防IP价格相对较贵,主机吧推荐使用高防CDN,比如百度云加速高防CDN,价格既便宜,防御又好,还可以加速,还有清晰的报表显示,非常不错。
百度云加速提供四到七层的DDoS攻击防护,包括CC、SYN flood、UDP flood等所有DDoS攻击方式, 通过分布式高性能防火墙+精准流量清洗+CC防御+WEB攻击拦截,组合过滤精确识别,有效防御各种类型攻击。相关链接
评论列表(0条)