智能DNS配置过程

注:对于配置智能DNS,主要用途为:1、解决网通与电信问题 2、实现区域规划(不同区域访问各自最近的服务器),下面以解决网通与电信连接问题的配置。至于实现2的功能,只需稍加更改即可。
一、DNS服务器安装......................................................................................... 1
二、named.conf的配置....................................................................................... 2
三、更新根区文件:.......................................................................................... 3
四、建立启动脚本:.......................................................................................... 4
五、添加一个NS............................................................................................... 5
六、添加一个域名.............................................................................................. 5
附:获取IP地址范围方法:................................................................................. 7
一、DNS服务器安装
1、 软件列表
BIND 9.3.2
ftp://ftp.isc.org/isc/bind9/9.3.2/bind-9.3.2.tar.gz
ftp://ftp.isc.org/isc/bind9/9.4.0a6/bind-9.4.0a6.tar.gz
2、 安装BIND 9
安装BIND9:
# tar zxvf bind-9.3.2.tar.gz
# cd bind-9.3.2
# ./configure --prefix=/usr/local/named --disable-ipv6
# make && make install
建立BIND用户:
# groupadd bind
# useradd -g bind -d /usr/local/named -s /sbin/nologin bind
创建配置文件目录:
# mkdir –p /usr/local/named/etc
# chown bind:bind /usr/local/named/etc
# chmod 700 /usr/local/named/etc
二、named.conf的配置
创建主要的配置文件:
# vi /usr/local/named/etc/named.conf
===========================named.conf=======================
acl "trust-lan" { 127.0.0.1/8; 192.168.0.0/16;};
options {
directory "/usr/local/named/etc/";
pid-file "/var/run/named/named.pid";
version "0.0.0";
datasize 40M;
allow-transfer {
"trust-lan";};
recursion yes;
allow-notify {
"trust-lan";
};
allow-recursion {
"trust-lan";
};
auth-nxdomain no;
forwarders {
211.162.106.9;
211.162.106.254;};
};
logging {
channel warning
{ file "/var/log/named/dns_warnings" versions 3 size 1240k;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel general_dns
{ file "/var/log/named/dns_logs" versions 3 size 1240k;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default { warning; };
category queries { general_dns; };
};
zone "." {
type hint;
file "named.root";
};
acl "CNC" {
58.16.0.0/16;
58.17.0.0/17;
58.17.128.0/17;
58.18.0.0/16;
58.19.0.0/16;
58.20.0.0/16;
58.21.0.0/16;
注:这些根据情况输入IP地址段
};
view "view_cnc" {
match-clients { CNC; };
zone "." {
type hint;
file "named.root";
};
zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "localhost.rev";
};
include "master/cnc.def";
};
view "view_any" {
match-clients { any; };
zone "." {
type hint;
file "named.root";
};
zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "localhost.rev";
};
include "master/telecom.def";
};
添加完成后,保存。
三、更新根区文件:
# cd /usr/local/named/etc/
# wget ftp://ftp.internic.org/domain/named.root
创建PID和日志文件:
# mkdir /var/run/named/
# chmod 777 /var/run/named/
# chown bind:bind /var/run/named/
# mkdir /var/log/named/
# touch /var/log/named/dns_warnings
# touch /var/log/named/dns_logs
# chown bind:bind /var/log/named/*
# mkdir master
# touch master/cnc.def
# touch master/telecom.def
生成rndc-key:
# cd /usr/local/named/etc/
# ../sbin/rndc-confgen > rndc.conf
把rndc.conf中:
# Use with the following in named.conf, adjusting the allow list as needed:
后面以的部分加到/usr/local/named/etc/named.conf中并去掉注释
运行测试:
# /usr/local/named/sbin/named -gc /usr/local/named/etc/named.conf &
状态检查:
# /usr/local/named/sbin/rndc status
四、建立启动脚本:
# vi /etc/init.d/named
============================== named.sh============================
#!/bin/bash
# # named a network name service.
# #
# chkconfig: 545 35 75
# description: a name server
# if [ `id -u` -ne 0 ]
then
echo "ERROR:For bind to port 53,must run as root."
exit 1
fi
case "" in
start)
if [ -x /usr/local/named/sbin/named ]; then
/usr/local/named/sbin/named -u bind -c /usr/local/named/etc/named.conf && echo . && echo 'BIND9 server started.'
fi
;;
stop)
kill `cat /var/run/named/pid` && echo . && echo 'BIND9 server stopped.'
;;
restart)
echo .
echo "Restart BIND9 server"
注:对于配置智能DNS,主要用途为:1、解决网通与电信问题 2、实现区域规划(不同区域访问各自最近的服务器),下面以解决网通与电信连接问题的配置。至于实现2的功能,只需稍加更改即可。
一、DNS服务器安装......................................................................................... 1
二、named.conf的配置....................................................................................... 2
三、更新根区文件:.......................................................................................... 3
四、建立启动脚本:.......................................................................................... 4
五、添加一个NS............................................................................................... 5
六、添加一个域名.............................................................................................. 5
附:获取IP地址范围方法:................................................................................. 7
一、DNS服务器安装
1、 软件列表
BIND 9.3.2
ftp://ftp.isc.org/isc/bind9/9.3.2/bind-9.3.2.tar.gz
ftp://ftp.isc.org/isc/bind9/9.4.0a6/bind-9.4.0a6.tar.gz
2、 安装BIND 9
安装BIND9:
# tar zxvf bind-9.3.2.tar.gz
# cd bind-9.3.2
# ./configure --prefix=/usr/local/named --disable-ipv6
# make && make install
建立BIND用户:
# groupadd bind
# useradd -g bind -d /usr/local/named -s /sbin/nologin bind
创建配置文件目录:
# mkdir –p /usr/local/named/etc
# chown bind:bind /usr/local/named/etc
# chmod 700 /usr/local/named/etc
二、named.conf的配置
创建主要的配置文件:
# vi /usr/local/named/etc/named.conf
===========================named.conf=======================
acl "trust-lan" { 127.0.0.1/8; 192.168.0.0/16;};
options {
directory "/usr/local/named/etc/";
pid-file "/var/run/named/named.pid";
version "0.0.0";
datasize 40M;
allow-transfer {
"trust-lan";};
recursion yes;
allow-notify {
"trust-lan";
};
allow-recursion {
"trust-lan";
};
auth-nxdomain no;
forwarders {
211.162.106.9;
211.162.106.254;};
};
logging {
channel warning
{ file "/var/log/named/dns_warnings" versions 3 size 1240k;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel general_dns
{ file "/var/log/named/dns_logs" versions 3 size 1240k;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default { warning; };
category queries { general_dns; };
};
zone "." {
type hint;
file "named.root";
};
acl "CNC" {
58.16.0.0/16;
58.17.0.0/17;
58.17.128.0/17;
58.18.0.0/16;
58.19.0.0/16;
58.20.0.0/16;
58.21.0.0/16;
注:这些根据情况输入IP地址段
};
view "view_cnc" {
match-clients { CNC; };
zone "." {
type hint;
file "named.root";
};
zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "localhost.rev";
};
include "master/cnc.def";
};
view "view_any" {
match-clients { any; };
zone "." {
type hint;
file "named.root";
};
zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "localhost.rev";
};
include "master/telecom.def";
};
添加完成后,保存。
三、更新根区文件:
# cd /usr/local/named/etc/
# wget ftp://ftp.internic.org/domain/named.root
创建PID和日志文件:
# mkdir /var/run/named/
# chmod 777 /var/run/named/
# chown bind:bind /var/run/named/
# mkdir /var/log/named/
# touch /var/log/named/dns_warnings
# touch /var/log/named/dns_logs
# chown bind:bind /var/log/named/*
# mkdir master
# touch master/cnc.def
# touch master/telecom.def
生成rndc-key:
# cd /usr/local/named/etc/
# ../sbin/rndc-confgen > rndc.conf
把rndc.conf中:
# Use with the following in named.conf, adjusting the allow list as needed:
后面以的部分加到/usr/local/named/etc/named.conf中并去掉注释
运行测试:
# /usr/local/named/sbin/named -gc /usr/local/named/etc/named.conf &
状态检查:
# /usr/local/named/sbin/rndc status
四、建立启动脚本:
# vi /etc/init.d/named
============================== named.sh============================
#!/bin/bash
# # named a network name service.
# #
# chkconfig: 545 35 75
# description: a name server
# if [ `id -u` -ne 0 ]
then
echo "ERROR:For bind to port 53,must run as root."
exit 1
fi
case "" in
start)
if [ -x /usr/local/named/sbin/named ]; then
/usr/local/named/sbin/named -u bind -c /usr/local/named/etc/named.conf && echo . && echo 'BIND9 server started.'
fi
;;
stop)
kill `cat /var/run/named/pid` && echo . && echo 'BIND9 server stopped.'
;;
restart)
echo .
echo "Restart BIND9 server"
stop
sleep 10
start
;;
*)
echo " start | stop | restart"
;;
esac
===============================named.sh============================
# chmod 755 /etc/init.d/named
# chown root:root /etc/init.d/named
# chkconfig --add named
# chkconfig named on
五、添加一个NS
在域名的管理网站上,设定NS服务器为你安装的DNS
六、添加一个域名
# cd /usr/local/named/etc/master
# mkdir cnc
# mkdir telecom
# vi cnc.def
添加
zone "724cn.com" {
type master;
file "master/cnc/724cn.com";
};
# vi telecom.def
添加
zone "724cn.com" {
type master;
file "master/telecom/724cn.com";
};
添加网通的解析,解析到的IP为61.45.55.78
#vi cnc/724cn.com
添加
$TTL 3600
$ORIGIN 724cn.com.
@ IN SOA ns.724cn.com. root.ns.724cn.com.(
2005121013 ;Serial
3600 ; Refresh ( seconds )
900 ; Retry ( seconds )
68400 ; Expire ( seconds )
15 );Minimum TTL for Zone ( seconds )
; @ IN NS ns.724cn.com.
@ IN A 211.162.106.9
www IN A 211.162.106.9
; ;end
添加电信的解析,解析到的IP为210.75.1.178
#vi telecom/724cn.com
添加
$TTL 3600
$ORIGIN 724cn.com.
@ IN SOA ns.724cn.com. root.ns.724cn.com.(
2005121013 ;Serial
3600 ; Refresh ( seconds )
900 ; Retry ( seconds )
68400 ; Expire ( seconds )
15 );Minimum TTL for Zone ( seconds )
; @ IN NS ns.724cn.com.
@ IN A 211.162.106.254
www IN A 211.162.106.254
; ;end
#/usr/local/named/sbin/rndc reload
OK,到此你的DNS服务器就算是跑起来了。试一下分别用网通和电信的线路ping一下吧.
附:获取IP地址范围方法:
1、 利用shell程序获取IP地址段
#!/bin/sh
FILE=/root/study/apnic/ip_apnic
rm -f $FILE
wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest -O $FILE
grep 'apnic|CN|ipv4|' $FILE | cut -f 4,5 -d'|'|sed -e 's/|/ /g' | while read ip cnt
do
echo $ip:$cnt
mask=$(cat > cn.net
NETNAME=`whois $ip@whois.apnic.net | sed -e '/./{H;$!d;}' -e 'x;/netnum/!d' |grep ^netname | sed -e 's/.*: \(.*\)//g' | sed -e 's/-.*//g'`
case $NETNAME in
CNC)
   echo $ip/$mask >> CNCGROUP
