公 告

欢迎各位网友添加友情链接,在您添加本博客:http://linux0818.blogspot.com/ 做为链接后, E-mail:linux0818@gmail.com给我,我将将您的网址添加到本博客。

2009年9月10日星期四

转载:Endianness一点通

原文:http://packetmania.bokee.com/

Endianness 的问题实质就是关于计算机如何存储大的数值的问题。

我们知道一个基本存储单元可以保存一个字节,每个存储单元对应一个地址。对于大于十进制255(16进制0xff)的整数,需要多个存储单元。例如,4660对应于0x1234,需要两个字节。不同的计算机系统使用不同的方法保存这两个字节。在我们常用的PC机中,低位的字节0x34保存在低地址的存储单元,高位的字节0x12保存在高地址的存储单元;而在Sun工作站中,情况恰恰相反,0x34位于高地址的存储单元,0x12位于低地址的存储单元。前一种就被称为Little Endian,后一种就是Big Endian。

如何记住这两种存储模式?其实很简单。首先记住我们所说的存储单元的地址总是由低到高排列。对于多字节的数值,如果先见到的是低位的字节,则系统就是Little Endian的,Little 就是"小,少"的意思,也就对应"低"。相反就是Big Endian,这里 Big "大"对应"高"。

为了加深对Endianness的理解,让我们来看下面的C程序例子:

 char a = 1;

char b = 2;
                                                  地址偏移量     内存映像

short c = 255; /* 0x00ff */          0x0000:          01 02 FF 00

 long d = 0x44332211;                 0x0004:          11 22 33 44

在右侧我们可以见到在基于Intel 80x86的系统上的内存映像,显然我们可以马上判定这一系统是Little Endian的。对于16位的整形数(short)c,我们先见到其低位的0xff,下一个才是0x00。同样对于32位长整形数(long)d,在最低的地址0x0004存的是最低位字节0x11。如果是在Big Endian的计算机中,则地址偏移量从0x0000到0x0007的整个内存映像将为:01 02 00 FF 44 33 22 11。

