﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-TODD-随笔分类-other</title><link>http://www.blogjava.net/Todd/category/41701.html</link><description>point and net </description><language>zh-cn</language><lastBuildDate>Wed, 25 Nov 2009 18:42:27 GMT</lastBuildDate><pubDate>Wed, 25 Nov 2009 18:42:27 GMT</pubDate><ttl>60</ttl><item><title>jni 中要注意的问题</title><link>http://www.blogjava.net/Todd/archive/2009/11/24/303474.html</link><dc:creator>Todd</dc:creator><author>Todd</author><pubDate>Tue, 24 Nov 2009 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/Todd/archive/2009/11/24/303474.html</guid><wfw:comment>http://www.blogjava.net/Todd/comments/303474.html</wfw:comment><comments>http://www.blogjava.net/Todd/archive/2009/11/24/303474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Todd/comments/commentRss/303474.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Todd/services/trackbacks/303474.html</trackback:ping><description><![CDATA[<p>JNI 的类型和数据结构<br />
Java 类型 &nbsp;本地类型 &nbsp;说明 <br />
boolean &nbsp;jboolean &nbsp;无符号，8 位 <br />
byte&nbsp;&nbsp;&nbsp; &nbsp;jbyte &nbsp;无符号，8 位 <br />
char&nbsp;&nbsp;&nbsp; &nbsp;jchar &nbsp;无符号，16 位 <br />
short&nbsp;&nbsp; &nbsp;jshort &nbsp;有符号，16 位 <br />
int&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;jint &nbsp;有符号，32 位 <br />
long&nbsp;&nbsp;&nbsp; &nbsp;jlong &nbsp;有符号，64 位 <br />
float&nbsp;&nbsp; &nbsp;jfloat &nbsp;32 位 <br />
double&nbsp;&nbsp; &nbsp;jdouble &nbsp;64 位 <br />
void&nbsp;&nbsp;&nbsp; &nbsp;void &nbsp;N/A<br />
由于JVM中，使用统一的UTF-8编码，java传入的String参数，在c文件中被jni转换为jstring的数据类型，在c文件中声明char* psz，然后psz = (char*)(*env)-&gt;GetStringUTFChars(env, jstring, NULL);c++的操作简单些，env-&gt;GetStringUTFChars( jstring, NULL);注意使用完后，运行(*env)-&gt;ReleaseStringUTFChars(env, jstring, psz);<br />
将一个c的字符串转为jstring， <br />
static char lastfile[80];</p>
<p>&nbsp; JNIEXPORT jstring JNICALL Java_ReadFile_lastFile<br />
&nbsp;&nbsp;&nbsp; (JNIEnv *env, jobject jobj) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; return((*env)-&gt;NewStringUTF(env, lastfile));<br />
&nbsp; }<br />
例子<br />
JNIEXPORT jstring JNICALL<br />
Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt)<br />
{<br />
char buf[128];<br />
const jbyte *str;<br />
str = (*env)-&gt;GetStringUTFChars(env, prompt, NULL);<br />
if (str == NULL) {<br />
return NULL; /* OutOfMemoryError already thrown */<br />
}<br />
printf("%s", str);<br />
(*env)-&gt;ReleaseStringUTFChars(env, prompt, str);<br />
/* We assume here that the user does not type more than<br />
* 127 characters */<br />
scanf("%s", buf);<br />
return (*env)-&gt;NewStringUTF(env, buf);<br />
}<br />
如果使用Unicode编码，不需要使用UTF-8处理，使用如下方法<br />
JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile<br />
&nbsp;&nbsp;&nbsp; (JNIEnv * env, jobject jobj, jstring name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; caddr_t m;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jbyteArray jb;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct stat finfo;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jboolean iscopy;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const jchar *mfile = (*env)-&gt;GetStringChars(env, <br />
&nbsp;&nbsp;name, &amp;iscopy);<br />
&nbsp; //...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (*env)-&gt;ReleaseStringChars(env, name, mfile);<br />
传递Array<br />
boolean</p>
<p>&nbsp;public static void setArray( boolean[] ba )<br />
&nbsp; {<br />
&nbsp;&nbsp;&nbsp; for( int i=0; i &lt; ba.length; i++ )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ba[i] = true;<br />
&nbsp;&nbsp;&nbsp; setArray0( ba );<br />
&nbsp; }<br />
<br />
&nbsp; private static native void setArray0( boolean[] ba );</p>
<p>布尔型数组被初始化为 true，本地方法将把特定的元素设置为 false。同时，在 Java 源代码中，我们可以更改 main 以使其包含测试代码：</p>
<p>&nbsp;&nbsp;&nbsp; boolean[] ba = new boolean[5];<br />
&nbsp;&nbsp;&nbsp; MyNative.setArray( ba );<br />
&nbsp;&nbsp;&nbsp; for( int i=0; i &lt; ba.length; i++ )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( ba[i] );</p>
<p>在编译源代码并执行 javah 以后，MyNative.h 头文件包含以下的原型：</p>
<p>/*<br />
&nbsp;* Class:&nbsp;&nbsp;&nbsp;&nbsp; MyNative<br />
&nbsp;* Method:&nbsp;&nbsp;&nbsp; setArray0<br />
&nbsp;* Signature: ([Z)V<br />
&nbsp;*/<br />
JNIEXPORT void JNICALL Java_MyNative_setArray0<br />
&nbsp; (JNIEnv *, jclass, jbooleanArray);</p>
<p>布尔型数组是作为单个名为 jbooleanArray 的类型创建的。 <br />
基本类型有它们自已的数组类型，如 jintArray 和 jcharArray。 <br />
非基本类型的数组使用 jobjectArray 类型。下一个示例中包括一个 jobjectArray。这个布尔数组的数组元素是通过 JNI 方法 GetBooleanArrayElements 来访问的。 <br />
针对每种基本类型都有等价的方法。这个本地方法是如下实现的： </p>
<p>JNIEXPORT void JNICALL Java_MyNative_setArray0<br />
&nbsp; (JNIEnv *env, jclass cls, jbooleanArray ba)<br />
{<br />
&nbsp; jboolean* pba = (*env)-&gt;GetBooleanArrayElements( env, ba, 0 );<br />
&nbsp; jsize len = (*env)-&gt;GetArrayLength(env, ba);<br />
&nbsp; int i=0;<br />
&nbsp; // 更改偶数数组元素<br />
&nbsp; for( i=0; i &lt; len; i+=2 )<br />
&nbsp;&nbsp;&nbsp; pba[i] = JNI_FALSE;<br />
&nbsp; (*env)-&gt;ReleaseBooleanArrayElements( env, ba, pba, 0 );<br />
}</p>
<p>指向布尔型数组的指针可以使用 GetBooleanArrayElements 获得。 <br />
数组大小可以用 GetArrayLength 方法获得。使用 ReleaseBooleanArrayElements 方法释放数组。就可以读取和修改数组元素的值了。<br />
int 数组</p>
<p>class IntArray {<br />
&nbsp;&nbsp;&nbsp; private native int sumArray(int[] arr);<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IntArray p = new IntArray();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int arr[] = new int[10];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 10; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[i] = i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int sum = p.sumArray(arr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("sum = " + sum);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; static {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.loadLibrary("jnistudy");<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>jni的c程序</p>
<p>#include &lt;jni.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include "IntArray.h"</p>
<p>JNIEXPORT jint JNICALL <br />
Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)<br />
{<br />
&nbsp;&nbsp;&nbsp; jint *carr;<br />
&nbsp;&nbsp;&nbsp; jint i, sum = 0;<br />
&nbsp;&nbsp;&nbsp; carr = (*env)-&gt;GetIntArrayElements(env, arr, NULL);<br />
&nbsp;&nbsp;&nbsp; if (carr == NULL) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0; /* exception occurred */<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; for (i=0; i&lt;10; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum += carr[i];<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; (*env)-&gt;ReleaseIntArrayElements(env, arr, carr, 0);<br />
&nbsp;&nbsp;&nbsp; return sum;<br />
}<br />
</p>
<p>GetIntArrayRegion得到数组，ReleaseIntArrayElements释放资源，GetArrayLength得到数组的长度，SetIntArrayRegion修改数组元素的值。</p>
<p>多位int 数组<br />
<br />
class ObjectArrayTest {<br />
&nbsp;&nbsp;&nbsp; private static native int[][] initInt2DArray(int size);<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int[][] i2arr = initInt2DArray(3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 3; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; 3; j++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(" " + i2arr[i][j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; static {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.loadLibrary("jnistudy");<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>jni的代码<br />
#include &lt;jni.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include "ObjectArrayTest.h"</p>
<p>JNIEXPORT jobjectArray JNICALL<br />
Java_ObjectArrayTest_initInt2DArray(JNIEnv *env,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jclass cls,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jint size)<br />
{<br />
&nbsp;&nbsp;&nbsp; jobjectArray result;<br />
&nbsp;&nbsp;&nbsp; int i;<br />
&nbsp;&nbsp;&nbsp; jclass intArrCls = (*env)-&gt;FindClass(env, "[I");<br />
&nbsp;&nbsp;&nbsp; if (intArrCls == NULL) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return NULL; /* exception thrown */<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; result = (*env)-&gt;NewObjectArray(env, size, intArrCls, NULL);<br />
&nbsp;&nbsp;&nbsp; if (result == NULL) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return NULL; /* out of memory error thrown */<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; size; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jint tmp[256];&nbsp; /* make sure it is large enough! */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jintArray iarr = (*env)-&gt;NewIntArray(env, size);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (iarr == NULL) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return NULL; /* out of memory error thrown */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j = 0; j &lt; size; j++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp[j] = i + j;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (*env)-&gt;SetIntArrayRegion(env, iarr, 0, size, tmp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (*env)-&gt;SetObjectArrayElement(env, result, i, iarr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (*env)-&gt;DeleteLocalRef(env, iarr);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return result;<br />
}<br />
Get/SetObjectArrayElement得到和设置数组的元素的值。<br />
传递 Java String 数组 </p>
<p>本例将通过最常用的非基本类型，Java String，说明如何访问非基本对象的数组。字符串数组被传递给本地方法，而本地方法只是将它们显示到控制台上。 <br />
MyNative 类定义中添加了以下几个方法： </p>
<p>&nbsp; public static void showStrings( String[] sa )<br />
&nbsp; {<br />
&nbsp;&nbsp;&nbsp; showStrings0( sa );<br />
&nbsp; }<br />
&nbsp; private static void showStrings0( String[] sa );</p>
<p>测试<br />
&nbsp; String[] sa = new String[] { "Hello,", "world!", "JNI", "is", "fun." };<br />
&nbsp; MyNative.showStrings( sa );</p>
<p>c代码中，本地方法分别访问每个元素，</p>
<p>JNIEXPORT void JNICALL Java_MyNative_showStrings0<br />
&nbsp; (JNIEnv *env, jclass cls, jobjectArray sa)<br />
{<br />
&nbsp; int len = (*env)-&gt;GetArrayLength( env, sa );<br />
&nbsp; int i=0;<br />
&nbsp; for( i=0; i &lt; len; i++ )<br />
&nbsp; {<br />
&nbsp;&nbsp;&nbsp; jobject obj = (*env)-&gt;GetObjectArrayElement(env, sa, i);<br />
&nbsp;&nbsp;&nbsp; jstring str = (jstring)obj;<br />
&nbsp;&nbsp;&nbsp; const char* szStr = (*env)-&gt;GetStringUTFChars( env, str, 0 );<br />
&nbsp;&nbsp;&nbsp; printf( "%s ", szStr );<br />
&nbsp;&nbsp;&nbsp; (*env)-&gt;ReleaseStringUTFChars( env, str, szStr );<br />
&nbsp; }<br />
&nbsp; printf( "\n" );<br />
}</p>
<p>数组元素可以通过 GetObjectArrayElement 访问。 因为返回值是 jstring 类型，所以可以安全地将它从 jobject 类型转换为 jstring 类型。</p>
<p>返回 Java String 数组 <br />
在本地代码中创建一个字符串数组并将它返回给 Java 调用者。MyNative.java 中添加了以下几个方法：</p>
<p>&nbsp; public static String[] getStrings()<br />
&nbsp; {<br />
&nbsp;&nbsp;&nbsp; return getStrings0();<br />
&nbsp; }<br />
&nbsp; private static native String[] getStrings0();</p>
<p>使用showStrings 将 getStrings 的输出显示出来： </p>
<p>&nbsp; MyNative.showStrings( MyNative.getStrings() );</p>
<p>实现的本地方法返回五个字符串。</p>
<p>JNIEXPORT jobjectArray JNICALL Java_MyNative_getStrings0<br />
&nbsp; (JNIEnv *env, jclass cls)<br />
{<br />
&nbsp; jstring&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str;<br />
&nbsp; jobjectArray args = 0;<br />
&nbsp; jsize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; len = 5;<br />
&nbsp; char*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sa[] = { "Hello,", "world!", "JNI", "is", "fun" };<br />
&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=0;<br />
&nbsp; args = (*env)-&gt;NewObjectArray(env, len, (*env)-&gt;FindClass(env, "java/lang/String"), 0);<br />
&nbsp; for( i=0; i &lt; len; i++ )<br />
&nbsp; {<br />
&nbsp;&nbsp;&nbsp; str = (*env)-&gt;NewStringUTF( env, sa[i] );<br />
&nbsp;&nbsp;&nbsp; (*env)-&gt;SetObjectArrayElement(env, args, i, str);<br />
&nbsp; }<br />
&nbsp; return args;<br />
}</p>
<p>字符串数组是通过调用 NewObjectArray 创建的，同时传递了 String 类和数组长度两个参数。Java String 是使用 NewStringUTF 创建的。String 元素是使用 SetObjectArrayElement 存入数组中的。<br />
<br />
<br />
另外要通过jni来改变java的参数引用,例如有参数jbyteArray account，修改完account的值后，java要获取该值，直接使用<br />
jbyte* jbAccount = (env)-&gt;GetByteArrayElements(env, account, 0);<br />
&nbsp;char* szAccount = (char*)jbAccount;<br />
指针的地址并不是account的地址，最后赋下值才行<br />
env-&gt;SetByteArrayRegion(account,0,strlen(szAccount),jbyte* jbAccount);</p>
<img src ="http://www.blogjava.net/Todd/aggbug/303474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Todd/" target="_blank">Todd</a> 2009-11-24 15:03 <a href="http://www.blogjava.net/Todd/archive/2009/11/24/303474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用户IP地址的三个属性的区别(HTTP_X_FORWARDED_FOR,HTTP_VIA,REM_addr</title><link>http://www.blogjava.net/Todd/archive/2009/10/09/297590.html</link><dc:creator>Todd</dc:creator><author>Todd</author><pubDate>Fri, 09 Oct 2009 10:06:00 GMT</pubDate><guid>http://www.blogjava.net/Todd/archive/2009/10/09/297590.html</guid><wfw:comment>http://www.blogjava.net/Todd/comments/297590.html</wfw:comment><comments>http://www.blogjava.net/Todd/archive/2009/10/09/297590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Todd/comments/commentRss/297590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Todd/services/trackbacks/297590.html</trackback:ping><description><![CDATA[<p><strong>一、没有使用代理服务器的情况： </strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 您的 IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 没数值或不显示<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 没数值或不显示</p>
<p><strong>二、使用透明代理服务器的情况：Transparent Proxies </strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 最后一个代理服务器 IP <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 代理服务器 IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 您的真实 IP ，经过多个代理服务器时，这个值类似如下：203.98.182.163, 203.98.182.163, 203.129.72.215。</p>
<p>&nbsp;&nbsp; 这类代理服务器还是将您的信息转发给您的访问对象，无法达到隐藏真实身份的目的。</p>
<p><strong>三、使用普通匿名代理服务器的情况：Anonymous Proxies </strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 最后一个代理服务器 IP <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 代理服务器 IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 代理服务器 IP ，经过多个代理服务器时，这个值类似如下：203.98.182.163, 203.98.182.163, 203.129.72.215。</p>
<p>&nbsp;&nbsp; 隐藏了您的真实IP，但是向访问对象透露了您是使用代理服务器访问他们的。</p>
<p><strong>四、使用欺骗性代理服务器的情况：Distorting Proxies </strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 代理服务器 IP <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 代理服务器 IP <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 随机的 IP ，经过多个代理服务器时，这个值类似如下：203.98.182.163, 203.98.182.163, 203.129.72.215。</p>
<p>&nbsp;&nbsp; 告诉了访问对象您使用了代理服务器，但编造了一个虚假的随机IP代替您的真实IP欺骗它。</p>
<p><strong>五、使用高匿名代理服务器的情况：High Anonymity Proxies (Elite proxies) </strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 代理服务器 IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 没数值或不显示<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 没数值或不显示 ，经过多个代理服务器时，这个值类似如下：203.98.182.163, 203.98.182.163, 203.129.72.215。</p>
<p>&nbsp;&nbsp; 完全用代理服务器的信息替代了您的所有信息，就象您就是完全使用那台代理服务器直接访问对象。</p>
<img src ="http://www.blogjava.net/Todd/aggbug/297590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Todd/" target="_blank">Todd</a> 2009-10-09 18:06 <a href="http://www.blogjava.net/Todd/archive/2009/10/09/297590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>