;;
CHINANET|CNCGROUP)
   echo $ip/$mask >> $NETNAME
;;
CHINATELECOM)
   echo $ip/$mask >> CHINANET
;;
*)
   echo $ip/$mask >> OTHER
;;
esac
done
2、 可以利用网上的资料,下面是最新的信息,然后利awk行成地址段即可。
wget http://218.66.103.230/vpn_route/cnc.new 新的网通路由表
wget http://218.66.103.230/vpn_route/chinanet.new 新的电信路由表
stop
sleep 10
注:对于配置智能DNS,主要用途为:1、解决网通与电信问题 2、实现区域规划(不同区域访问各自最近的服务器),下面以解决网通与电信连接问题的配置。至于实现2的功能,只需稍加更改即可。

九阴真经 全卷

天之道,损有余而补不足,是故虚胜实,不足胜有余。其意博,其理奥,其趣深,天地之象分,阴阳之候列,变化之由表,死生之兆彰,不谋而遗迹自同,勿约而幽明斯契,稽其言有微,验之事不忒,诚可谓至道之宗,奉生之始矣。假若天机迅发,妙识玄通,成谋虽属乎生知,标格亦资于治训,未尝有行不由送,出不由产者亦。然刻意研精,探微索隐,或识契真要,则目牛无全,故动则有成,犹鬼神幽赞,而命世奇杰,时时间出焉。
  五藏六府之精气,皆上注于目而为之精。精之案为眼,骨之精为瞳子,筋之精为黑眼,血之精力络,其案气之精为白眼,肌肉之精为约束,裹撷筋骨血气之精而与脉并为系,上属于脑,后出于项中。故邪中于项,因逢其身之虚,其人深,则随眼系以入于脑,入手腼则脑转,脑转则引目系急,目系急则目眩以转矣。邪其精,其精所中不相比亦则精散,精散则视岐,视岐见两物。
  阴极在六,何以言九。太极生两仪,天地初刨判。六阴已极,逢七归元太素,太素西方金德,阴之清纯,寒之渊源。
  第一重诀曰:子午卯酉四正时,归气丹田掌前推。面北背南朝天盘,意随两掌行当中。意注丹田一阳动,左右回收对两穴。拜佛合什当胸作,真气旋转贯其中。气行任督小周天,温养丹田一柱香。快慢合乎三十六,九阳神功第一重。每日子、午、卯、酉四正时,找一阴气重的地方,最好为四高中低。面北而坐,五心朝天,静心绝虑,意守丹田,到一阳初动之时,双手在胸前合什,指尖朝前。
  引丹田之气沿督脉上行,任脉下归丹田。如此待小周天三十六圈。由慢至快。气归丹田后,双掌前推,掌心向前,掌指朝天,气行两掌。双掌指下垂,掌指朝下,掌心朝下,迅速收回,左手掌心对准气海穴,右手掌心对准命门穴,真气随手式成螺旋状贯入气海、命门两穴。汇于丹田内。如此意守下丹田一柱香的时间。待此功练有一定功力,能收发自如,有抗寒之功时可修第二重。
  第二重诀曰:极寒午时正,独坐寒冰床。裸体面朝北,气行小周天。五心朝天式,打开丹田门。寒气螺旋入,收发当自如。合和汇丹田,落雪雪不化。缩如一寒珠,雪落无化雪。扩为雾环身,九阴第二重。每日午时,找一极寒之地,面北背南,五心朝天,坐于寒冰床上(一种玉、一年四季都如寒冰一样)。今人练习可在冰或雪上练习,静心绝虑,启动周天三十六圈,意守丹田片刻,打开气海、命门两穴,分别成螺旋状入寒气,吸一柱香的时间后,关闭以上两穴,丹田内有一寒球再不停的旋转,越转越大,至到隔体三丈远,收回。如此反复八十一次,练到雪花落体而不化,放气时雪花距体三尺不落为功成。
  第三重诀曰:法如第二重,阴阳互相克。意在修罡气,热火不侵法。阳中求真阴,九阴第三重。每日子时,找一极热之地,坐于火鼎之上(今人练习坐在铁板上,下面加火,应慢慢加热,以不能忍耐为度)。面北背南,五心朝天,静心绝虑,起动丹田寒气防止热气侵入,其方法就是第二重所练寒气用以抗热量。此乃“真阳中求真阴”。
  第四重诀曰:法如第三重,阴合阴为生。同为修罡气,静流极之法。以阴练真阴,九阴第四重。不拘时间,找一静止不动的水池,五心朝天,坐于湖底,静心绝虑,水位不过脖子,运行丹田真气用以抗水之压力,其方法与第三重相同,待体入水,而衣不湿为成。然后找有流动河水中练,急流下练,而衣不湿为成。到此《九阴神功》成。如用掌把真气放出击人,就是催心掌。
  第五重采气大法诀曰:采气不在气,口闭双目开。玄机在于目,神气乾鼎聚。此法为增进内力之法,用以目吸聚宇宙内的精气,主要是修炼双眼,使双眼在对敌时能求察分明,并有摄取敌人神魂之效。每日太阳将出之际,站于高处,双眼平视太阳,带双眼发热时,意念太阳之气由双目吸入汇于上丹田,吸汇到一定程度自天目穴射出,在由双眼收回,如此反复。
  《横空挪移》螺旋九影,左右挪移,其聊不为,以气行之,可幻化九影诱敌。如加九阴白骨爪其威力可增十倍。如何横空挪移可据个况自定,今公之二法以参考。
  诀曰:左转一,左转半。右转一,右转半。左右转一为不一,横空旋较为太一。
  诀曰:左旋右旋天地旋,左踏右空平地旋。合手阴阳为上旋,右踏左空旋不为。虽为身法,实含玄理。须参照“九阴行功诀曰”进行,以防走火。习此功主要为子、午两时,其它时间亦可。必须选一处绝对安静,空气必须流畅。此功中的呼吸均为鼻吸鼻呼。习此功贵在持之以恒。功中会出现各种幻境,千万不可惧怕,顺其自然。练功中出现自然腾空,应顺其自然,千万不可妄加意念。
  《鬼獄阴风吼》
  此功属音波功,以音伤人,以音索魂,亦可以音布罡气,其威力无比,其音如地狱鬼吼,阴风阵阵,使人不攻自退,不寒而栗。
  第一重:面北而坐,取五心朝天式,上身正直,虚灵劲,舌抵上腭,下颌微收,双目平视。双手于下丹田处成托式,即掌心向上,掌指相对,意守丹田一柱香,引真气自督脉、任脉行到中丹田,并在此汇聚成乒乓球大小的真气球,其色赤。口中默念,意念中丹田之真气化为波圈,若水纹之状。碰肤弹回,须反复重阳之数。
  第二重:意大波圈,自内向外旋为散,自外向内旋为聚,散聚合适为阴阳平
  衡,阴阳平衡,万物之本。渐如虚空,与宇共振,法同上。
  第三重:自然站立,双脚与肩同宽,双手自然放于两腿外侧,百会上,舌
  放平,双目平视,调整呼吸,意守丹田一柱香的时间,然后点头,吸气、收腹,
  口发鬼怪连音,同时意引丹田真气随声音向外扩散;抬头、呼气、口闭,意收回
  真气归中丹田,如此反复。一点一抬,一上一下,上下起到,喉轮自开,开通喉
  轮魔音自现。
  第四重:无相音罡
  无相音罡,即音罡无形。其秒音无穷,可防敌护体,亦可以音控他人或给他
  人治病。其练法很简单,只需把“九阴神功”的“先天真气”与“鬼獄阴风吼”
  之音合二为一就可,具体练习方法可参照以上两法自悟,此不详述。