所有计算机处理器都必须在这两种Endian间作出选择。但某些处理器(如MIPS和IA-64)支持两种模式,可由编程者通过软件或硬件设置一种Endian。以下是一个处理器类型与对应的Endian的简表:

  • 纯Big Endian: Sun SPARC, Motorola 68000Java Virtual Machine
  • Bi-Endian, 运行Big Endian模式: MIPS运行IRIX, PA-RISC,大多数PowerPowerPC系统
  • Bi-Endian, 运行Little Endian模式: MIPS  运行Ultrix,大多数DEC Alpha, IA-64运行Linux
  • Little Endian: Intel x86AMD64,DEC VAX
     如何在程序中检测本系统的Endianess?可调用下面的函数来快速验证,如果返回值为1,则为Little Endian;为0则是Big Endian:
    int testendian() {
        int x = 1;
        return *((char *)&x);
    }

    Endianness对于网络通信也很重要。试想当Little Endian系统与Big Endian的系统通信时,如果不做适当处理,接收方与发送方对数据的解释将完全不一样。比如对以上C程序段中的变量d,Little Endian发送方发出11 22 33 44四个字节,Big Endian接收方将其转换为数值0x11223344。这与原始的数值大相径庭。为了解决这个问题,TCP/IP协议规定了专门的"网络字节次序",即无论计算机系统支持何种Endian,在传输数据时,总是数值最高位的字节最先发送。从定义可以看出,网络字节次序其实是对应Big Endian的。

    为了避免因为Endianness造成的通信问题,及便于软件开发者编写易于平台移植的程序,特别定义了一些C语言预处理的宏来实现网络字节与主机字节次序之间的相互转换。htons()和htonl()用来将主机字节次序转成网络字节次序,前者应用于16位无符号数,后者应用于32位无符号数。ntohs()和ntohl()实现反方向的转换。这四个宏的原型定义可参考如下(Linux系统中可在netinet/in.h文件里找到):

    #if defined(BIG_ENDIAN) && !defined(LITTLE_ENDIAN)  #define htons(A)  (A) #define htonl(A)  (A) #define ntohs(A)  (A) #define ntohl(A)  (A)  #elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)  #define htons(A)  ((((uint16)(A) & 0xff00) >> 8) | \                    (((uint16)(A) & 0x00ff) << 8)) #define htonl(A)  ((((uint32)(A) & 0xff000000) >> 24) | \                    (((uint32)(A) & 0x00ff0000) >> 8)  | \                    (((uint32)(A) & 0x0000ff00) << 8)  | \                    (((uint32)(A) & 0x000000ff) << 24)) #define ntohs     htons #define ntohl     htohl  #else  #error "Either BIG_ENDIAN or LITTLE_ENDIAN must be #defined, but not both."  
    
  • 2009年7月2日星期四

    #define宏的使用

    今天整理了一些#define的用法,与大家共享!

    1.简单的define定义

    #define MAXTIME 1000

    一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写

    if(i<MAXTIME){.........}

    编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。

    这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。

    2.define的“函数定义”

    define可以像函数那样接受一些参数,如下

    #define max(x,y) (x)>(y)?(x):(y);

    这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。

    但是这样做的话存在隐患,例子如下:
    #define Add(a,b) a+b;
    在一般使用的时候是没有问题的,但是如果遇到如:c * Add(a,b) * d的时候就会出现问题,代数式的本意是a+b然后去和c,d相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了
    c*a + b*d

    另外举一个例子:
    #define pin (int*);
    pin a,b;
    本意是a和b都是int型指针,但是实际上变成int* a,b;
    a是int型指针,而b是int型变量。
    这是应该使用typedef来代替define,这样a和b就都是int型指针了。

    所以我们在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号。

    3.宏的单行定义

    #define A(x) T_##x
    #define B(x) #@x
    #define C(x) #x

    我们假设:x=1,则有:

    A(1)------〉T_1
    B(1)------〉'1'
    C(1)------〉"1"

    (这里参考了 hustli的文章)

    3.define的多行定义

    define可以替代多行的代码,例如MFC中的宏定义(非常的经典,虽然让人看了恶心)

    #define MACRO(arg1, arg2) do { \
    /* declarations */ \
    stmt1; \
    stmt2; \
    /* ... */ \
    while(0)
     /* (no trailing ; ) */
    关键是要在每一个换行的时候加上一个"\"

    摘抄自http://www.blog.edu.cn/user1/16293/archives/2005/115370.shtml 修补了几个bug

    4.在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。

    就是:
    #ifdef WINDOWS
    ......
    ......

    2009年6月22日星期一

    HTTP Response中Transfer-Encoding的Chunked编码

    有时候,Web服务器生成HTTP Response是无法在Header就确定消息大小的,这时一般来说服务器将不会提供Content-Length的头信息,而采用Chunked编码动态的提供body内容的长度。

    进行Chunked编码传输的HTTP Response会在消息头部设置:

    Transfer-Encoding: chunked

    表示Content Body将用Chunked编码传输内容。

    Chunked编码使用若干个Chunk串连而成,由一个标明长度为0的chunk标示结束。每个Chunk分为头部和正文两部分,头部内容指定下一段正文的字符总数(十六进制的数字)和数量单位(一般不写),正文部分就是指定长度的实际内容,两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些附加的Header信息(通常可以直接忽略)。具体的Chunk编码格式如下:

      Chunked-Body = *chunk
             "0" CRLF
             footer
             CRLF 
      chunk = chunk-size [ chunk-ext ] CRLF
           chunk-data CRLF

      hex-no-zero = <HEX excluding "0">

      chunk-size = hex-no-zero *HEX
      chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-value ] )
      chunk-ext-name = token
      chunk-ext-val = token | quoted-string
      chunk-data = chunk-size(OCTET)

      footer = *entity-header

    RFC文档中的Chunked解码过程如下:
      
    length := 0
      read chunk-size, chunk-ext (if any) and CRLF
      while (chunk-size > 0) {
      read chunk-data and CRLF
      append chunk-data to entity-body
      length := length + chunk-size
      read chunk-size and CRLF
      }
      read entity-header
      while (entity-header not empty) {
      append entity-header to existing header fields
      read entity-header
      }
      Content-Length := length
      Remove "chunked" from Transfer-Encoding

    最后提供一段PHP版本的chunked解码代码:

    $chunk_size = (integer)hexdec(fgets$socket_fd, 4096 ) );
    while(!feof($socket_fd&& $chunk_size > 0) {
        $bodyContent .= fread$socket_fd, $chunk_size );
        fread$socket_fd, 2 ); // skip \r\n
        $chunk_size = (integer)hexdec(fgets$socket_fd, 4096
     ) );
    }

    源文地址:http://www.zeali.net/entry/129


    --
    /**************************************/
    Name: Xiong Feng
    E-mail:linux0818@gmail.com
    MSN:linux0818@hotmail.com
    QQ:23562033
    Address: GuangZhou.China
    /**************************************/

    2009年6月8日星期一

    WGet使用指南

    WGet使用指南

    wget是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理.

    所谓的自动下载是指,wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,这省去了极大的麻烦。

    wget可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作"递归下载"。在递归下载的时候,wget遵循Robot Exclusion标准(/robots.txt). wget可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。

    wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完 毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。

    wget的常见用法

    wget的使用格式

    Usage: wget [OPTION]... [URL]...
    • 用wget做站点镜像:
    wget -r -p -np -k http://dsec.pku.edu.cn/~usr_name/ # 或者 wget -m http://www.tldp.org/LDP/abs/html/
    • 在不稳定的网络上下载一个部分下载的文件,以及在空闲时段下载
    wget -t 0 -w 31 -c http://dsec.pku.edu.cn/BBC.avi -o down.log & # 或者从filelist读入要下载的文件列表 wget -t 0 -w 31 -c -B ftp://dsec.pku.edu.cn/linuxsoft -i filelist.txt -o down.log &

    上面的代码还可以用来在网络比较空闲的时段进行下载。我的用法是:在mozilla中将不方便当时下载的URL链接拷贝到内存中然后粘贴到文件filelist.txt中,在晚上要出去系统前执行上面代码的第二条。

    • 使用代理下载
    wget -Y on -p -k https://sourceforge.net/projects/wvware/

    代理可以在环境变量或wgetrc文件中设定

    # 在环境变量中设定代理 export PROXY=http://211.90.168.94:8080/ # 在~/.wgetrc中设定代理 http_proxy = http://proxy.yoyodyne.com:18023/ ftp_proxy = http://proxy.yoyodyne.com:18023/

    wget各种选项分类列表

    • 启动
    -V,  --version           显示wget的版本后退出 -h,  --help              打印语法帮助 -b,  --background        启动后转入后台执行 -e,  --execute=COMMAND   执行`.wgetrc'格式的命令,wgetrc格式参见/etc/wgetrc或~/.wgetrc
    • 记录和输入文件
    -o,  --output-file=FILE     把记录写到FILE文件中 
    -a,  --append-output=FILE   把记录追加到FILE文件中 
    -d,  --debug                打印调试输出 
    -q,  --quiet                安静模式(没有输出) 
    -v,  --verbose              冗长模式(这是缺省设置) 
    -nv, --non-verbose          关掉冗长模式,但不是安静模式 
    -i,  --input-file=FILE      下载在FILE文件中出现的URLs 
    -F,  --force-html           把输入文件当作HTML格式文件对待 
    -B,  --base=URL             将URL作为在-F -i参数指定的文件中出现的相对链接的前缀 
    --sslcertfile=FILE     可选客户端证书 
    --sslcertkey=KEYFILE   可选客户端证书的KEYFILE 
    --egd-file=FILE        指定EGD socket的文件名
    • 下载
    --bind-address=ADDRESS   指定本地使用地址(主机名或IP,当本地有多个IP或名字时使用) 
    -t,  --tries=NUMBER           设定最大尝试链接次数(0 表示无限制). 
    -O   --output-document=FILE   把文档写到FILE文件中 
    -nc, --no-clobber             不要覆盖存在的文件或使用.#前缀 
    -c,  --continue               接着下载没下载完的文件 
    --progress=TYPE          设定进程条标记 
    -N,  --timestamping           不要重新下载文件除非比本地文件新 
    -S,  --server-response        打印服务器的回应 
    --spider                 不下载任何东西 
    -T,  --timeout=SECONDS        设定响应超时的秒数 
    -w,  --wait=SECONDS           两次尝试之间间隔SECONDS秒 
    --waitretry=SECONDS      在重新链接之间等待1...SECONDS秒 
    --random-wait            在下载之间等待0...2*WAIT秒 
    -Y,  --proxy=on/off           打开或关闭代理 
    -Q,  --quota=NUMBER           设置下载的容量限制 
    --limit-rate=RATE        限定下载输率
    • 目录
    -nd  --no-directories            不创建目录 
    -x,  --force-directories         强制创建目录 
    -nH, --no-host-directories       不创建主机目录 
    -P,  --directory-prefix=PREFIX   将文件保存到目录 PREFIX/... 
    --cut-dirs=NUMBER           忽略 NUMBER层远程目录
    • HTTP 选项
    --http-user=USER      设定HTTP用户名为 USER. 
    --http-passwd=PASS    设定http密码为 PASS. 
    -C,  --cache=on/off        允许/不允许服务器端的数据缓存 (一般情况下允许). 
    -E,  --html-extension      将所有text/html文档以.html扩展名保存 
    --ignore-length       忽略 `Content-Length'头域 
    --header=STRING       在headers中插入字符串 STRING 
    --proxy-user=USER     设定代理的用户名为 USER 
    --proxy-passwd=PASS   设定代理的密码为 PASS 
    --referer=URL         在HTTP请求中包含 `Referer: URL'头 
    -s,  --save-headers        保存HTTP头到文件 
    -U,  --user-agent=AGENT    设定代理的名称为 AGENT而不是 Wget/VERSION. 
    --no-http-keep-alive  关闭 HTTP活动链接 (永远链接). 
    --cookies=off         不使用 cookies. 
    --load-cookies=FILE   在开始会话前从文件 FILE中加载cookie 
    --save-cookies=FILE   在会话结束后将 cookies保存到 FILE文件中
    • FTP 选项
    -nr, --dont-remove-listing   不移走 `.listing'文件 
    -g,  --glob=on/off           打开或关闭文件名的 globbing机制 
    --passive-ftp           使用被动传输模式 (缺省值). 
    --active-ftp            使用主动传输模式 
    --retr-symlinks         在递归的时候,将链接指向文件(而不是目录)
    • 递归下载
    -r,  --recursive          递归下载--慎用! 
    -l,  --level=NUMBER       最大递归深度 (inf 或 0 代表无穷). 
    --delete-after       在现在完毕后局部删除文件 
    -k,  --convert-links      转换非相对链接为相对链接 
    -K,  --backup-converted   在转换文件X之前,将之备份为 X.orig 
    -m,  --mirror             等价于 -r -N -l inf -nr. 
    -p,  --page-requisites    下载显示HTML文件的所有图片
    • 递归下载中的包含和不包含(accept/reject)
    -A,  --accept=LIST                分号分隔的被接受扩展名的列表 
    -R,  --reject=LIST                分号分隔的不被接受的扩展名的列表 
    -D,  --domains=LIST               分号分隔的被接受域的列表 
    --exclude-domains=LIST       分号分隔的不被接受的域的列表 
    --follow-ftp                 跟踪HTML文档中的FTP链接 
    --follow-tags=LIST           分号分隔的被跟踪的HTML标签的列表 
    -G,  --ignore-tags=LIST           分号分隔的被忽略的HTML标签的列表 
    -H,  --span-hosts                 当递归时转到外部主机 
    -L,  --relative                   仅仅跟踪相对链接 
    -I,  --include-directories=LIST   允许目录的列表 
    -X,  --exclude-directories=LIST   不被包含目录的列表 
    -np, --no-parent                  不要追溯到父目录



    --
    /**************************************/
    Name: Xiong Feng
    mailto:E-mail%3Alinux0818@gmail.com
    mailto:MSN%3Alinux0818@hotmail.com
    QQ:23562033
    Address: GuangZhou.China
    /**************************************/

    2009年6月1日星期一

    各门户网站Web Server分析

    最近在研究Http头部各参数协议,发现用httpfox抓www.google.cn的包时,在Response Header中的Server为GWS,呵呵,不知道这是个什么服务器,于是在google中搜了一下,居然还真有位老兄在研究这东东,真是佩服他,把那么多网站都列举出来了,下面转载他的文章,供我自己欣赏:

    google 招聘了不少原来工作于apache php开发团队的人才,把web服务也搞得有点花稍,版本众多,且能在一个域名下联合使用。他们认为对php和mysql的选用,对应的版本关系是非常重要的,这样才能发挥出最佳的性能,国内sina在内的门户网站可能由于历史原因,大量选用 apache_1.3.x + php4.3.x 等较老版本web服务软件,目前分析web服务主要选用的是apache;

    Google的入口使用的服务器是 GWS/2.1, 大家通常认为 GWS 是 Google Web Server的简称, 是 Google 家自制的 Web 服务器,但从版本号上看是不是和Apache2.1有某种联系呢?

    而Google另一个使用非常多的 Web 服务器则是 GFE/1.3 (难道是Apache1.3改的?因为这是一个较稳定的版本), 有人说, GFE 指的是 Google Front End。不知道 Google 是怎么做的: 让 http://www.google.com 使用 GWS 而同一个域名下的http://www.google.com/reader/lens/ 使用的却是 GFE ?

    当然, Google 也使用流行的 Apache, 甚至还使用到了 Mathopd!在 mail.google.com 这个域名下再次出现这种情况:mail.google.com 使用的是 GFE 而 mail.google.com/support/ 使用的却是 Mathopd.

    以下由lucene.com.cn系统分析小组整理了几个 Google 使用不同 Web Server 的服务:

    可能还有很多, 从这里可看出, Google 对 Web Server 所积累的核心能力.

    国内其它公司使用web server情况:

    hi.baidu.com反馈的信息提示使用了apache 1.2:

    HTTP/1.1 200 OK
    Date: Mon, 12 Mar 2007 19:16:06 GMT
    Server: apache 1.2.0.0
    Content-Type: text/html
    Content-Encoding: gzip
    Content-Length: 364

    sogou.com反馈的信息提示使用了apache 2.0.59!
    HTTP/1.1 200 OK
    Date: Mon, 12 Mar 2007 19:18:20 GMT
    Server: Apache/2.2.0 (Unix)
    P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
    set-cookie: IPLOC=CN1100;expires=Tue, 11-Mar-2008 19:18:20 GMT;path=/;domain=.sogou.com
    Last-Modified: Wed, 12 Jul 2006 05:57:41 GMT
    ETag: "44b9-0-2012bf40"
    Accept-Ranges: bytes
    Content-Length: 0
    Connection: close
    Content-Type: image/gif

    so.163.com 网易也是google 合作伙伴,其将搜索结果用php来调用,显示Apache为2.0.54 
    HTTP/1.1 200 OK
    Date: Mon, 12 Mar 2007 19:49:40 GMT
    Server: Apache/2.0.54 (Unix) PHP/4.4.1
    X-Powered-By: PHP/4.4.1
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Content-Encoding: gzip
    Vary: Accept-Encoding
    Content-Length: 6599
    Connection: close
    Content-Type: text/html; charset=gb2312

    soso.com 使用apache,其中qq.com还使用了squid/2.6 ;
    HTTP/1.1 200 OK
    Via: 1.0 rainny.qq.com:80 (squid/2.6.STABLE5), 1.0 BJDC01
    Connection: close
    Proxy-Connection: close
    Age: 1
    Expires: Tue, 13 Mar 2007 01:58:25 GMT
    Date: Tue, 13 Mar 2007 01:56:25 GMT
    Content-Type: text/html; charset=GB2312
    Server: Apache
    Accept-Ranges: bytes
    Cache-Control: max-age=120
    Vary: Accept-Encoding
    X-Cache: HIT from rainny.qq.com

    google旗下ganji.com反馈的信息提示使用了 Apache/2.0.55估计对应mysql为-5.0.18
    Content-Type: text/html
    Server: Apache/2.0.55 (Unix)
    Set-Cookie: PHPSESSID=b206ee8aa26309c7c3515899daf78c4e; path=/
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Keep-Alive: timeout=15, max=500

    顺便转载一下
    分析的网站数量:194个,可能有重复的,其中比例
             Apache:97,比例 59%
             Microsoft IIS:51,比例 31%
             Other:16,比例 10%
               看来IIS还是老当益壮,加上现在的.net平台,还是占有相当大的比例的,Apache不愧当大的地位,其它的服务器也有不少。
    有意思的是google全部使用自己的服务器GWS(Google Web Server),而baidu也来了个BWS(Baidu Web Server),但是他的网页以外的
    服务仍然使用Apache,相比之下还是差了一些。据说baidu以前www.baidu.com都是用apache,现在也算有些进步了。
              从行业来看,银行网站不少用的是IBM_HTTP_SERVER,实际上还是Apache,看来IBM做行业解决解决方案还是不错的。门户网站,例如sina,sohu之类都是apache,看来在性能、数据高速缓冲方面apache还是经得起考验的。对于不少企业、个人的网站IIS还是比较多。有的网站就分析不出来了,例如yahoo、3721系的估计是yahoo自己的,看不出来。

    www.google.com                 GWS/2.1
    gmail.google.com               GFE/1.3
    www.lucene.com.cn            Apache/1.3.29(Unix)
    www.sina.com                   Apache/2.0.54 (Unix)
    www.sohu.com                   Apache/1.3.37 (Unix) mod_gzip/1.3.26.1a
    www.163.com                    Apache/2.0.59 (Unix)
    www.263.com                    Apache/2.0.54 (Unix) PHP/4.3.9
    www.126.com                    Apache
    www.cctv.com                   Sun-ONE-Web-Server/6.1
    www.qq.com                     Apache
    www.tom.com                    Apache/1.3.34 (Debian) PHP/5.1.2-1
    www.hao123.com                 Apache/2.0.58 (Unix) PHP/4.4.2
    www.3158.cn                    Microsoft-IIS/6.0
    www.sina.com.cn                Apache/2.0.54 (Unix)
    www.baidu.com                  BWS/1.0
    geci.baidu.com                 apache 1.6.2.0/httpd 1.3.27 (Unix) BAIDU_UENCO
    image.baidu.com                apache 1.7.2.0/httpd 1.3.27 (Unix) BAIDU_UENCO
    zhidao.baidu.com               apache 1.0.10.0
    dict.baidu.com                 Apache/2.0.55 (Unix) PHP/4.3.11
    file.baidu.com                 Apache/2.0.55 (Unix) PHP/4.3.11
    baike.baidu.com                apache 1.0.2.0
    video.baidu.com                apache 1.0.1.0/httpd 1.3.27 (Unix) mod_gzip/1.
    mail.163.com                   Apache
    sz.gd.vnet.cn                  Apache/2.0.40 (Red Hat Linux)
    www.online.sh.cn               Apache/1.3.26 (Unix)
    www.ourgame.com                Microsoft-IIS/5.0
    www.taobao.com                 Apache
    www.sohu.com                   Apache/1.3.37 (Unix) mod_gzip/1.3.26.1a
    www.google.cn                  GWS/2.1
    www.21cn.com                   Apache
    www.phoenixtv.com              Apache/2.2.3 (Unix)
    www.gznet.com                  Apache/2.0.49 (Unix)
    www.wuhan.net.cn               Netscape-Enterprise/4.0
    www.jrj.com.cn                 Microsoft-IIS/6.0
    hi.baidu.com                   apache 1.1.9.0
    www.avl.com.cn                 Apache/2.0.53 (Unix)
    www.163.com                    Apache/2.0.59 (Unix)
    mail.sina.com.cn               Apache/2.0.59 (FreeBSD) PHP/5.2.0 with Suhosin
    www.xinhuanet.com              BIG-IP
    www.zhcw.com                   Apache/2.0.55 (Unix) DAV/2
    Err:www.hunantv.com,Connection timed out: connect
    www.qq.com                     Apache
    cn.msn.com                     Microsoft-IIS/6.0
    www.people.com.cn              Apache/1.3.27 (Unix) mod_perl/1.25
    www.china.com                  Apache
    www.chinaren.com               Apache/1.3.37 (Unix) mod_gzip/1.3.26.1a
    www.ctrip.com                  Microsoft-IIS/6.0
    house.focus.cn                 Apache/1.3.34 (Unix)
    www.cmbchina.com               Microsoft-IIS/6.0
    www.qq163.com                  Microsoft-IIS/5.0
    www.tom.com                    Apache/1.3.34 (Debian) PHP/5.1.2-1
    www.chinamobile.com            Microsoft-IIS/6.0
    www.chinanews.com.cn           Apache/1.3.36 (Unix)
    www.pconline.com.cn            Apache/2.2.3 (Unix) PHP/4.4.5
    www.5460.net                   Apache-Coyote/1.1
    www.rising.com.cn              Microsoft-IIS/6.0
    www.51.com                     Apache
    www.3533.com                   Microsoft-IIS/5.0
    www.icbc.com.cn                Microsoft-IIS/5.0
    www.matesay.cn                 Microsoft-IIS/6.0
    www.qunar.com                  Apache/2.2.3 (Unix) mod_jk/1.2.18
    www.skycn.com                  Apache
    www.duba.net                   Apache/2.0.54
    www.cmfu.com                   Microsoft-IIS/6.0
    www.rongshuxia.com             Apache/1.3.33 (Unix)
    www.readnovel.com              Apache/2.0.54 (Debian GNU/Linux) PHP/4.3.10-18
    www.xxsy.net                   Microsoft-IIS/6.0
    www.hongxiu.com                Microsoft-IIS/6.0
    hjsm.tom.com                   Apache/1.3.34 (Debian) PHP/5.1.4-0.1
    www.17173.com                  Apache/2.0.54 (Unix)
    games.sina.com.cn              Apache/2.0.54 (Unix)
    www.pcgames.com.cn             thttpd
    www.4399.net                   Microsoft-IIS/6.0
    www.chinagames.net             Microsoft-IIS/6.0
    www.skycn.com                  Apache
    www.onlinedown.net             Microsoft-IIS/5.0
    Err:www.crsky.com,www.crsky.com
    download.zol.com.cn            Apache
    tech.sina.com.cn               Apache/2.0.59 (Unix)
    www.pconline.com.cn            Apache/2.2.3 (Unix) PHP/4.4.5
    military.china.com             Apache
    jczs.news.sina.com.cn          Apache/2.0.58 (Unix)
    www.xinhuanet.com              BIG-IP
    www.tiexue.net                 Microsoft-IIS/6.0
    mil.qianlong.com               Microsoft-IIS/5.0
    www.13139.com                  netapp 5.2
    www.yymp3.com                  Microsoft-IIS/6.0
    mp3.baidu.com                  apache 1.6.2.0/httpd 1.3.27 (Unix) BAIDU_UENCO
    mail.tom.com                   Apache/1.3.31 (Unix)
    www.126.com                    Apache
    www.hotmail.com                Microsoft-IIS/6.0
    www.yoqoo.com                  Apache
    www.ku6.com                    KWS/www.ku6.com (Unix)
    www.155.com                    Apache/2.0.54 (Win32)
    www.openv.tv                   Apache
    www.56.com                     web server.56
    www.flash8.net                 Microsoft-IIS/6.0
    www.f130.net                   Microsoft-IIS/6.0
    www.3839.com                   Apache
    www.xiaoyouxi.com              Microsoft-IIS/6.0
    news.sina.com.cn               Apache/2.0.58 (Unix)
    news.sohu.com                  Apache/1.3.37 (Unix) mod_gzip/1.3.26.1a
    www.zaobao.com                 Apache
    news.baidu.com                 apache2.0.12.0/1.3.27 (Unix) MOD_NEWSREWRITE v
    www.cyol.net                   Apache/2.2.3 (Unix)
    post.baidu.com                 apache 2.7.0.1/httpd 1.3.27 (Unix) mod_forum/1
    www.tianya.cn                  Microsoft-IIS/5.0
    pop.pcpop.com                  Microsoft-IIS/6.0
    club.sohu.com                  Apache/2.0.55 (Unix) PHP/5.1.6
    www.xici.net                   Microsoft-IIS/6.0
    www.eastmoney.com              Microsoft-IIS/6.0
    www.stockstar.com              Microsoft-IIS/6.0
    business.sohu.com              Apache/1.3.37 (Unix) mod_gzip/1.3.26.1a
    www.hexun.com                  Microsoft-IIS/6.0
    finance.sina.com.cn            Apache/2.0.58 (Unix)
    www.cnfol.com                  Apache
    www.love21cn.com               Apache/2.2.4 (Unix) PHP/4.4.4
    love21cn.msn.com.cn            Apache/2.2.4 (Unix) PHP/4.4.4
    www.caiku.com                  Microsoft-IIS/6.0
    www.u688.com                   Microsoft-IIS/5.0
    www.sg.com.cn                  Microsoft-IIS/5.0
    tech.sina.com.cn               Apache/2.0.59 (Unix)
    www.younet.com                 Apache/1.3.29 (Unix) PHP/4.3.4
    www.imobile.com.cn             squid/2.5.STABLE14
    mobile.zol.com.cn              Apache
    www.dagamer.com                Apache/1.3.33 (Unix) PHP/4.3.11
    www.51job.com                  Apache/1.3.37 (Unix)
    www.1010job.com                Microsoft-IIS/6.0
    www.zhaopin.com                Apache/1.3.37 (Unix)
    www.cjol.com                   Microsoft-IIS/6.0
    www.pcauto.com.cn              thttpd
    www.xcar.com.cn                Apache/2.0.59 (Unix) DAV/2 PHP/4.4.2
    auto.sina.com.cn               Apache/2.0.58 (Unix)
    www.autohome.com.cn            Microsoft-IIS/6.0
    www.cheshi.com.cn              Microsoft-IIS/6.0
    www.cca.org.cn                 Microsoft-IIS/6.0
    cartoon.msn.com.cn             Microsoft-IIS/6.0
    www.dianping.com               Microsoft-IIS/6.0
    www.virtualshoemuseum.com Microsoft-IIS/5.0
    www.yanzi.com.tw               Apache/1.3.27 (Unix) PHP/4.3.3 mod_ssl/2.8.12
    www.39.net                     Microsoft-IIS/6.0
    www.xyxy.net                   Microsoft-IIS/5.0
    health.sohu.com                Apache/1.3.37 (Unix) mod_gzip/1.3.26.1a
    www.91.cn                      Microsoft-IIS/6.0
    www.sogou.com                  Apache/2.0.55 (Unix)
    www.motorola.com.cn            Microsoft-IIS/6.0
    www.samsung.com.cn             Microsoft-IIS/6.0
    www.sonyericsson.com.cn        Apache
    www.dopod.com                  Apache/2.0.54 (Unix) DAV/2 PHP/4.3.7
    www.lenovomobile.com           Microsoft-IIS/6.0
    spaces.live.com                Microsoft-IIS/6.0
    www.bokee.com                  Apache/1.3.31 (Unix) mod_gzip/1.3.26.1a
    blog.sina.com.cn               Apache/1.3.37 (Unix)
    qzone.qq.com                   Apache
    www.abchina.com                IBM_HTTP_Server/2.0.47.1 Apache/2.0.47 (Unix)
    www.ccb.com                    Apache/2.0.58 (Unix)
    www.boc.cn                     IBM_HTTP_SERVER/1.3.26       Apache/1.3.26 (Unix)
    www.gdb.com.cn                 IBM_HTTP_SERVER/1.3.28       Apache/1.3.28 (Unix)
    www.bankcomm.com               IBM_HTTP_SERVER/1.3.28.1       Apache/1.3.28 (Unix)
    sports.sina.com.cn             Apache/2.0.59 (Unix)
    sports.cctv.com                Sun-ONE-Web-Server/6.1
    sports.sohu.com                Apache/1.3.37 (Unix) mod_gzip/1.3.26.1a
    sports.tom.com                 Apache/2.2.0 (Unix) DAV/2 PHP/5.1.2
    www.espnstar.com.cn            Microsoft-IIS/6.0
    china.nba.com                  Apache/1.3.34 (Debian) mod_layout/3.2.1
    www.no5.com.cn                 Microsoft-IIS/6.0


    地址:http://www.bfor.cn/fish/archive/139045.aspx


    --
    /**************************************/
    Name: Xiong Feng
    E-mail:linux0818@gmail.com
    MSN:linux0818@hotmail.com
    QQ:23562033
    Address: GuangZhou.China
    /**************************************/

    2009年4月9日星期四

    Wireshark抓包实现IP电话的窃听
     
    一、首先来看Wireshark

      

    怎么样打开软件就不用介绍了,点开Capture,选择一个有流量的接口(有可能你有两个网卡——现在的笔记本一般都自带一个无线一个有线来着),然后点Start。至于Option什么的不是本文重点,不表。



    图(1)


    图(2)
      这个时候我们打开NetMeeting软件,开始打电话——至于Netmeeting里面网守或者网关的配置这里不做详细说明,想知道的话可以留言我发新贴。


    图(3)
      通过下面这张图片,我们看到H.225协议相关的交互。——Display Filter的定义就是h225,h245,和rtp即可。


    图(4)
      下面我们打开Stacistics -> VoIP Calls页面,可以看到我们刚才产生的呼叫的详细信息。


    图(5)


    图(6)
      我们打开Graph,可以看到整个呼叫的信令流程,简直和教材上面的一模一样啊…… 单击某个信令,还可以定位该报文在什么位置。



    图(7)


    图(8)
      另外说明一点,在Wireshark里面,对filter的定义比较灵活,而且处理的速度也比较快,它分为两种,一种是用来捕获的filter,另外
    一种是用来显示的filter,显示就是说你抓出这么多包来,查找起来不容易,所以你就需要自己写一个filter来,只把要看的东西显示出来。

    二、刚才抓的包如何处理才能达到偷听的效果呢?
      首先需要一个叫做RTP2WAVE的小工具,然后将刚才抓下的报文保存为pcap文件,放在r2w的安装目录下,如图所示。

    图(9)

    运行工具,提示完成转换以后,会在该目录下发现两个wav文件,一个是你说的,一个是对方给你说的——电话是两个方向嘛……

    图(10)


    图(11)

      正常情况下我们的做法是:首先在交换机相应接口上做端口镜像,然后启动邪恶而强大的抓包软件,再然后……灭活活活活活活……

    本文转载:http://hi.baidu.com/tuyah/blog/item/21d1d9dc234946a4cc116658.html

    2009年3月25日星期三

    OpenSource之进程编程中僵尸进程的产生及防范

    今天在做一个监视程序:创建一个进程,在父进程中死循环的监视着多个事件,而在子进程中只是打开一个输入、输出、错误的句柄后就退出了。呵呵,程序运行后,用ps -aux查看,居然出现好几个僵尸进程。后来打开程序一看,竟然发现子进程退出后,父进程没有给进程收尸。我们再看看下面这段话,会让我们更好的理解僵尸进程的产生及防范:

    在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD 信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill-9也 不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负 责清理僵尸进程。

    怎样来清除僵尸进程:
    1.改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,尽管对的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。
    2.把父进程杀掉。父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
    3.调用fork两次。

    从上面两段话,我们基本上能明白了僵尸进程的产生及消除了,下面我们来模拟一下僵尸进程的产生:
    代码如下:
    #include <sys/types.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>

    int main(int argc, char **argv)
    {
    if (0 == fork()) {
    printf("In the child process:%d\n", getpid());
    } else {
    printf("In the parent process:%d\n", getpid());
    sleep(10);
    exit(0);
    }
    printf("Pid:%d\n", getpid());
    return 0;
    }

    运行结果:
    In the child process:3682
    Pid:3682
    In the parent process:3681

    在程序没有结束之前,我们可以开另一个终端运行ps -aux命令查看,我们可以发现在该程序的旁边还会产生一个其STAT为Z+的僵尸进程,这就是在父进程没有结束之前,子进程已经结束了,且父进程没有回收子进程就会产生僵尸进程了。
    下面我们看看父进程怎么接收子进程,即在上面的情况下怎么消除僵尸进程:
    代码如下:
    #include <sys/types.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include<sys/wait.h>

    void proc_child(int SIGNO)
    {
    int pid = -1;
    int stat;
    pid = waitpid(-1, &stat, WNOHANG);
    }

    int main(int argc, char **argv)
    {
    signal(SIGCHLD, proc_child);
    if (0 == fork()) {
    printf("In the child process:%d\n", getpid());
    } else {
    printf("In the parent process:%d\n", getpid());
    sleep(10);
    exit(0);
    }
    printf("Pid:%d\n", getpid());
    return 0;
    }

    运行结果:
    In the child process:3682
    Pid:3682
    In the parent process:3681

    从上面的代码中看出就前一份代码多了一个signal()函数,signal()调用proc_child()函数就是为了等待子进程结束后发送SIGCHLD给父进程,并接收。这采用的是第1种方法。当然,还有这种方法:
    代码如下:
    int main(int argc, char **argv)
    {
    signal(SIGCHLD, SIG_IGN); //加入此句即可,忽略SIGCHLD信号
    if (0 == fork()) {
    printf("In the child process:%d\n", getpid());
    } else {
    printf("In the parent process:%d\n", getpid());
    sleep(10);
    exit(0);
    }
    printf("Pid:%d\n", getpid());
    return 0;
    }

    网上有网友做过测试,有下面的说法:
    在比较繁忙的应用中使用WAIT也无法解决僵尸进程。以前有经历在涉及数据库的程序中,当数据库异常时会出现不正常的僵尸进程,而程序中实际上已经使用了wait命令,并且捕捉了SIGCLD信号。系统很忙时估计SIGCLD信号传递不正常。



    --
    /**************************************/
    Name: Xiong Feng
    E-mail:linux0818@gmail.com
    MSN:linux0818@hotmail.com
    QQ:23562033
    Address: GuangZhou.China
    /**************************************/

    2009年3月24日星期二

    OpenSource之在C语言中获得调用系统命令后输出的参数

    众所周知,在C语言中调用system()函数是不能够得到shell命令的输出的,但有时在C语言中需要得到系统的命令的输出信息,该怎么办?别急,我们来看看popen()函数,这个函数可以让我们得到想要的信息。

    #include <stdio.h>

    FILE *popen(const char *command, const char *type);

    int pclose(FILE *stream);

    描述

    popen() 函数 用 创建管道 的 方式 启动 一个 进程, 并调用 shell. 因为 管道 是被定义成 单向的, 所以 type 参数 只能 定义成 只读 或者 只写, 不能是 两者同时, 结果流 也相应的 是 只读 或者 只写.

    command 参数 是 一个 字符串指针, 指向的 是 一个 以 null 结束符 结尾的字符串, 这个 字符串 包含 一个 shell 命令. 这个命令 被送到 /bin/sh-c 参数 执行, 即由 shell 来执行. type 参数 也是 一个 指向 以 null 结束符 结尾的 字符串的指针, 这个字符串 必须是 'r' 或者 'w’ 来指明 是 读还是写.

    popen() 函数 的 返回值 是 一个 普通的 标准I/O流, 它只能用 pclose() 函数 来关闭, 而不是 fclose(). 函数. 向 这个流 的 写入 被转化为 对 command 命令的 标准输入; 而 command 命令的 标准输出 则是和 调用 popen(), 函数 的 进程 相同,除非 这个 被command命令 自己 改变. 相反的, 读取 一个 “被popen了的” 流, 就相当于 读取 command 命令的 标准输出, 而 command 的 标准输入 则是和 调用 popen, 函数的 进程 相同.

    注意, popen 函数的 输出流 默认是 被全缓冲的.

    pclose 函数 等待 相关的进程 结束 并返回 一个 command 命令的 退出状态, 就像 wait4 函数 一样


    举例如下:

    #include <stdio.h>

    void command_mess(char *command, char *buf, int length)
    {
        FILE   *stream;

        stream = popen(command,"r");
        fread( buf, sizeof(char), length,  stream);
        pclose( stream );
        return;
    }

    int main( void )
    {
        char buf[4096] = "";  //请注意系统命令要输出的数据大小,小心得到的数据不全哦
        char com[64] = "ls -l";
        command_mess(com, buf, sizeof(buf));
        printf("Message:\n%s",buf);
        return 0;
    }

    运行结果:

    -------------------------------------------------------------------------------

    Message:
    总计 616
    -rw-r--r-- 1 root root    186 12-05 16:14 advertise
    -rw-r--r-- 1 root root   1432 11-28 00:39 agent.c
    -rwxr-xr-x 1 root root   9593 03-24 18:21 a.out
    -rw-r--r-- 1 root root    307 02-06 14:32 array.c
    -rw-r--r-- 1 root root    120 11-16 00:01 asi.c
    -rw-r--r-- 1 root root    675 12-01 12:11 compareagent.c
    -rw-r--r-- 1 root root    570 01-18 13:21 ethfile
    -rw-r--r-- 1 root root   1223 03-23 17:33 getmac.c
    -rw-r--r-- 1 root root   1200 03-23 17:32 getmac.c~
    -rw-r--r-- 1 root root    203 11-14 00:24 ifelse.c
    -rw-r--r-- 1 root root     46 03-23 18:38 info
    -rw-r--r-- 1 root root   1856 01-17 17:07 mac.c
    -rw-r--r-- 1 root root   3587 01-17 16:07 mac.c~
    -rw-r--r-- 1 root root   1049 03-16 11:53 meminfo.c
    -rw-r--r-- 1 root root    830 03-16 09:44 meminfo.c~
    drwxr-xr-x 2 root root   4096 01-05 15:53 mingetty-1.07.orig
    -rw-r--r-- 1 root root   2277 01-17 16:37 mymac.c
    -rw-r--r-- 1 root root    995 01-18 17:05 netaddress.c
    -rw-r--r-- 1 root root    624 03-23 17:08 netcardcount.c
    -rw-r--r-- 1 root root    939 03-23 17:05 netcardcount.c~
    -rw-r--r-- 1 root root   1291 02-13 17:27 newt.c
    -rw-r--r-- 1 root root   1152 12-05 17:09 parse.c
    -rw-r--r-- 1 root root   1306 12-03 12:07 parse.c~
    -rw-r--r-- 1 root root   2774 01-18 13:27 parseeth.c
    -rw-r--r-- 1 root root   1649 01-09 16:17 parseeth.c~
    -rw-r--r-- 1 root root    361 03-24 18:21 popen1.c
    -rw-r--r-- 1 root root    880 03-24 17:37 popen.c
    -rw-r--r-- 1 root root   1942 12-18 19:03 regular_expression.c
    -rw-r--r-- 1 root root   1357 12-18 18:23 regular_expression.c~
    -rw-r--r-- 1 root root    765 12-17 16:06 select.c
    -rw-r--r-- 1 root root    596 12-17 16:02 select.c~
    -rw-r--r-- 1 root root 189715 02-13 17:21 slang-1.4.5-2.i386.rpm
    -rw-r--r-- 1 root root    168 02-05 17:49 sprintf.c
    -rw-r--r-- 1 root root   2033 12-05 16:15 squid.conf
    -rw-r--r-- 1 root root    169 01-17 14:10 system.c
    -rw-r--r-- 1 root root   8694 03-20 17:09 test
    -rw-r--r-- 1 root root    100 12-31 18:07 test.c
    -rwxr-xr-x 1 root root 206454 03-21 11:08 top
    -rw-r--r-- 1 root root   2101 03-20 15:34 top.c
    -rw-r--r-- 1 root root   3458 03-20 15:34 top.c~
    -rw-r--r-- 1 root root   1552 01-05 16:39 uname.c
    -rw-r--r-- 1 root root   1289 01-05 16:12 uname.c~
    -rw-r--r-- 1 root root   4174 03-23 18:36 write.c
    -rw-r--r-- 1 root root   4109 03-23 18:34 write.c~
    -rw-r--r-- 1 root root   1886 01-14 20:24 x.c
    -rw-r--r-- 1 root root   1886 01-14 20:24 x.c~
    -rwxr-xr-x 1 root root     37 12-31 18:07 xx.sh
    -rw-r--r-- 1 root root   1817 01-14 20:24 y.c
    -rw-r--r-- 1 root root   1772 01-14 20:22 y.c~
    -rw-r--r-- 1 root root    141 03-24 18:19 z.c

    -------------------------------------------------------------------------------

    很简单的一个函数就可以实现我们想要的功能了,呵呵!

    --

    /**************************************/
    Name: Xiong Feng
    E-mail:linux0818@gmail.com
    MSN:linux0818@hotmail.com
    QQ:23562033
    Address: GuangZhou.China
    /**************************************/