下卷
  九阴白骨爪
  爪力无比,鬼气回荡,不攻自惧。其爪可使头骨成孔而不碎,爪心有强大的吸力可隔空取物或吸取他人功力,爪指有强大的透劲可隔空伤人。一收一放,一开一合,合乎武学大道之理。
  第一重金丝手诀曰:面北背南朝天坐,气行任督贯大椎。意聚丹田一柱香,分支左右聚掌心。打开气海命门穴,气满冲贯十指爪。旋入阴气一坤炉,放收来回金丝手。凡习九阴白骨爪需先习九阴神功百日,于极阴之地,谷地为佳。面北背南,五心朝天坐于低处。双手放于膝上,手心朝下,意守丹田。开气海、命门,旋转吸入阴气汇于丹田。气顺任、督两脉上行汇于大椎穴,于右肩井穴入掌心,气满鼓支,掌起平胸。五指下垂,气贯入指,十指内扣、回拉,手丝为一。回气丹田,温养柱香。
  第二重摄魂大法诀曰:打开丹田前后门,三昧磷火化无形。吸进鬼狱阴鬼精,阴功在此更为进。此法是一种极秘之法,可开通人的死生之谜,吸取鬼魂之气,同时亦可用此法吸他人功力元神。找一坟场,在半夜无人之时,面北背南,五心朝天,左掌心向上,大拇指扣小指其它三指伸直。左手立于胸前,掌心朝左,大拇指、中、无名、小指内扣,食指伸直,口念咒“探地达摩,无相无上,摄阴摄魂,无畏无惧,阴阳合和,人鬼交战,吗咪呗咪‘口奄’”三十六遍,一遍过于一遍,到最后一遍,只需“吗咪呗咪‘口奄’”。然后双手抬到头上方,合掌, 尖朝天,打开气海、命门两穴,从两穴内射出阴气,成螺旋型由小到大,如龙卷风一样把野魂阴精卷入两穴汇于丹田,练习一柱香的时间后,开始炼熔。双掌放于膝上,掌心朝上,意守丹田中的无数阴魂阴精被丹田阴气形成环状,封闭在内不能出来。意念丹田封魂球开始旋转,同时意念坟场突然起了无数磷火,用同样方法把磷火吸入丹田封魂球外圈,燃烧炼熔阴魂,由慢到快不停旋转,火由小到大,直到化尽为止。收功,温养丹田一柱香。如果用来吸取他人功力或元神其方法于上面同理。
  第三重白骨练爪诀曰:白骨头上悬,幻化为二骨。阴精悬九穴,左右手中擒。合和为阴珠,吸阴吸精鬼。齐汇坤炉内,回返丹炉内。面北背南,五心朝天,坐 坟场中,意守丹田片刻,意守自身前后有九座坟,突然裂开飞出九个头骨,这时意念打开气海、命门两穴,射出旋转真气由小到大,把九个头骨给悬起来,位于本人头上方左右,缓慢旋转。从每一个头骨的两眼射出一条红气线,分别射入百会、玉枕、膻中,左右肩井穴,灵台、气海、命门九大穴道中,并且在每个穴道中渐渐汇聚成一个球,然后这九个红球同时从任督两脉汇于丹田,意守丹田使之气化合。然后运气两掌贯足真气,由于反向力,双掌抬起平胸,在贯入十指,十指突然变爪,这时意念那九个头骨互相幻化,变为两个头骨于胸前方。掌心外突把两个头骨吸入掌中,随后十指内扣抓住头骨,放出真气把头骨抓成十个小孔,然后吸回真气,同时吸取头骨内的阴精归于丹田。收功,温养丹田一柱香。至头骨隔空袭来抓成孔而骨不碎,九阴白骨爪成矣。练之此境界需配合外功练习即第四重。
  第四重外功诀曰:气至丹田贯十指,倒行古树狸猫功。抓石打铁练指力,内外合修白骨功。平常把内气贯于十指用以隔空取物,在以十指抓,练硬物,所用之物应由轻到重,由近到远。在者可以倒立于树旁,双脚依树,然后用十指抓树缓缓上行,以练指力。此重应与第三重同练。
  第五重练到第四重此功已成,此第五重为加深功夫,其阴毒程度更甚。用古时棺材、蝙蝠血、砒霜三种物体加水加热后,用以漫手,再练内外功,这样手上有剧毒,以此手伤人无救。

技术测试:你是oltp应用开发方面的高手吗?

整理文章整理出来的,很早时候caoz写的,翻出来备份

这里是一篇技术测试的文章,希望所有那些自称的和被人吹捧的技术高手来看一看,做做我们的几个测试,看看你属于那种层次的高手?

以下测试是针对oltp开发而言的,对于做算法和桌面程序的,不是我这里要讨论的对象。

好了,第一个考题:你能否做一个统计系统,功能上和易数差不多,能够通过页面嵌入方式记录一个网站的显示次数,来访分析,时段分析,日期分析等等。怎么,这就被难住了,那你算哪门子高手?啊哈,这位说了,这些都easy,手到擒来,很好,很好,看来在实现功能上,你具有了高手的基本能力,不过且慢,如果你认为可以实现这些功能就能自称做个易数统计出来,未免也太小瞧了技术这碗饭的分量,实现这些功能,就中国而言,至少有6位数的程序员可以作到,而设计这么一套系统(仅从功能考虑),也至少有5位数的程序员可以作到,明白吗?你不过是这里面平平常常的一个而已了,要高兴还早呢。

第二个考题:呵呵,其实还是做这些功能,不过加个条件,我只给你一台PC Server(单/双PIII 733+512M Ecc内存+18G SCSI硬盘),你要支撑300万/天的请求调用。琢磨琢磨吧。
简简单单的一个cgi+数据库,那是肯定死翘翘了,怎么办?
第一,你要建立三层体系模型,后台数据库必须通过中间应用层和前台CGI分开。
第二,合理分配使用共享内存空间,并合理通过IPC信号量防止内存区的读写冲突和死锁。
第三,必要时改写web server原代码以获得效率最优化,比如改写apache server的http_log.c程序并重新编译。
如果你对建立这么一套系统的整体架构非常清楚,那么恭喜,你可以在一个比较不错的网络公司做一个CTO了,中国能够清晰搭建这样系统的人,不过4位数而已(当然,能够在这样系统里进行编码工作的,肯定还是有5位数以上的,毕竟左右都是c语言而已)。
知道为什么层出不穷那么多统计系统,虽然功能花哨,但是最后都撑不过易数,基本功不扎实,光靠功能花哨,那是没前途的。

在这个领域做的比较好的,好耶,网易,adsunion,腾讯,太极链等几家而已。
那些所谓广告交换没什么技术瓶颈的人,自己做一套大并访系统出来再说话。

第三个考题,还是这些功能,(我够贫的是吧)我要你一天能记录下3000万次浏览日志,不但要统计,还要完整记录,以供随时查验,当然主机环境提升一下,处理数据的主机用集群,但是核心数据库还是用一台电脑的,这次用sun的小型机,比如RS6000什么的;还有这次再加个条件,数据损失不能超过 0.01%。
这个已经不再象建立一个网站了,到象是大型电信的计费中心。你能胜任吗?
这时候要求对整体操作系统,对C语言,对数据库核心都必须有深入骨髓的理解,甚至于,对于数据的导入导出和一些日志的数据库记录,你已经不能再用sql去写了!要利用数据库产品的核心接口按照其数据存储格式直接进行文件或设备块的读写操作!对于一些负载非常大而性能要求又非常高的系统,甚至你需要建立一套独立的数据库体系和数据结构体系。这不是玩笑,因为我领教过这样的系统。
在中国,能搭建这样平台的高手,最多3位数而已。主要集中在电信计费领域,如亚信这样的企业。

第四个考题,这次每天的请求不是3000万了,而是3万万,我没说胡话,3万万!不过你的工作变了,我不要你再做后面的数据处理,我只让你做一个前端报文转发处理,这次我很苛刻,给你一台PII的PC服务器,256M Ecc内存,而数据损失要求则绝对不能超过0.0001%,你的工作很简单,对来往的请求进行简单识别并转发到合适的应用服务器处理。
你用web server转发?别开玩笑了!这时候,你已经别无选择,用汇编自己写一套报文处理程序,作为看守进程驻入内存并挂在接收报文的端口上,你对效率的理解,应当已经超出了对操作系统的认识,对编程语言的认识,而直接达到对CPU指令集的认识程度上,是的,你必须清楚自己的每一条汇编指令是不是已经达到最小的 CPU指令占用。必须能计算出分解和处理一条报文的流程需要多少CPU指令循环,是不是已经针对CPU的指令集达到了最大优化,当然,你还必须很熟悉 TCP/IP协议对每一种报文的格式定义和规范,不过这和汇编指令的效率优化而言,到不显得有多高深了。
我们经常说CISCO是硬件产品服务商,错了!他们的利润主要就来自于这样的算法!!中国联想、华为等等都想强占这块肥肉的市场,但是在高端领域(其实并不是硬件高端,而是算法高端!),我们还是彻底的空白。
庆幸的是,我知道国内有人在做这样的事情了,当宽带不可避免的成为主流的时候,这种算法的强度和要求,会成为攫取利润的最好途径。
中国在这方面能达到标准的,又有几个人呢?

出了这四个考题,没别的意思,我刚大学毕业的时候,也是自视甚高,因为当时的感觉是,和专业课的计算机作业相比(我是力学专业的,动不动要求编程解一个偏微分方程的收敛解,来分析什么旋流场的速度、温度等的分布),做wewebb开发简直毫无算法可言。再加上当时国内做web数据库的也少,动辄以为自己已经是满高手了,结果幸好跑到给电信做计费的企业混了一年,接触了国内最大的电信集中计费中心的解决方案(一直在运营,还不错),才知道敢情OLTP应用里面学问大的很,自己这点皮毛拿出来吹嘘简直是不知天高地厚。现在看看外面一堆和我当初一样的小毛孩子整天做两个烂程序就自诩高手,只好出来说几句。

其实对于OLTP应用而言,功能的实现一般都非常容易,和那些从事力学、数学、物理等行业的数值计算相比简直毫无算法可言,而OLTP的技术难点主要在于性能,也就是你做一个桌面程序或算法程序,都不会面临并访过高的处理问题,但是做一个OLTP应用,无论如何你都必须直视一下子很多访问冲上来的情况,如果这个问题解决不了,无论多好的创意,多好的功能,都不会得到持续和长远的发展。

由于很多创业者和投资者对技术不通或半通,他们往往拿一个性能指标有很大缺陷的东东当个宝贝,因为一般而言,开发出新东东大家都只是忙着测试功能,很少有对性能进行完整测评的,只有持续运营到一定阶段,并访达到一定程度,性能缺陷开始暴露,才临急抱佛脚,这时候造成的损失就很不核算,甚至是压根解决不了,只好放弃某种功能,从而使品牌信誉整体下降。

加强算法基础,加强技术基础,少卖弄一些花里胡哨的东西,是走向技术高手的真正路线,那些今天学会了什么语言,明天又学会了什么语言的主儿,别吹嘘了,从70年代到现在,最值钱的程序员一直是写汇编和写标准C的,不为什么,因为这是真功夫。

—————————————————–
搜出来这个帖子,呵呵,稍微回复一下。

caoz早期也做过asp,中国最早的asp中文教程,是caoz翻译的,那是1998年的事情。但是后来(99年)换了php,不是因为asp不好,而是因为安全性,安全性的问题,根源在microsoft,这个和程序员没关系,但是程序员规避风险的话,还是linux下塌实一些,顺便说一下,caoz 在安全公司混过一年半的程序员。

asp和php相比,在某些应用的效率上,甚至更胜一筹,这个原因也不是语言的问题,而是本身系统的进程模式,Asp是线程模式,线程间的数据通信是非常简单的,写过asp的都知道,可以用application变量做,非常简单。而php在apache下只能是进程模式就麻烦很多,虽然也有共享内存支持,但是调用时候需要做信号量锁定,很麻烦,否则就有内存索引崩溃的危险。就进程间通信而言,asp不是略胜一筹的问题,而是拥有无可比拟的优势。

所以一个统计系统效率还还是不好,语言并不是决定因素,但是阿江有一点说的过了,一台服务器千万次的静态调用就达到极限?
caoz告诉你,在apache 下,caoz所能达到的数字是4000万次,而且是普通的服务器。

阿飞做过极限测试,单服务器最高的一天,统计量达到了3670万次(真实网络流量,不是测试机的模拟流量),单p4的机器,配置很一般的那种。当然这种极限测试不代表真正的应用环境,毕竟单用户和多用户对统计系统负载开销是不同的,但是单服务器在应用环境下每日支撑千万次以上的统计,却并非难事。关键不是看语言,而是看设计。cnzz可以做到,50bang也可以做到。

技术无止境,对比千兆的网络数据包分析工具(如千兆路由器,千兆IDS,千兆黑洞等),那种每秒解析上百万数据包变态应用,的现在的站点统计系统,日千万次处理简直是小儿科的东西。

不过说实话,国内统计系统技术依然有很大的提升空间,阿江的,caoz的,不外如此,处理效率上去只是一方面,分析能力提高也是很考验技术实力的。就这一点,caoz坦承,Google Analytics的数据挖掘能力,无可比拟,完全超越了caoz的技术理解力。当然,这是另一个话题了。

—————————————————
阿江的回帖

看了那个顶上了的贴,接受里面的一些批评,
我自己的观点也在实践中变化,我仔细的看过CNZZ的统计报告并对其统计方式进行了推断。
我的结论是,影响效率差异的主要因素并不在操作系统和WEB服务软件上,
而是在数据结构和程序结构上。

对于一次访问,51LA立即更新统计报告,保存统计报告,
而CNZZ则很傲能是追加访问记录,而在显示统计报告时检索汇总,或者每天还会把前一天的数据汇总后保存。
所以差异出现在这里:向数据库里追加行少数次 VS 更新数据库中指定的行多次
后者的效率明显要低的多。

虽然51LA在统计程序效率上有差距,
但是这种设计思路可以实现统计报告的完整、快速显示、翻页、排序、筛选,
这对很多站长是非常有用的,也是很多人喜欢51LA的原因。
这也正是我迟迟不肯使用承受力更强的新思路重写统计的原因。

另外,MSSQL数据库是一个库一个文件,而MYSQL是一个表一个文件,
这使MSSQL在磁盘操作上稍逊一筹,因为要处理的是大文件。
加上直接更新统计报告的统计方式增加了数据库操作次数,效率大打折扣。

百度hi通讯协议 抓包分析

ethereal居然自己就分析了msn messager service...

[登录]

DNS -> TCP

建立TCP连接后,开始发文.

1.本地向Hi发: 内容可能加密了,没看出什么来

1.1 Hi返回:按照MSN协议,应该是返回一个地址了,不过登录前后的Hi-ip一直都没变,估计不是这样子实现的.

1.2 本地响应给Hi: 乱七八糟

1.3...循环五次左右...大都是乱的...

思考: MSNS

[对话]待续

[讨论]从互联网社区发展看学校BBS

 很欣慰学校的BBS能够打得开,即使是如此的慢(我的网络北京网通ADSL 1M).找了一个黑龙江的代理,总算可以打开发贴的页面了,看到blue的一席话,我也来鸟语几句,看完能明白的师弟师妹引以为介.看完觉得无聊的权当鸟语便罢.
      互联网从诞生开始,其目的就是信息的传达.
      中国第一个BBS是冒似是丁磊在电信局搭建的firebirdBBS(无从查证,这是他自己说的)...不过这足以说明火鸟系BBS的历史悠久.(我把从火鸟系统中繁殖出来的众多系统都算一个系列).另一个不得不提的第一,是曙光,看smth的源代码就知道这个名字了.这是在93\94年间,我们学校好像是在合并中吧...相信那时候我们学校的前辈们肯定还是依靠书信传达信息的...
      互联网瞬间进入了高校,那时候...我还没上高中吧...不过咱们学校的互联网建设是在2000年开始搞的吧,庆幸我已经上了高中了...[em21]
      全国高校BBS大动乱的时候,我们学校还没有BBS.
      后来,2004年左右的时候,国家工商开始全国所有网站的ICP备案(这是全世界首屈一指的动作哦...).接下来,高校BBS实名制.
      实名制闹得很厉害,水木BBS在这一闹中分离了一个校内一个校外,校外是以公司名义运营;北大的未名直接关站,后来也转向校内,直到后来两全其美站以替代未名站的姿态出现,同样以公司的名义运营(lqqm站长之一是我一同事).
      互联网的开放性,不适合国情,不适合社会.再往下写就要被定义成反动了.下面讲我们.

      海天白云BBS,经过的风风雨雨估计是水木这些都没经历过的吧,因为我们总是经历灾难式的数据全部丢失事件.
      首先,从系统安全和技术实现层面来说.现在的系统比两年前的系统,进步肯定不是一个级别的,不管是硬件还是软件.这要归功于给予支持的学校各部门和站务组的同学们.
      其次,从BBS内容建设层面来说.现在和两年前对比,也算是有了进步.至少有更多的人在使用BBS了.然而,BBS离同学们究竟还有多远的距离,究竟还要花多长的时间,BBS和它的组织,才能成为一个成熟的系统组织,真正服务于同学,服务于学校.这些都是现在的站务组同学和老师值得深究的.
      再次,从管理组组成来说.一个合理的BBS管理组,最好且应该包括一半及以上的技术人员,另一部分是BBS活动组织策划管理人员.如果能长期保持这个比例且各成员都任意施展才华的话,BBS自然会长期健康有序发展.纵观站务组,值得沉思.
      最后,劲往一处使.互联网决策最忌拍脑袋的行为.

有想沟通的同学可以来我空间,学校太慢看起来累...http://www.54chen.com
祝母校繁荣昌盛!祝海天白云BBS更加民主自由,更加强大!

cc0cc

Jquery的N个插件

最近发现很多朋友在查找使用这jQuery,希望大家能留言推荐自己觉得不错的插件,同时也请留下自己的交流方式,以便初用者能与你交流,请大家多多支持,共创发展. 一、文件上传类(File upload) Ajax File Upload jQUploader. Multiple File Upload plugin. jQuery File Style. Styling an input type file. Progress Bar Plugin.
二、表单验证(Form Validation) jQuery Validation. Auto Help. Simple jQuery form validation. jQuery XAV - form validations. jQuery AlphaNumeric. Masked Input. TypeWatch Plugin. Text limiter for form fields. Ajax Username Check with jQuery.
三、表单-选取框(Form - Select Box stuff) jQuery Combobox. jQuery controlled dependent (or Cascadign) Select List. Multiple Selects. Select box manipulation. Select Combo Plugin. jQuery - LinkedSelect Auto-populate multiple select boxes. Choose Plugin (Select Replacement).
四、表单基本、输入框、选择框等(Form Basics, Input Fields, Checkboxes etc.) jQuery Form Plugin. jQuery-Form. jLook Nice Forms. jNice. Ping Plugin. Toggle Form Text. ToggleVal. jQuery Field Plugin. jQuery Form’n Field plugin. jQuery Checkbox manipulation. jTagging. jQuery labelcheck. Overlabel. 3 state radio buttons. ShiftCheckbox jQuery Plugin. Watermark Input. jQuery Checkbox (checkboxes with imags). jQuery SpinButton Control. jQuery Ajax Form Builder. jQuery Focus Fields. jQuery Time Entry.
五、时间、日期和颜色选取(Time, Date and Color Picker) jQuery UI Datepicker.推存使用,其支持中文 jQuery date picker plugin. jQuery Time Picker. Time Picker. ClickPick. TimePicker. Farbtastic jQuery Color Picker Plugin. Color Picker by intelliance.fr.
六、投票插件(Rating Plugins) jQuery Star Rating Plugin. jQuery Star Rater. Content rater with asp.net, ajax and jQuery. Half-Star Rating Plugin.
七、搜索插件(Search Plugins) jQuery Suggest. jQuery Autocomplete. jQuery Autocomplete Mod. jQuery Autocomplete by AjaxDaddy. jQuery Autocomplete Plugin with HTML formatting. jQuery Autocompleter. AutoCompleter (Tutorial with PHP&MySQL). quick Search jQuery Plugin.
八、编辑器(Inline Edit & Editors) jTagEditor. WYMeditor. jQuery jFrame. Jeditable - edit in place plugin for jQuery. jQuery editable. jQuery Disable Text Select Plugin. Edit in Place with Ajax using jQuery. jQuery Plugin - Another In-Place Editor. TableEditor. tEditable - in place table editing for jQuery.
九、多媒体、视频、Flash等(Audio, Video, Flash, SVG, etc) jMedia - accessible multi-media embedding. JBEdit - Ajax online Video Editor. jQuery MP3 Plugin. jQuery Media Plugin. jQuery Flash Plugin. Embed QuickTime. SVG Integration.
十、图片(Photos/Images/Galleries) ThickBox. jQuery lightBox plugin. jQuery Image Strip. jQuery slideViewer. jQuery jqGalScroll 2.0. jQuery - jqGalViewII. jQuery - jqGalViewIII. jQuery Photo Slider. jQuery Thumbs - easily create thumbnails. jQuery jQIR Image Replacement. jCarousel Lite. jQPanView. jCarousel. Interface Imagebox. Image Gallery using jQuery, Interface & Reflactions. simple jQuery Gallery. jQuery Gallery Module. EO Gallery. jQuery ScrollShow. jQuery Cycle Plugin. jQuery Flickr. jQuery Lazy Load Images Plugin. Zoomi - Zoomable Thumbnails. jQuery Crop - crop any image on the fly. Image Reflection.
十一、Google地图(Google Map) jQuery Plugin googlemaps. jMaps jQuery Maps Framework. jQmaps. jQuery & Google Maps. jQuery Maps Interface forr Google and Yahoo maps. jQuery J Maps - by Tane Piper.
十二、游戏(Games) Tetris with jQuery. jQuery Chess. Mad Libs Word Game. jQuery Puzzle. jQuery Solar System (not a game but awesome jQuery Stuff).
十三、表格等(Tables, Grids etc.) UI/Tablesorter. jQuery ingrid. jQuery Grid Plugin. Table Filter - awesome!. TableEditor. jQuery Tree Tables. Expandable “Detail” Table Rows. Sortable Table ColdFusion Costum Tag with jQuery UI. jQuery Bubble. TableSorter. Scrollable HTML Table. jQuery column Manager Plugin. jQuery tableHover Plugin. jQuery columnHover Plugin. jQuery Grid. TableSorter plugin for jQuery. tEditable - in place table editing for jQuery. jQuery charToTable Plugin. jQuery Grid Column Sizing. jQuery Grid Row Sizing.
十四、统计图(Charts, Presentation etc.) jQuery Wizard Plugin . jQuery Chart Plugin. Bar Chart.
十五、边框、圆角、背景(Border, Corners, Background) jQuery Corner. jQuery Curvy Corner. Nifty jQuery Corner. Transparent Corners. jQuery Corner Gallery. Gradient Plugin.
十六、文字和超链接(Text and Links) jQuery Spoiler plugin. Text Highlighting[注:关键字标亮,但还没尝试中文
]. Disable Text Select Plugin. jQuery Newsticker. Auto line-height Plugin. Textgrad - a text gradient plugin. LinkLook - a link thumbnail preview. pager jQuery Plugin[注:分页效果]. shortKeys jQuery Plugin. jQuery Biggerlink. jQuery Ajax Link Checker.
十七、鼠标提示(Tooltips) jQuery Plugin - Tooltip. jTip - The jQuery Tool Tip[注:推荐]. clueTip. BetterTip. Flash Tooltips using jQuery. ToolTip.
十八、菜单和导航(Menus, Navigations) jQuery Tabs Plugin - awesome! . [demo nested tabs.] another jQuery nested Tab Set example (based on jQuery Tabs Plugin). jQuery idTabs. jdMenu - Hierarchical Menu Plugin for jQuery. jQuery SuckerFish Style. jQuery Plugin Treeview. treeView Basic. FastFind Menu. Sliding Menu. Lava Lamp jQuery Menu. jQuery iconDock. jVariations Control Panel. ContextMenu plugin. clickMenu. CSS Dock Menu. jQuery Pop-up Menu Tutorial. Sliding Menu. http://stilbuero.de/jquery/tabs_3/ 十九、幻灯、翻转等(Accordions, Slide and Toggle stuff) jQuery Plugin Accordion. jQuery Accordion Plugin Horizontal Way. haccordion - a simple horizontal accordion plugin for jQuery. Horizontal Accordion by portalzine.de. HoverAccordion. Accordion Example from fmarcia.info. jQuery Accordion Example. jQuery Demo - Expandable Sidebar Menu. Sliding Panels for jQuery. jQuery ToggleElements. Coda Slider. jCarousel. Accesible News Slider Plugin. Showing and Hiding code Examples. jQuery Easing Plugin. jQuery Portlets. AutoScroll. Innerfade.
二十、拖放插件(Drag and Drop) UI/Draggables. EasyDrag jQuery Plugin. jQuery Portlets. jqDnR - drag, drop resize. Drag Demos.
二十一、XML XSL JSON Feeds XSLT Plugin. jQuery Ajax call and result XML parsing. xmlObjectifier - Converts XML DOM to JSON. jQuery XSL Transform. jQuery Taconite - multiple Dom updates. RSS/ATOM Feed Parser Plugin. jQuery Google Feed Plugin.
二十二、浏览器(Browserstuff) Wresize - IE Resize event Fix Plugin. jQuery ifixpng. jQuery pngFix. Link Scrubber - removes the dotted line onfocus from links. jQuery Perciformes - the entire suckerfish familly under one roof. Background Iframe. QinIE - for proper display of Q tags in IE. jQuery Accessibility Plugin. jQuery MouseWheel Plugin.
二十三、对话框、确认窗口(Alert, Prompt, Confirm Windows) jQuery Impromptu.[注:很值得使用] jQuery Confirm Plugin. jqModal. SimpleModal.[注:很值得使用] 二十四、CSS jQuery Style Switcher. JSS - Javascript StyleSheets. jQuery Rule - creation/manipulation of CSS Rules. jPrintArea.
二十五、DOM、AJAX和其它JQuery插件(DOM, Ajax and other jQuery plugins) FlyDOM. jQuery Dimenion Plugin. jQuery Loggin. Metadata - extract metadata from classes, attributes, elements. Super-tiny Client-Side Include Javascript jQuery Plugin.[在页面加载后,通过inc加载(替换)] Undo Made Easy with Ajax. JHeartbeat - periodically poll the server[定时再次连接服务器,在使用些方法后,会自动建立起一个id为'HeartBeatDIV'的div,从服务器返回的值,将在这个div里]. Lazy Load Plugin. Live Query. jQuery Timers. jQuery Share it - display social bookmarking icons. jQuery serverCookieJar. jQuery autoSave[自动向服务器提交保存数据]. jQuery Puffer[喷气效果(用于图片,很炫)]. jQuery iFrame Plugin[内嵌框架,如果JS失败,那么框架页不显示,而由自己定义的东西代替]. Cookie Plugin for jQuery. jQuery Spy - awesome plugin. Effect Delay Trick[提示内容自动消失]. jQuick - a quick tag creator for jQuery. Metaobjects. elementReady[方便的设置Ready动作].

extern--C/C++语言中表明函数和全局变量作用范围

extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字.
它告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。 1。对于extern变量来说,仅仅是一个变量的声明,其并不是在定义分配内存空间。如果该变量定义多次,会有连接错误
2。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。也就是说c文件里面定义,如果该函数或者变量与开放给外面,则在h文件中用extern加以声明。所以外部文件只用include该h文件就可以了。而且编译阶段,外面是找不到该函数的,但是不报错。link阶段会从定义模块生成的目标代码中找到此函数。 3。与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。

后面转载,阅读中。。。。。。。
被extern "C"修饰的变量和函数是按照C语言方式编译和连接的; 未加extern “C”声明时的编译方式

  首先看看C++中对类似C的函数是怎样编译的。

作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:

void foo( int x, int y );
该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。

_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。

同样地,C++中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名,我们以"."来区分。而本质上,编译器在进行编译时,与函数的处理相似,也为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同。

未加extern "C"声明时的连接方式

假设在C++中,模块A的头文件如下:

// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
#endif
在模块B中引用该函数:
// 模块B实现文件 moduleB.cpp
#include "moduleA.h"
foo(2,3);
实际上,在连接阶段,连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号!

加extern "C"声明后的编译和连接方式

加extern "C"声明后,模块A的头文件变为:

// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern "C" int foo( int x, int y );
#endif
在模块B的实现文件中仍然调用foo( 2,3 ),其结果是:

(1)模块A编译生成foo的目标代码时,没有对其名字进行特殊处理,采用了C语言的方式;

(2)连接器在为模块B的目标代码寻找foo(2,3)调用时,寻找的是未经修改的符号名_foo。

如果在模块A中函数声明了foo为extern "C"类型,而模块B中包含的是extern int foo( int x, int y ) ,则模块B找不到模块A中的函数;反之亦然。

所以,可以用一句话概括extern “C”这个声明的真实目的(任何语言中的任何语法特性的诞生都不是随意而为的,来源于真实世界的需求驱动。我们在思考问题时,不能只停留在这个语言是怎么 做的,还要问一问它为什么要这么做,动机是什么,这样我们可以更深入地理解许多问题):

实现C++与C及其它语言的混合编程。

明白了C++中extern "C"的设立动机,我们下面来具体分析extern "C"通常的使用技巧

4.extern "C"的惯用法

(1)在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理:

extern "C"
{ #include "cExample.h"
}
而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件中包含了extern "C"时会出现编译语法错误。

笔者编写的C++引用C函数例子工程中包含的三个文件的源代码如下:

/* c语言头文件:cExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif
/* c语言实现文件:cExample.c */
#include "cExample.h"
int add( int x, int y )
{ return x + y;
} // c++实现文件,调用add:cppFile.cpp
extern "C"
{ #include "cExample.h"
} int main(int argc, char* argv[])
{ add(2,3);
return 0;
}
如果C++调用一个C语言编写的.DLL时,当包括.DLL的头文件或声明接口函数时,应加extern "C" { }。

(2)在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。

笔者编写的C引用C++函数例子工程中包含的三个文件的源代码如下:

//C++头文件 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif
//C++实现文件 cppExample.cpp
#include "cppExample.h"
int add( int x, int y )
{ return x + y;
} /* C实现文件 cFile.c
/* 这样会编译出错:#include "cExample.h" */
extern int add( int x, int y );
int main( int argc, char* argv[] )
{ add( 2, 3 );
return 0;
}

大学生创业案例分析讲稿整理

三、创业在“上市”后结束(55分钟)
1、创业5年后“上市”者的命运
在2005年已经成功在美国纳斯达克上市的公司。公司在不到五年的时间里资产增长了800倍。使一家注册资本仅为100万的小公司,成长为一个总资本超过8个亿的大企业。
无名毕业后分在一家中国很著名的军工研究所从事科技研究工作。认为自己属于那种天分很高的人,很多新东西他都一学就会,对于人际关系的把握更是无师自通。
当时他知道国家有一个“军转民”的精神,所在的研究所要变成一个普通企业性质的机构了。从此以后,激烈的市场竞争将成为这个以前在“温室”里面长大的研究所,要面临的不可避免的问题。生存发生困难!
在这时候,无名看到了一个重要的商业机会。他知道在目前这种情况下,能够利用研究所的资源帮助研究所生存下去的人将可以得到领导的大力支持。
无名于是找到所领导,以自筹30万元现金入股为条件和所里联合成立了一家公司。双方各拥有这家公司的50%股权。
在这家注册资本金为100万元的公司里,研究所投入的都是一些空闲办公场所和试验场地之类的闲置固定资产,公司能够使用的现金只有无名自己从家中以及朋友手里筹措到的30万元。
无名之所以这样勇敢的破釜沉舟,是因为他心里已经有了比较完整的公司发展方向。当时俄罗斯有家公司生产一种数字化医疗设备,这种设备得到过曾去俄罗斯访问的中国中央最高领导的高度赞扬。
无名经过调研,知道相关同类的数字化医疗设备在中国的市场上只有通用公司一家的产品,而这种产品的国内市场销售前景十分看好。俄罗斯生产的产品在质量和各种性能指标上和通用公司的产品属于同等级别,价格却仅为通用公司产品的1/2左右。
这家俄罗斯公司以前曾经得到过一家中国公司的承诺,要代理其在中国的业务。没想到这家中国公司办齐了所有这种产品在中国市场销售的手续以后,却因为一个偶然的事件,放弃了这个业务。而这家中国公司恰巧也是军工企业。
这样,无名在公司注册前就通过朋友、互联网与这家俄罗斯和中国的那家军工企业进行多次联系、沟通。不仅得到了俄罗斯公司授权其作为中国地区独家 代理的意向书,还让那家军工企业答应:可以转让这个产品在中国地区销售的全套手续。这样,公司成立伊始,无名就全力以赴的迅速扑向市场。
无名在公司成立仅2个月的时候,就打开了市场。在打开市场的同时,无名也充分利用研究所内部的资源,对这种产品进行了全面分析。他很快搞清楚了 这种产品除了一个关键元器件以外的所有部件,都可以利用研究所现有设备进行生产、加工、组装、验收。而如果能够这样做,他预计即使把产品售价再次下降 30%,利润也仍旧能够增加50%。
这以后,无名就开始和这家俄罗斯公司进行艰苦的谈判。半年以后,他终于得到了想要的东西:无名的公司作为这家俄罗斯公司的海外合作伙伴,采用同 样的品牌在中国地区享有这种产品独立加工、组装和销售的全权,而产品的关键元器件则由俄罗斯企业提供。这样,在公司成立整整一年的时候,无名的公司开始正 式销售自己生产的产品了。
当时无名遇到了一个支持他发展的巨大机遇。由于所在的研究所没有了部分上级划拨的经费,研究所本身处于艰辛的生存阶段。在这种情况下,研究所除了在人员工资、生产原料需要由无名负担外,各种生产、加工设备几乎都是免费提供给无名使用,这样,他的公司的生产成本就更低了。
在无名公司快速发展的同时,他也遇到了一些小问题。由于研究所现有的设备比较陈旧,生产人员水平也参差不齐。在产品的生产工艺方面的造型和细致程度上都难以和通用公司的产品相抗衡。因此,无名希望创建国内数字化医疗设备知名品牌的设想就难以在短期内得以实现。
要提高这些工艺水平,无名就需要购买比较昂贵的加工设备和聘用大批高级技工。而当时在无名当时手里的周转资金是难以实现这个目标的。
无名在那个时候还没有融资的概念,用他的话说那时候根本不知道什么叫做融资。唯一的想法就是尽快提高销售额,然后通过产品利润挣到技术改造需要 的资金。就在这个时候,恰好一个在国外留学多年的朋友回国了,而恰好这个朋友就在国内的一家风险投资公司工作,恰好他们这家风险投资公司投资的领域和无名 所经营的业务完全一致。
这么多“恰好”是不是让你们大家都觉得像在编故事,其实在中国商业市场中又有哪一个商业奇迹不是由恰好构成的。
盛大公司的陈天桥,在从事动画事业面临倒闭危机的时候,恰好遇到访华的韩国游戏企业。因此,陈天桥才决定弃动画而上游戏,此举是他如今进入中国 富豪行列的关键步骤。已经在美国成功上市的分众传媒,其董事长江南春,当年也是在分众传媒赔掉自己腰包里面的三千万元,准备放弃的时候,恰好遇到同在一层 楼上办公的软银公司上海办事处首席代表余蔚。而余蔚恰好又在寻找合适的传媒项目投资,双方一拍即合。软银资金及时到位,才挽救了现在也是位居中国富豪榜之 列的江南春的大好前程。
这些“恰好”就是机会,也就是中国人说的天时。中国老祖宗曾提出过有关成功的哲学思想:天时、地利、人和三者缺一不可,而天时是其中最重要的。正所谓“谋事在人、成事在天”。
无名和这个恰好回国的朋友聊了整整一晚上,这番谈话使他觉得眼前好像出现了另外一个世界。这个朋友给他详细讲了什么是风险投资,以及如何通过风险投资这种资本运作的手段迅速帮助公司达到跨越式发展的目的。
经过初步接触以后,无名按照朋友的建议写了一份仅仅有3页纸的十分简单的商业融资意向书交给了朋友所在的风险投资公司。很快,无名就得到了回复,对无名的意向表示出兴趣,双方经过一次面谈后,无名就开始根据对方的要求准备全面的商业计划书。
在朋友的推荐下,无名找到了一个专业的财务顾问帮助他一起完成这个计划书。在商业计划书里面,无名根据朋友的建议提出要求投资方投资500万 元,其中100万元用来置换他们研究所原来在公司里的股份,也就是原来价值50万元的那部分股份,而研究所投入到公司里面的那些办公场地、试验场地研究所 也全部由研究所收回。如果以后无名的公司要继续使用这些场所则双方另行签订租赁协议。
风险投资公司一旦投资到位,则无名个人和投资公司双方的股权比例各占50%。无名还在商业计划书里面根据自己对于市场的了解和公司的发展,如实 的写了公司的市场计划和财务情况。由于无名这家公司的财务情况很清楚,现金流良好,公司又有自己的技术核心竞争力。同时,无名本人给予投资方的印象也很 好。再加上他们公司面临着中国国内未来巨大的市场空间。所以这份计划书很快就得到了投资方的认可。
风险投资公司和无名进行了两次比较正式的谈判,由于有朋友的指点,无名制作了一套很漂亮的PPT(幻灯片)在谈判的时候演示给投资方看。同时准 备了更加详细的文字版商业计划书以及用来解释商业计划书中有些过于专业问题和复杂背景的文字版附件资料发给投资公司每一位参与谈判的人。
这些充分的准备使得无名和风险投资公司的合作进展得很快,谈判以后风险投资公司又在一次没有通告的情况下考察了无名的公司,然后就迅速和无名签约,紧接着资金也马上到位了。
无名和研究所按照商量好的方案解除了关系,研究所也很满意,一年就收回了所有的投资还挣了100万元。无名更高兴,公司进一步发展的资金完全解决了。
在无名和风险投资公司签订的合同中,双方各占公司的50%股份。他的朋友告诉他,投资方购买的是他们公司未来的成就。投资方之所以不控股是为了 告诉无名投资方不会试图控制这家公司的,这样让无名就可以更加放心的工作。按照商业计划书,无名和风险投资商约定,这家公司将在3年后上市。从而风险投资 商可以顺利的把自己在公司的股份变成现金,拿走。
在这种情况下,由于公司的总资本增加了,实际上投资方等于送给了无名价值200万元的股权。所以这种形式在股权转让的融资中上也可以算是增资扩股的一种。这种转让股份的方式在学术上就叫做溢价转让。
在经过这次融资以后无名当然很高兴,研究所和投资方签订了股权转让协议,然后双方去工商局进行了股东变更,无名这家公司的注册资本也从100万元上升到500万元。
无名通过这次融资有了进行技术改造的资金。更重要的是,他开始了解到资本运营的好处。一家公司不仅可以通过市场行为,更可以通过融资的这种方式迅速让自己的资本增加。
在公司成立满两年的时候,无名开始着手进行公司内部的股权融资。这时候公司的资产总值已经超过了2千万元,无名这次融资的目的是就是想通过这种手段把公司员工的心更紧的能够连在一起。同时也是为这家公司的进一步发展再筹集一些资金。
企业内部股权融资就是把企业的部分股权卖给或者是送给企业的中高层管理人员,甚至有时候也会考虑那些在企业工作时间到达到一定年限的普通员工。这样做的好处就是可以让企业内部的人员均成为公司的股东,享受股东的权益,这样大家都会对企业的发展尽心竭力。
无名在准备实施这次融资前和公司的另外一位股东,也就是那个风险投资公司的代表进行了很好协商,然后无名把自己的公司从有限责任公司变更成为股 份公司,这样公司股东的最大数量也就从不再受到50个人的限制了。公司以现有资产的价格折算成为股权价格向内部员工转让了25%的股份,而无名自己这次也 套现了250万元现金。
无名第二次融资的方式在学术上叫做员工持股计划,即先在公司内部成立一个员工持股会,然后把这个组织在工商管理局注册成为社团法人,最后通过这个社团法人代表员工开始实施员工的持股权利。
由于第二次转让股权,无名的公司的股东人数再一次增员,当他的满足了公司规定的一些条件,比如当员工工作到了一定时间或者业绩达到一定水平,他就可以拥有期权----可以使用比较低的价格购买公司一定数量股份的权利。
这次融资以后,无名发现公司内部的活力得到了增加,员工的士气也大大的提高了,一些小问题也得到了大家的主动解决,公司整体上好像进入了一个欣 欣向荣的黄金时代。加,无名自己持有的股份已经下降到了37.5%,当然这时候无名还是公司最大的股东,而作为公司另一位大股东的风险投资商似乎也开始在 公司发展的有些问题上和无名进行更多的交流。
在实施完成公司的内部融资以后的半年中,风险投资商曾多次和无名谈及到鉴于公司发展的情况很好,他们希望尽早开始上市的计划。希望把原来预定3 年以后上市的计划提前一年。并且告诉无名,公司只有在上市以后才能够在资金、社会地位等多个方面进入一流企业的层次。如果能够以最快的速度上市,在市场上 的形象和品牌价值都会大大增加,这对于公司是很有利的!
无名本来丝毫没有为投资商的意见所动,他还是想踏踏实实先把业务作稳定了,再在考虑上市。但是他慢慢发现一种渴望上市的情绪在公司内部逐渐弥漫,这种情绪让很多人都骚动不安的。有时候甚至会影响到了公司正常的工作。
对此,无名在征求了一些企业中高层领导的意见以后,不得不开始按照投资商的建议,着手准备上市的工作了。这是无名成立这件公司以后第一次在重大决策上没有能够按照自己的计划实施。只是当时无名对于这种情况之所以会产生的原因并没有什么引起什么警觉。
上市的决定刚刚做出来,突然之间,仿佛一下子从各方面冒出来很多的投资者,他们都纷纷的来找无名,希望能够对无名的公司进行投资。为此,无名的 公司专门召开了一次股东会和一次董事会正式讨论这些事情。最后,股东们形成的一致意见是:公司现在融资的时机很好,应该及时吸收这些投资商进入,并确定了 这次融资的溢价条件和转让公司股权的比例。
这一次的融资使得公司的注册资本金上升到1亿元人民币,而无名在公司的股份也下降到15%,尽管他还是最大的股东。且总股本价值也上升到1500万元。
事后无名在会议中说:“当时我隐隐的感觉到,在很多问题上,风险投资商和员工持股的代表总是能够达成一致意见,自己反倒成为一个被说服的角色, 真是一件奇怪的事情。其实风险投资商之所以会愿意以巨大的风险给你的企业投资,就是期望获得巨大的利润,这实际上是一种投机资本最本质的表现。”
无名在这时候开始后悔当初没有搞清楚风险投资的本质就选择了通过这种方式进行融资。在和风险投资签订协议的时候他由于没有经验,在协议中也缺少 了很多约束性条款和自我保护性条款,最后导致在实际上市前,公司的经营节奏已经是被投机资本左右了。业务发展情况也不得不去适应完全逐利的投资资本的需 求,结果是:正常的业务为了适应上市工作,在眼前利益的驱使下,做了很多急功近利的事情。这样业务自身受到了能够造成久远影响的不小损失。
公司的这次融资使得无名的股权价值得到了明显的提升,但是他自己并不高兴。公司新股东的进入导致公司又发生了重大的变化,新加入公司的股东很快通过派驻到董事会的董事开始为这家公司的准备上市不断地施加自己的影响。
当时无名的公司在国内正常申请上市是不可能的,因为他们属于民营企业,资产和业绩都达不到证监会的要求,而在对买壳上市进行的调研和对一些壳公司的资源进行了考察以后,公司的决策层没有发现适合的壳资源。
这时候,在一些股东的建议下,公司开始考虑进行海外上市,首选的目标肯定是美国的纳斯达克股票市场(美国证券交易商协会自动报价系统)。
   公司是在发展到3年半的时候决定去纳斯达克上市的,这时候为了上市,公司聘请了某位国际著名公司曾经的CEO担任了公司的总裁,无名保留了董事长的职位。当然董事会最后决定这样做的理由也是冠冕堂皇的。
同时公司把主要注册地点也转移到了境外,还作了很多上市前的准备,聘请了国际著名的财务顾问公司加入上市准备的工作团队,所有的这一切无名几乎是抱着一种旁观的心态参与的。
他后来说自己好像当时就有一种预感,觉得这件事情以后会慢慢和他没有关系,所以这些人愿意怎么做他就跟着进行。而实际上,他自己对这家公司的控制权也已经变得越来越小。他提出的不同意见也经常在一次次的会议中被大多数董事们慢慢消磨,直到没有。
而对于在美国上市这样一个完全陌生的事情,无名经过很多朋友介绍和花费大量的时间仔细研究以后的结果就是:里面有着太多他不可能搞得清楚的东西,而以无名的经验告诉他:一旦一件事情里面有着太多你不可知,也不可能控的东西,那么你运作这件事情的危险程度就会变得很大。
他觉得像国外股票市场这种“资本游戏”的“天堂”里面,任何一个中国企业的老板在这里都会感觉到茫然无知。西方人为了这些东西不断设计和改进了400年,里面相互关联的复杂程度是让绝大多数中国的金融投资专家也望而生畏的,更别说是企业了。
无名的更多期望就是他自己呕心沥血建立起来的公司能够真的通过上市获得更好的发展,至少整个公司都弥漫着一种兴奋的气氛,每个员工脸上都洋溢着 兴奋,如果这次上市真的能够让那些拿着公司股份期待一夜暴富的员工们最终能够满足自己的愿望,无名觉得就算自己像一个没有头脑的人一样,完全听任那些专业 的投资商和财务顾问公司的指令行事,也值了。
后来的事情就是路演,然后不断签署各种文件,接着是一家家的去拜访那些国外著名的股票承销商,说一些很类似的话。
公司在上市前曾经再次进行了增资扩股,公司的总资产达到了3亿元,无名这时候在公司剩下的股权已经不到10%,尽管这次他股权价值又增加了不少!可以他心里总是沉甸甸的!
无名的这种状态可能是由于他天生就想成为一个真正的企业家的缘故吧。在中国绝大多数的企业老板还是以挣钱为最终目的的,所以这种股权转让的方式是可以让这些老板兜里的钱很快增长起来的。
无名的公司于2005年初成功在纳斯达克上市,无名自己也套现了几千万元。公司上市以后,无名很快就辞掉了董事长职务,然后度过了三个月的隐居生活。用他自己的话说就是韬光养晦,为再次的一飞冲天做准备。
从很多创业者的角度看,无名的商业生涯应该算是很成功的,这次他的退出只是他对于自己的商业生活品质要求比较高的一种结果,他不是那种愿意让别人摆布的人,他喜欢控制和实际操作。现在公司的情况让他觉得太累了,他宁可重新做一家公司也不愿意再在这里生存了。
无名在他后来的回忆中说:“通过转让股权融资绝不像它表面上看起来那么简单,只要是围绕资本运行的东西都需要你自己的公司有一个完善的股份治理 结构和财务管理体系作支撑,但是中国有几家公司的股份治理结构能够叫做完善呢?我不知道。有几家公司的财务管理体系能够叫做完善呢?我也不知道。很多事情 只有你做了才发现绝不像你想象的那样容易。
为什么那么多的优秀公司一旦上市了以后就会发展的很慢甚至迅速变成亏损,这些公司的老板难道都不想把公司做好吗?答案大家都看得见!但是企业老 板们还是为了眼前的利益或者融资的需要拼命的争取上市,而通过上市这种手段洗礼过的公司会发生什么明显的变化和心理上的差异是绝大多数中国老板都没有想明 白的,这种走一步看一步或者没看明白就走进去的心态实际上是害人的!”
公司上市不是不好,但是这里面有很多学问,比如合理的分拆以后根据发展需要把部分业务重新包装以后上市,或者把上市作为一种手段进行公司内部管 理的对冲。这些游戏西方人玩了几百年,应该已经是很熟练了,但还是不断有很多人利用相关规则的漏洞设置骗局,每年都有一些全球知名的公司落入这些圈套里。 而我们中国的股市且不说自身是否完善,单单对于里面的基本规则,绝大多数的企业老板都还根本没有摸到门路,在这种情况下选择上市或者私募就是十分危险的事 情了。”
无名在谈到未来新公司的发展时还说:“在使用股权转让这种方式融资的时候,要特别注意投资方资本的属性,如果你感觉投资方式带有明显的投机意向的,你就要十分小心了。这种投资商入股到你的公司以后是不可能完全不影响你们公司正常业务的发展的。
中国那些被投资资本玩来玩去的公司老板真的很被悲哀,我不会认输的,我这次开办的新公司一定还要使用股权转让的方式进行融资,一定还会去触及“资本游戏”,不过这次我相信我是不会输的。”
有个南方的老板在听完无名的故事以后谈了一句心里话:“在中国也许装傻的才是最聪明的。很多时候谁知道到底是投资商在玩企业老板,还是企业老板在玩投资商呢?每个人的目的不一样,如果做生意就是为了挣钱,被玩又有什么关系呢?”这也算是仁者见仁,智者见智了。
2、融资决定创业行为的最终“输赢”     现在大学生创业中,感觉最难的问题就是资金!那么在融资中是不是有人给钱就行了!为什么我要在这里强调融资这个概念!就是很少有人知道!
著名经济学家乔治•斯蒂格勒说:“美国著名企业中没有哪家不是采用以融资为基础的资本运营手段发展起来的。这个世界上已没有任何公司能仅依靠内部扩张而成长起来。”
美国经济情况代言人约翰•威廉姆森说:“融资中的债务和股权代表了公司的资本控制和治理结构。他们的比例是企业活力的基础。”
著名经济学家哈特说:“在企业发展中给予经营者以控制或激励并不重要,关键是要设计出合理的融资结构,这是限制经营者不以股东利益为代价而追求自己目标的最佳保证。”
    正心、修身、齐家、治国、平天下的保证!新浪的王志东,最后的出局。
3、创业中具体解决融资的方案和要决     三种融资方式!每一种的特点!那些是和大学生创业者!
4、创业者需要迈出的关键两步
潜规则状态,全世界都有!比尔盖茨也一样有!然后是正式注册,和银行搞好关系!注册公司的程序,银行的程序、税务的程序。(国家规定程序)以及未来年审、变更等相关手续。国家对特种行业的规定。争取免税。
5、跨越大学生创业的三个“误区”
误区一:浮躁情绪。聪明和智慧的关系!作李四不做张三!要学会换位思考和仔细观察事物!要多读四书五经!
误区二:成功学不良诱导。价值排位取向偏激!要多学习老祖宗的思想!中庸之道最重要!
误区三:目光短浅!小企业很快就卖掉!
6、现场交流(根据情况可酌情安排)

一句话备忘

应该注意避免在查询中让MySQL进行自动类型转换,因为转换过程也会使索引变得不起作用。

LiteIM/FreePlus的取IP代码

这是LiteIM/FreePlus的取IP代码,感兴趣的朋友看看吧.
runjin的是汇编版本,这是c版本,希望有更多的人能读懂.后来者,愿它对你有益.闪了.
源码:
static const DWORD UnknownSig=0x1E3A86BA;
static const LPSTR  szQQUSER_DYNAMIC_DATA="QQUSER_DYNAMIC_DATA";
typedef void( *pPrepareDynData)(LPVOID IQQData,LPSTR szCmd,const DWORD* szSig,LPVOID* pDynamicData);
VOID PrepareData(LPVOID IQQData,LPVOID* pDynamicData)
{
    pPrepareDynData PrepareDynData=(pPrepareDynData)*(LONG *)(*(LONG *)IQQData+0x54);
    PrepareDynData(IQQData,szQQUSER_DYNAMIC_DATA,&UnknownSig,pDynamicData);
}

DWORD GetDyncDWORD(LPVOID DynamicData, int iOffset,LPCSTR szCmd)
{ DWORD dwRet=0;
__asm
{
lea eax,dwRet
push eax
push szCmd
mov eax, DynamicData
push eax
mov ecx,[eax]
mov eax,ecx
add eax,iOffset
call [eax]
}
return dwRet;
}

static const LPSTR szdwRecentIP="dwRecentIP";
static const LPSTR szdwIP="dwIP";
static const LPSTR szdwC2CIP="dwC2CIP";
DWORD GetIP(DWORD Uin)
{ DWORD dwRet=0;
LPVOID IQQData=NULL;
if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;
LPVOID DynamicData=NULL;
PrepareData(IQQData,&DynamicData);
if (NULL==DynamicData) return dwRet;
dwRet=GetDyncDWORD(DynamicData,0x34,szdwC2CIP);//ecx+18
if (dwRet) return dwRet;
dwRet=GetDyncDWORD(DynamicData,0x34,szdwIP);
if (dwRet) return dwRet;
dwRet=GetDyncDWORD(DynamicData,0x34,szdwRecentIP);
return dwRet;
}

static const LPSTR szwRecentPort="wRecentPort";
static const LPSTR szwPort= "wPort";
static const LPSTR szwC2CPort= "wC2CPort";
DWORD GetPort(DWORD Uin)
{ DWORD dwRet=0;
LPVOID IQQData=NULL;
if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;
LPVOID DynamicData=NULL;
PrepareData(IQQData,&DynamicData);
if (NULL==DynamicData) return dwRet;
dwRet=GetDyncDWORD(DynamicData,0x30,szwC2CPort);//ecx+14
if (dwRet) return dwRet;
dwRet=GetDyncDWORD(DynamicData,0x30,szwPort);
if (dwRet) return dwRet;
dwRet=GetDyncDWORD(DynamicData,0x30,szwRecentPort);
return dwRet;
}

static const LPSTR szwProcotol = "wProcotol";
DWORD GetVer(DWORD Uin)
{ DWORD dwRet=0;
LPVOID IQQData=NULL;
if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;
LPVOID DynamicData=NULL;
PrepareData(IQQData,&DynamicData);
if (NULL==DynamicData) return dwRet;
dwRet=GetDyncDWORD(DynamicData,0x30,szwProcotol);
return dwRet;
} 出处:ye-soft 作者:asaki