C/C++编写CGI程序之form处理
1. GET
2. POST
3. 结束
我们有一张web
test.html
1. GET
首先我们来获取GET方式的form
在环境变量QUERY_STRING里面,存储着GET提交的字符串
cgi-get.c
编译后,复制到cgi-bin目录下,名为test-get.cgi,确保apache用户拥有执行权限
然后登陆test.html,填写dorainm和linux测试get提交方式,获得
name=dorainm&pswd=linux
2. POST
POST是通过标准输入来获取form提交的字符串的
环境变量CONTENT_LENGTH里面,存储着POST提交的字符串的长度
看 test-post.c 的源码
同样,编译后复制到cgi-bin目录下,名为test-post.cgi
测试以POST方式提交guaicat和gnu,可以看到
name=guaicat&pswd=gnu
3. 结束
今天头非常痛,文字描述比较少,大家看代码
哪天有时间写个C++的CGI的类或者C语言CGI库吧
1. GET
2. POST
3. 结束
我们有一张web
test.html
<html>
<head>
<title>form test</title>
</head>
<body>
<form method="get" name="test-get" action="./cgi-bin/test-get.cgi">
<input name="name"><input name="pswd"><input type=submit value="get">
</form>
<br><br>
<form method="post" name="test-post" action="./cgi-bin/test-post.cgi">
<input name="name"><input name="pswd"><input type=submit value="post">
</form>
</body>
</html>
<head>
<title>form test</title>
</head>
<body>
<form method="get" name="test-get" action="./cgi-bin/test-get.cgi">
<input name="name"><input name="pswd"><input type=submit value="get">
</form>
<br><br>
<form method="post" name="test-post" action="./cgi-bin/test-post.cgi">
<input name="name"><input name="pswd"><input type=submit value="post">
</form>
</body>
</html>
1. GET
首先我们来获取GET方式的form
在环境变量QUERY_STRING里面,存储着GET提交的字符串
cgi-get.c
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
fprintf( stdout, "Content-type:text/html\n\n");
fprintf( stdout, "<html><title>get</title>\n");
if( getenv("QUERY_STRING" ) )
{
fprintf( stdout, getenv("QUERY_STRING" ) );
}
else
{
fprintf( stdout, "(NULL)\n" );
}
fprintf( stdout, "</html>\n" );
return 0;
};
#include <stdlib.h>
int main( void )
{
fprintf( stdout, "Content-type:text/html\n\n");
fprintf( stdout, "<html><title>get</title>\n");
if( getenv("QUERY_STRING" ) )
{
fprintf( stdout, getenv("QUERY_STRING" ) );
}
else
{
fprintf( stdout, "(NULL)\n" );
}
fprintf( stdout, "</html>\n" );
return 0;
};
编译后,复制到cgi-bin目录下,名为test-get.cgi,确保apache用户拥有执行权限
然后登陆test.html,填写dorainm和linux测试get提交方式,获得
name=dorainm&pswd=linux
2. POST
POST是通过标准输入来获取form提交的字符串的
环境变量CONTENT_LENGTH里面,存储着POST提交的字符串的长度
看 test-post.c 的源码
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
int i, n;
fprintf( stdout, "Content-type:text/html\n\n" );
fprintf( stdout, "<html><title>post</title>" );
if( getenv("CONTENT_LENGTH") )
{
n = atoi( getenv("CONTENT_LENGTH") );
}
else
{
n = 0;
fprintf( stdout, "(NULL)" );
}
for( i=0; i<n; i++ )
{
fputc( getc(stdin), stdout );
}
fprintf( stdout, "\n</html>\n" );
return 0;
}
#include <stdlib.h>
int main( void )
{
int i, n;
fprintf( stdout, "Content-type:text/html\n\n" );
fprintf( stdout, "<html><title>post</title>" );
if( getenv("CONTENT_LENGTH") )
{
n = atoi( getenv("CONTENT_LENGTH") );
}
else
{
n = 0;
fprintf( stdout, "(NULL)" );
}
for( i=0; i<n; i++ )
{
fputc( getc(stdin), stdout );
}
fprintf( stdout, "\n</html>\n" );
return 0;
}
同样,编译后复制到cgi-bin目录下,名为test-post.cgi
测试以POST方式提交guaicat和gnu,可以看到
name=guaicat&pswd=gnu
3. 结束
今天头非常痛,文字描述比较少,大家看代码
哪天有时间写个C++的CGI的类或者C语言CGI库吧
1 Vinton Cerf :号称互联网之父,TCIP/IP协议和互联网架构的合作设计者。他05年10月3日开始正式为Google工作,职位为"首席互联网传布官"。
2 Joshua Bloch :号称java教父,《Effective Java》《JAVA PUZZLE》的作者,JSR175标准的leader,J2SE 1.5的主要开发人员之一。
3 Guido Van Rossum: Python之父。Google把Python用的炉火纯青,有了Python之父的加盟,肯定如虎添翼了。
4 Andrew Morton: linux的二号人物。其在google的工作仍是继续维护linux2.6内核
5 Mark Lucovsky: Windows核心设计师。不晓得碰到了Morton会不会吵起来 :-)
6 Bram Moolenaar:Vim的作者
7 Darin Fisher :Mozilla项目主力开发者
8 Sean Egan: Gaim开发团队的leader
9 Greg Stein: Apache项目主要开发者,Apache基金会主席
10 Udi Manber: Amazon的A9搜索团队总监
11 Rob Pike,Plan 9 OS主力开发者
12 Adam Bosworth: BEA的首席架构师
13 Larry Brilliant: 网络先驱大慈善家,负责google.org
14 Andy Hertzfeld:曾经是Macintosh研发团队核心成员
15 Louis Monier:Internet搜索的发明者,eBay的前开发总监
16 Adndrew W Moore :卡内基美隆大学资讯与机器人工程学的教授,他将负责Google在匹兹堡新创立的实验室
17 Alan Davidson:Centre for Democracy & Technology的协理,他负责处理处理google与美国政府的关系
18 Ben Goodger:Firefox的主要设计者
//(已由Google 加入微软) 19 Danny Thorpe, Delphi开发者,原Borland首席科学家
20 Alexander Limi, plone创始人
21 David Presotto, plan 9创始人
2 Joshua Bloch :号称java教父,《Effective Java》《JAVA PUZZLE》的作者,JSR175标准的leader,J2SE 1.5的主要开发人员之一。
3 Guido Van Rossum: Python之父。Google把Python用的炉火纯青,有了Python之父的加盟,肯定如虎添翼了。
4 Andrew Morton: linux的二号人物。其在google的工作仍是继续维护linux2.6内核
5 Mark Lucovsky: Windows核心设计师。不晓得碰到了Morton会不会吵起来 :-)
6 Bram Moolenaar:Vim的作者
7 Darin Fisher :Mozilla项目主力开发者
8 Sean Egan: Gaim开发团队的leader
9 Greg Stein: Apache项目主要开发者,Apache基金会主席
10 Udi Manber: Amazon的A9搜索团队总监
11 Rob Pike,Plan 9 OS主力开发者
12 Adam Bosworth: BEA的首席架构师
13 Larry Brilliant: 网络先驱大慈善家,负责google.org
14 Andy Hertzfeld:曾经是Macintosh研发团队核心成员
15 Louis Monier:Internet搜索的发明者,eBay的前开发总监
16 Adndrew W Moore :卡内基美隆大学资讯与机器人工程学的教授,他将负责Google在匹兹堡新创立的实验室
17 Alan Davidson:Centre for Democracy & Technology的协理,他负责处理处理google与美国政府的关系
18 Ben Goodger:Firefox的主要设计者
//(已由Google 加入微软) 19 Danny Thorpe, Delphi开发者,原Borland首席科学家
20 Alexander Limi, plone创始人
21 David Presotto, plan 9创始人
shell特有变量
$ # 传递到脚本的参数个数$ * 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
$ $ 脚本运行的当前进程I D号
$ ! 后台运行的最后一个进程的进程I D号
$ @ 与$ #相同,但是使用时加引号,并在引号中返回每个参数
$ - 显示s h e l l使用的当前选项,与s e t命令功能相同
$ ? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
使用/etc/init.d/funtction里的函数来进行进程的启动,状态,停止。
开机自动打开NUMLOCK
for t in `seq 1 8`
do
setleds -D +num
$t>/dev/null
done
参数 -D 才能改变default flags
当然如果把num换成caps,scroll就能改变capslock、scrolllock的状态注:man setleds
在SHELL程序中实现‘按任意键继续’
#!/bin/sh
get_char()
{
SAVEDSTTY=`stty -g`
stty -echo
stty raw
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -raw
stty echo
stty $SAVEDSTTY
}
echo "Press any key to continue..."
char=`get_char` 注:man stty
如何批量杀掉进程
ps -ef |grep java |grep -v grep |awk '{print $2}' |xargs kill -9
批量启动进程
#! /bin/sh
if [ $# -lt "4" ]
then
echo usage: process port username_start username_stop
fi
name=$1
i=$3
j=$4
port=$2
while(( i < j ))
do
$name $port user$i arg1 arg2 &
((i++))
((port++))
done
$ # 传递到脚本的参数个数$ * 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
$ $ 脚本运行的当前进程I D号
$ ! 后台运行的最后一个进程的进程I D号
$ @ 与$ #相同,但是使用时加引号,并在引号中返回每个参数
$ - 显示s h e l l使用的当前选项,与s e t命令功能相同
$ ? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
使用/etc/init.d/funtction里的函数来进行进程的启动,状态,停止。
开机自动打开NUMLOCK
for t in `seq 1 8`
do
setleds -D +num
$t>/dev/null
done
参数 -D 才能改变default flags
当然如果把num换成caps,scroll就能改变capslock、scrolllock的状态注:man setleds
在SHELL程序中实现‘按任意键继续’
#!/bin/sh
get_char()
{
SAVEDSTTY=`stty -g`
stty -echo
stty raw
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -raw
stty echo
stty $SAVEDSTTY
}
echo "Press any key to continue..."
char=`get_char` 注:man stty
如何批量杀掉进程
ps -ef |grep java |grep -v grep |awk '{print $2}' |xargs kill -9
批量启动进程
#! /bin/sh
if [ $# -lt "4" ]
then
echo usage: process port username_start username_stop
fi
name=$1
i=$3
j=$4
port=$2
while(( i < j ))
do
$name $port user$i arg1 arg2 &
((i++))
((port++))
done
“破解就这么难吗?对面商铺上周就已经开始卖能打电话的iPhone手机了,你怎么到现在还做不出来?”北京中关村科贸电子城,经营着两家手机专卖店的杨老板大声训斥着技术人员李书(化名)。
面对老板的斥责,李书只是揉了下布满血丝的眼睛,又把头埋在了电脑前。
他已经在电脑前坐了快一个星期了。由于苹果公司对只在美国发售的iphone手机采取了极其严格的验证机制,小李刚拿到崭新的iphone时几乎就是一块废铁——不能听音乐,不能发送短信,甚至都不能拨打电话。在他整整一周的努力后,iPhone的多数功能被破解,部分菜单也已被翻译成了中文,但时至今日,最关键的打电话功能依然没有破解。
此前,由于李书声称很快就可以完成破解工作,杨老板就提前在淘宝网上公布了预订破解版iPhone的时间。但随着破解受阻,他却只能眼睁睁地看着一个个预订客户流失到别人那里。
“我们这行,时间就是金钱。上周,第一批破解的iPhone手机每台都卖到了8000元以上,贵的甚至卖到了一万元左右,每台的利润都超过了4000元。为了能够让他快点破解,我花了一万多元买下了两台iPhone手机和全套的破解设备给他使用。但是没想到他那么没用,花了一周时间都搞不定,现在手机的价钱已经降到6000多元,再过几天就真的没什么赚头了。”面对记者,杨老板依然余怒未息。
而提起破解的过程,李书则是一脸的委屈。“我此前从来没有遇见过那么难破解的手机。”他告诉记者,尽管网上已经有了各种破解的视频教程,但他发现在实际操作中,破解的过程要比这些教程中所说的复杂得多。
“到目前为止,我还没听说有谁能将iPhone完全破解,目前市面上所谓的破解版本都或多或少存在问题。”李书说道。
尽管如此,种种迹象依然显示,一旦iPhone拨/接电话和收发短信等主要功能得以成功破解,这款划时代的手机将有望成为中国今年水货市场最璀璨的“明星”。
疯狂的iPhone
自从iPod播放器风靡全球之后,人们对于苹果产品的崇拜进入了癫狂的状态,其新近推出的iPhone手机当然也不例外。
从诞生之日起,iPhone这部被分析师誉为“时尚最佳工业设计之一”的手机、多媒体播放器和无线上网设备的综合体就承载了太多的赞誉,吸引了太多的眼球。
6月29日,美国东部时间18点整,一位顾客走进了纽约第五大街的苹果专卖店,在苹果公司职员的掌声中接过了iPhone公开发售的第一台手机。为了争得这个第一,他已经在门口风餐露宿了4天之久。而在此后的几个小时内,苹果公司的合作商AT&T的1800多家零售店中的所有iPhone就被抢购一空。
眼见一机难求,不少消费者不得不转而求助于互联网。在拍卖网站eBay上,不少原价599美元的iPhone被人标上了1000美元以上的高价,但购买者却依然趋之若鹜。据一项统计数据显示,在48小时内,iPhone的销量就突破了27万台。
而在大洋彼岸的中国,虽然iPhone尚没有进入中国的时间表,但是水货正在让iPhone手机如《越狱》般成为当下最热的话题。
在上市短短一周后,使用黑客手段激活iphone的方法就在互联网上流传开来,被激活的iPhone可以使用除了拨打/接听电话和收发短信外的所有功能。公开这个方法的正是以破解DVD分区和苹果iTunes音乐销售网站数字版权管理(DRM)程序而知名的黑客“DVD乔恩”。
尽管受到了国内粉丝极大的关注,但由于没有电话功能的iPhone只相当于一个宽屏的iPod,近万元的价格还是让绝大多数人望而却步。
“问的人络绎不绝,但很多都是随便问问,我们真正卖出去的货只有两台。”一位手机店店主告诉记者。
7月29日:iPhone松绑日
直到7月29日,一部视频的出现让这一切都完全改变了。
在YouTube网站,一位名为“ozbimmer”的澳大利亚黑客贴出了一段演示自己破解iPhone全过程的视频。从视频中可以看出,经他破解后的iPhone可以拨打电话,但不能接收电话或者发送/接收短信。
尽管迫于压力,他很快便删除了这段视频并拒绝接受任何采访,但这段视频已经随着互联网流遍全球,并被认为是全球黑客在破解iPhone上取得的最大突破。
“我在听说这个消息后马上就联系供货商订货了。” 杨老板告诉记者。
但他的动作已经慢了一拍。
当他打电话到供货商那里的时候,对方的回答却是——断货。着急的杨老板不得不和对方软磨硬泡,看在多年合作的关系上,供货商才发了两台容量4GB的iPhone给他。“8GB的绝对没有了。”对方斩钉截铁地说道。
据记者不完全统计,自从电话功能被破解以来,iPhone在中国的销量已经翻了数倍。仅以科贸电子城为例,卖掉5台以上iPhone的商家就至少有两家,据商家透露,每台iPhone的利润至少都在1000元以上。随着iPhone的火热,各种相关的破解工具一时也是“洛阳纸贵”。
在目前,全世界破解iPhone电话功能的手段都大同小异。简单来说,就是通过穷举法等技术手段获取AT&T和当地运营商SIM卡中的信息后,将其融合到一张新的IC卡上。通过这样的处理,这张IC卡就能够在使用本地运营商的网络同时 “瞒过” iPhone的鉴别程序。
在这个复杂的流程中有两样东西十分关键。一样是写卡器,另一样是一种被俗称为877卡的IC卡。随着iPhone的火热,这些破解工具一时之间也变得炙手可热起来。
“877卡100元1张,你不买过两天就没了。”在淘宝上,一位卖家语气强硬地告诉记者。而杨老板一周前在此订购的价格仅仅是30元。
据了解,由于需求量较小,这种IC卡已经停产多时。而随着iphone破解的火热,许多商家都在大量购入以备不时之需,这就导致了此类IC卡价格的疯涨。
记者于截稿前获悉,iPhone在中国的隐秘流行甚至惊动了IC卡产业链的上游,台湾一些IC卡厂商已经接到了国内的订单,即将恢复对877卡的生产。
热潮下的隐忧
面对这场来势汹汹的iPhone热潮,一些专家却表现得忧心忡忡,并对国内狂热的消费者提出了警告。
“首先,不管购买还是销售水货手机都是违法行为,任何交易环节中出现问题,消费者都是得不到法律保护的。”法律专家告诉记者。
不仅于此,机器本身的风险同样让消费者无法回避。
“手机为了破解电话功能,许多人将自己的的SIM卡邮寄给了商家,简直就是开门揖盗。”一位业内人士向记者透露,许多消费者根本没有意识到,自己的这种做法有着极大的风险。
“商家在获得SIM卡后可以轻易克隆一张一模一样的卡进行盗打,由此产生的话费则都将由消费者承担。”他担忧地表示。
记者了解到,事实上在iPhone流行之前,877卡的一个主要的非法用途就是克隆SIM卡并盗打他人电话。而拥有破解技术的商家对克隆SIM卡的技术更是驾轻就熟,而买家对此则几乎没有任何有效的防范手段。
此外由于违反了使用条款,经过破解的iPhone也无法享受到苹果方面的保修服务。尽管不少商家拍胸脯保证将为买家提供半年或一年的保修,但这种保证的真实性却令人怀疑。
“我们可没能力提供保修,你手机坏了总不能让我们出钱帮你修啊。”杨老板说道。他认为,网上许多所谓能提供一年保修的商家不是对相关规定一无所知就是有意进行欺骗。
面对老板的斥责,李书只是揉了下布满血丝的眼睛,又把头埋在了电脑前。
他已经在电脑前坐了快一个星期了。由于苹果公司对只在美国发售的iphone手机采取了极其严格的验证机制,小李刚拿到崭新的iphone时几乎就是一块废铁——不能听音乐,不能发送短信,甚至都不能拨打电话。在他整整一周的努力后,iPhone的多数功能被破解,部分菜单也已被翻译成了中文,但时至今日,最关键的打电话功能依然没有破解。
此前,由于李书声称很快就可以完成破解工作,杨老板就提前在淘宝网上公布了预订破解版iPhone的时间。但随着破解受阻,他却只能眼睁睁地看着一个个预订客户流失到别人那里。
“我们这行,时间就是金钱。上周,第一批破解的iPhone手机每台都卖到了8000元以上,贵的甚至卖到了一万元左右,每台的利润都超过了4000元。为了能够让他快点破解,我花了一万多元买下了两台iPhone手机和全套的破解设备给他使用。但是没想到他那么没用,花了一周时间都搞不定,现在手机的价钱已经降到6000多元,再过几天就真的没什么赚头了。”面对记者,杨老板依然余怒未息。
而提起破解的过程,李书则是一脸的委屈。“我此前从来没有遇见过那么难破解的手机。”他告诉记者,尽管网上已经有了各种破解的视频教程,但他发现在实际操作中,破解的过程要比这些教程中所说的复杂得多。
“到目前为止,我还没听说有谁能将iPhone完全破解,目前市面上所谓的破解版本都或多或少存在问题。”李书说道。
尽管如此,种种迹象依然显示,一旦iPhone拨/接电话和收发短信等主要功能得以成功破解,这款划时代的手机将有望成为中国今年水货市场最璀璨的“明星”。
疯狂的iPhone
自从iPod播放器风靡全球之后,人们对于苹果产品的崇拜进入了癫狂的状态,其新近推出的iPhone手机当然也不例外。
从诞生之日起,iPhone这部被分析师誉为“时尚最佳工业设计之一”的手机、多媒体播放器和无线上网设备的综合体就承载了太多的赞誉,吸引了太多的眼球。
6月29日,美国东部时间18点整,一位顾客走进了纽约第五大街的苹果专卖店,在苹果公司职员的掌声中接过了iPhone公开发售的第一台手机。为了争得这个第一,他已经在门口风餐露宿了4天之久。而在此后的几个小时内,苹果公司的合作商AT&T的1800多家零售店中的所有iPhone就被抢购一空。
眼见一机难求,不少消费者不得不转而求助于互联网。在拍卖网站eBay上,不少原价599美元的iPhone被人标上了1000美元以上的高价,但购买者却依然趋之若鹜。据一项统计数据显示,在48小时内,iPhone的销量就突破了27万台。
而在大洋彼岸的中国,虽然iPhone尚没有进入中国的时间表,但是水货正在让iPhone手机如《越狱》般成为当下最热的话题。
在上市短短一周后,使用黑客手段激活iphone的方法就在互联网上流传开来,被激活的iPhone可以使用除了拨打/接听电话和收发短信外的所有功能。公开这个方法的正是以破解DVD分区和苹果iTunes音乐销售网站数字版权管理(DRM)程序而知名的黑客“DVD乔恩”。
尽管受到了国内粉丝极大的关注,但由于没有电话功能的iPhone只相当于一个宽屏的iPod,近万元的价格还是让绝大多数人望而却步。
“问的人络绎不绝,但很多都是随便问问,我们真正卖出去的货只有两台。”一位手机店店主告诉记者。
7月29日:iPhone松绑日
直到7月29日,一部视频的出现让这一切都完全改变了。
在YouTube网站,一位名为“ozbimmer”的澳大利亚黑客贴出了一段演示自己破解iPhone全过程的视频。从视频中可以看出,经他破解后的iPhone可以拨打电话,但不能接收电话或者发送/接收短信。
尽管迫于压力,他很快便删除了这段视频并拒绝接受任何采访,但这段视频已经随着互联网流遍全球,并被认为是全球黑客在破解iPhone上取得的最大突破。
“我在听说这个消息后马上就联系供货商订货了。” 杨老板告诉记者。
但他的动作已经慢了一拍。
当他打电话到供货商那里的时候,对方的回答却是——断货。着急的杨老板不得不和对方软磨硬泡,看在多年合作的关系上,供货商才发了两台容量4GB的iPhone给他。“8GB的绝对没有了。”对方斩钉截铁地说道。
据记者不完全统计,自从电话功能被破解以来,iPhone在中国的销量已经翻了数倍。仅以科贸电子城为例,卖掉5台以上iPhone的商家就至少有两家,据商家透露,每台iPhone的利润至少都在1000元以上。随着iPhone的火热,各种相关的破解工具一时也是“洛阳纸贵”。
在目前,全世界破解iPhone电话功能的手段都大同小异。简单来说,就是通过穷举法等技术手段获取AT&T和当地运营商SIM卡中的信息后,将其融合到一张新的IC卡上。通过这样的处理,这张IC卡就能够在使用本地运营商的网络同时 “瞒过” iPhone的鉴别程序。
在这个复杂的流程中有两样东西十分关键。一样是写卡器,另一样是一种被俗称为877卡的IC卡。随着iPhone的火热,这些破解工具一时之间也变得炙手可热起来。
“877卡100元1张,你不买过两天就没了。”在淘宝上,一位卖家语气强硬地告诉记者。而杨老板一周前在此订购的价格仅仅是30元。
据了解,由于需求量较小,这种IC卡已经停产多时。而随着iphone破解的火热,许多商家都在大量购入以备不时之需,这就导致了此类IC卡价格的疯涨。
记者于截稿前获悉,iPhone在中国的隐秘流行甚至惊动了IC卡产业链的上游,台湾一些IC卡厂商已经接到了国内的订单,即将恢复对877卡的生产。
热潮下的隐忧
面对这场来势汹汹的iPhone热潮,一些专家却表现得忧心忡忡,并对国内狂热的消费者提出了警告。
“首先,不管购买还是销售水货手机都是违法行为,任何交易环节中出现问题,消费者都是得不到法律保护的。”法律专家告诉记者。
不仅于此,机器本身的风险同样让消费者无法回避。
“手机为了破解电话功能,许多人将自己的的SIM卡邮寄给了商家,简直就是开门揖盗。”一位业内人士向记者透露,许多消费者根本没有意识到,自己的这种做法有着极大的风险。
“商家在获得SIM卡后可以轻易克隆一张一模一样的卡进行盗打,由此产生的话费则都将由消费者承担。”他担忧地表示。
记者了解到,事实上在iPhone流行之前,877卡的一个主要的非法用途就是克隆SIM卡并盗打他人电话。而拥有破解技术的商家对克隆SIM卡的技术更是驾轻就熟,而买家对此则几乎没有任何有效的防范手段。
此外由于违反了使用条款,经过破解的iPhone也无法享受到苹果方面的保修服务。尽管不少商家拍胸脯保证将为买家提供半年或一年的保修,但这种保证的真实性却令人怀疑。
“我们可没能力提供保修,你手机坏了总不能让我们出钱帮你修啊。”杨老板说道。他认为,网上许多所谓能提供一年保修的商家不是对相关规定一无所知就是有意进行欺骗。
利用hdparm提速硬盘
hdparm -X66 -d1 -m16 -c1 /dev/hda
-X66 ATA33=66, ATA66=68,此参数需谨慎设定,不懂最好不要用。
-d1 开启dma
-m16 设定MultSect为MaxMultSect
-c1 将操作模式设定为 32-bits
测试性能:hdparm -tT /dev/hda
保存设置:hdparm -k1 /dev/hda
查看设置:hdparm [-i] /dev/hda
不过好像保存设置不起作用,干脆写入到/etc/hdparm.conf文件得了,hdparm.conf中,hdparm命令的每一个参数都有一个对应的option,并且有详细的说明和例子,参照着写就可以了,这才是一劳永逸的办法。
/dev/hda {
dma = on
io32_support = 1
mult_sect_io = 16
#transfer_mode = 66
}
这四个选项分别对应上面说明的四个参数,基本上也是最常用的。
rpm形式的安装包转换为deb形式
alien xxx.rpm
Linux下有什么数据库设计工具或者建模工具么?
有的人使用wine模拟运行PowerDesigner,但似乎效果不怎么好。如果使用的是Mysql数据库,除了phpMyAdmin可用之外,还有DBDesigner,以及mysql官方的workbench(尚未正式发布)。据说DBDesigner也支持Oracle。参考1,参考2。
《DBDesigner的安装》
如何才能浏览中文的pdf文件?
不管是evince,或者是epdfview,默认安装都无法查看中文pdf文件的,会有乱码,解决方法:
distro:ubuntu linux dapper
1 sudo apt-get install evince
2 sudo apt-get install xpdf-chinese-simplified
3 你需要一个中文字体,simsun,fireflysun皆可。
cd /usr/share/fonts
sudo ln -s < 你的字体存放的路径> < 字体名>.ttf //记住一定是.ttf!!!不能是*.ttc,或是别的什么。我开始就挂在这里了
比如:sudo ln -s /media/hda1/windows/fonts/simsun.ttc simsun.ttf
//我开始就挂在这里了
4 打开/etc/xpdf/xpdfrc-chinese-simplefied
将displayCIDFontTT改为
displayCIDFontTT Adobe-GB1 /usr/share/fonts/simsun.ttf
即可!
5 现在你的xpdf,evince都能显示中文了!
关闭IPV6
修改/etc/modprobe.d/aliases文件,增加:
alias net-pf-10 ipv6 off
alias net-pf-10 off
alias ipv6 off
注释掉:
#alias net-pf-10 ipv6
再新建一个/etc/modprobe.d/bad_list文件,内容为:
alias net-pf-10 off
然后重启。
挂载fat32移动硬盘分区,不乱码,可读写
mount /dev/sda1 /media/sda1 -t vfat -o iocharset=utf8,rw,umask=0
umount /media/sda1;
挂载网上邻居共享的ntfs分区,中文不乱码,普通用户可读写
mount -o username=test,password=pass,iocharset=utf8,codepage=cp936,dmask=777,fmask=777 //xjl/f /media/share/xjl-f;
iocharset用utf-8不行,必须是utf8,codepage用936也不行,必须是cp936。
-t smbfs可以不写,自动识别。其他参数在前在后也没关系。
dmask和fmask如果不指定,那么root以外的用户就只能读取或者执行(r+x)。
;
文章引用自:
hdparm -X66 -d1 -m16 -c1 /dev/hda
-X66 ATA33=66, ATA66=68,此参数需谨慎设定,不懂最好不要用。
-d1 开启dma
-m16 设定MultSect为MaxMultSect
-c1 将操作模式设定为 32-bits
测试性能:hdparm -tT /dev/hda
保存设置:hdparm -k1 /dev/hda
查看设置:hdparm [-i] /dev/hda
不过好像保存设置不起作用,干脆写入到/etc/hdparm.conf文件得了,hdparm.conf中,hdparm命令的每一个参数都有一个对应的option,并且有详细的说明和例子,参照着写就可以了,这才是一劳永逸的办法。
/dev/hda {
dma = on
io32_support = 1
mult_sect_io = 16
#transfer_mode = 66
}
这四个选项分别对应上面说明的四个参数,基本上也是最常用的。
rpm形式的安装包转换为deb形式
alien xxx.rpm
Linux下有什么数据库设计工具或者建模工具么?
有的人使用wine模拟运行PowerDesigner,但似乎效果不怎么好。如果使用的是Mysql数据库,除了phpMyAdmin可用之外,还有DBDesigner,以及mysql官方的workbench(尚未正式发布)。据说DBDesigner也支持Oracle。参考1,参考2。
《DBDesigner的安装》
如何才能浏览中文的pdf文件?
不管是evince,或者是epdfview,默认安装都无法查看中文pdf文件的,会有乱码,解决方法:
distro:ubuntu linux dapper
1 sudo apt-get install evince
2 sudo apt-get install xpdf-chinese-simplified
3 你需要一个中文字体,simsun,fireflysun皆可。
cd /usr/share/fonts
sudo ln -s < 你的字体存放的路径> < 字体名>.ttf //记住一定是.ttf!!!不能是*.ttc,或是别的什么。我开始就挂在这里了
比如:sudo ln -s /media/hda1/windows/fonts/simsun.ttc simsun.ttf
//我开始就挂在这里了
4 打开/etc/xpdf/xpdfrc-chinese-simplefied
将displayCIDFontTT改为
displayCIDFontTT Adobe-GB1 /usr/share/fonts/simsun.ttf
即可!
5 现在你的xpdf,evince都能显示中文了!
关闭IPV6
修改/etc/modprobe.d/aliases文件,增加:
alias net-pf-10 ipv6 off
alias net-pf-10 off
alias ipv6 off
注释掉:
#alias net-pf-10 ipv6
再新建一个/etc/modprobe.d/bad_list文件,内容为:
alias net-pf-10 off
然后重启。
挂载fat32移动硬盘分区,不乱码,可读写
mount /dev/sda1 /media/sda1 -t vfat -o iocharset=utf8,rw,umask=0
umount /media/sda1;
挂载网上邻居共享的ntfs分区,中文不乱码,普通用户可读写
mount -o username=test,password=pass,iocharset=utf8,codepage=cp936,dmask=777,fmask=777 //xjl/f /media/share/xjl-f;
iocharset用utf-8不行,必须是utf8,codepage用936也不行,必须是cp936。
-t smbfs可以不写,自动识别。其他参数在前在后也没关系。
dmask和fmask如果不指定,那么root以外的用户就只能读取或者执行(r+x)。
;
文章引用自:
限制进程CPU占用率的问题,给出了一个shell脚本代码如下:
renice +10 `ps aux | awk '{ if ($3 > 0.8 && id -u $1 > 500) print $2}'`
其中用到ps获取进程信息,其实
ps中%CPU一列的意义是进程实际占有CPU时间和它存活时间的比值,这个值能反应进程对CPU的消耗,但不能准确反应进程所占CPU时间占整个系统CPU的百分比。
而top输出中的%CPU这一列正是进程所占CPU时间占整个系统CPU的百分比,用于限制进程CPU占用率更加合理,同时%MEM一列还反应了进程占用内存的百分比,可以用于限制进程内存占用率。
shell脚本代码如下:
#!/bin/sh
PIDS=`top -bn 1 | grep "^ *[1-9]" | awk '{ if($9 > 50 || $10 > 25 && id -u $2 > 500) print $1}'`
for PID in $PIDS
do
renice +10 $PID
echo "renice +10 $PID"
done
可以将这个脚本放到cron中运行,比如每分钟检查一次,只需以root身份添加crontab项:
#crontab -e
* * * * * limit.sh
以后每个一分钟就会检查一次,调整占用50%以上CPU或25%内存的进程的nice值,从而使这样的进程优先级变低,被调度的机会减少,同时会向root发邮件提示该进程被调整过。
不过,限制内存使用最好还是用PAM,RedHat可以在/etc/security/limits.conf中设置。
本页内容为:linux上限制用户进程数、cpu占用率、内存使用率等,该文章本站转载自网络,如有侵权请告之,我们将会及时将其删除,其正文内容如下:
edit /etc/pam.d/login
#%PAM-1.0
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_pwdb.so shadow nullok
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_pwdb.so
password required /lib/security/pam_cracklib.so
password required /lib/security/pam_pwdb.so shadow nullok use_authtok
session required /lib/security/pam_pwdb.so
session required /lib/security/pam_limits.so
you have to add the last two lines
edit /etc/security/limits.conf
可带参数:
issue=filename:指定其他配置文件,而不是缺省的/etc/issue.
noesc:不对配置文件中的转移字符进行解释。
配置文件说明:
debug:将调试信息写入日志
conf=filename:指定配置文件
配置文件说明:该配置文件每一行(一个条目)的语法如下:
在这里
可以是
用户名
用户组名,采用@group的语法
通配符*,表示任何
可以是
soft-表示软限制,可以超过该限制
hard-表示硬限制,有root设定,内核执行,不可以超过该限制
可以是
core-core文件大小 (KB)
data-最大数据大小(KB)
fsize-最大文件大小(KB)
memlock-最大可用内存空间(KB)
nofile-最大可以打开的文件数量
rss-最大可驻留空间(KB)
stack-最大堆栈空间(KB)
cpu-最大CPU使用时间(MIN)
nproc-最大运行进程数
as-地址空间限制
参考:http://blog.sina.com.cn/s/blog_53689eaf0101b5xd.html
renice +10 `ps aux | awk '{ if ($3 > 0.8 && id -u $1 > 500) print $2}'`
其中用到ps获取进程信息,其实
ps中%CPU一列的意义是进程实际占有CPU时间和它存活时间的比值,这个值能反应进程对CPU的消耗,但不能准确反应进程所占CPU时间占整个系统CPU的百分比。
而top输出中的%CPU这一列正是进程所占CPU时间占整个系统CPU的百分比,用于限制进程CPU占用率更加合理,同时%MEM一列还反应了进程占用内存的百分比,可以用于限制进程内存占用率。
shell脚本代码如下:
#!/bin/sh
PIDS=`top -bn 1 | grep "^ *[1-9]" | awk '{ if($9 > 50 || $10 > 25 && id -u $2 > 500) print $1}'`
for PID in $PIDS
do
renice +10 $PID
echo "renice +10 $PID"
done
可以将这个脚本放到cron中运行,比如每分钟检查一次,只需以root身份添加crontab项:
#crontab -e
* * * * * limit.sh
以后每个一分钟就会检查一次,调整占用50%以上CPU或25%内存的进程的nice值,从而使这样的进程优先级变低,被调度的机会减少,同时会向root发邮件提示该进程被调整过。
不过,限制内存使用最好还是用PAM,RedHat可以在/etc/security/limits.conf中设置。
本页内容为:linux上限制用户进程数、cpu占用率、内存使用率等,该文章本站转载自网络,如有侵权请告之,我们将会及时将其删除,其正文内容如下:
edit /etc/pam.d/login
#%PAM-1.0
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_pwdb.so shadow nullok
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_pwdb.so
password required /lib/security/pam_cracklib.so
password required /lib/security/pam_pwdb.so shadow nullok use_authtok
session required /lib/security/pam_pwdb.so
session required /lib/security/pam_limits.so
you have to add the last two lines
edit /etc/security/limits.conf
可带参数:
issue=filename:指定其他配置文件,而不是缺省的/etc/issue.
noesc:不对配置文件中的转移字符进行解释。
配置文件说明:
debug:将调试信息写入日志
conf=filename:指定配置文件
配置文件说明:该配置文件每一行(一个条目)的语法如下:
在这里
可以是
用户名
用户组名,采用@group的语法
通配符*,表示任何
可以是
soft-表示软限制,可以超过该限制
hard-表示硬限制,有root设定,内核执行,不可以超过该限制
可以是
core-core文件大小 (KB)
data-最大数据大小(KB)
fsize-最大文件大小(KB)
memlock-最大可用内存空间(KB)
nofile-最大可以打开的文件数量
rss-最大可驻留空间(KB)
stack-最大堆栈空间(KB)
cpu-最大CPU使用时间(MIN)
nproc-最大运行进程数
as-地址空间限制
参考:http://blog.sina.com.cn/s/blog_53689eaf0101b5xd.html
一、编码范围1. GBK (GB2312/GB18030)
\x00-\xff GBK双字节编码范围
\x20-\x7f ASCII
\xa1-\xff 中文
\x80-\xff 中文
2. UTF-8 (Unicode)
\u4e00-\u9fa5 (中文)
\x3130-\x318F (韩文
\xAC00-\xD7A3 (韩文)
\u0800-\u4e00 (日文)
ps: 韩文是大于[\u9fa5]的字符
正则例子:
preg_replace(”/([\x80-\xff])/”,”",$str);
preg_replace(”/([u4e00-u9fa5])/”,”",$str);
代码例子:
//判断内容里有没有中文-GBK (PHP)
function check_is_chinese($s){
return preg_match('/[\x80-\xff]./', $s)
\x00-\xff GBK双字节编码范围
\x20-\x7f ASCII
\xa1-\xff 中文
\x80-\xff 中文
2. UTF-8 (Unicode)
\u4e00-\u9fa5 (中文)
\x3130-\x318F (韩文
\xAC00-\xD7A3 (韩文)
\u0800-\u4e00 (日文)
ps: 韩文是大于[\u9fa5]的字符
正则例子:
preg_replace(”/([\x80-\xff])/”,”",$str);
preg_replace(”/([u4e00-u9fa5])/”,”",$str);
代码例子:
//判断内容里有没有中文-GBK (PHP)
function check_is_chinese($s){
return preg_match('/[\x80-\xff]./', $s)
在网上找了一些MYSQL C API编程的文章,看了后觉得还是写的不够充分,根据自己经验写了这篇《The MySQL C API 编程实例》,希望对需要调用到MYSQL的C的API的朋友有所帮助,附例中的环境为RedHat
在这篇文章里,我们将学会怎么使用MySQL 的C APIs(Application Programming Interfaces 编程接口)。为了很好地了解这篇文章,您需要具备以下前提知识:
C语言变量
C语言函数
C语言指针
简介
C APIs包含在mysqlclient库文件当中与MySQL的源代码一块发行,用于连接到数据库和执行数据库查询。有一些例子在MySQL原代码的clients目录里。
MySQL C 变量类型
以下变量类型在MySQL的库当中定义。我们需要这些变量是为了使用MySQL的函数。这些变量有详细的解释,但是这些解释对于写代码来说并不重要。
MYSQL
以下代码块是用来连接数据库的通讯过程,要连接MYSQL,必须建立MYSQL实例,通过mysql_init初始化方能开始进行连接,这个在后面会讲到。typedef struct st_mysql {
NET net; /* Communication parameters */
gptr connector_fd; /* ConnectorFd for SSL */
char *host,*user,*passwd,*unix_socket,
*server_version,*host_info,*info,*db;
unsigned int port,client_flag,server_capabilities;
unsigned int protocol_version;
unsigned int field_count;
unsigned int server_status;
unsigned long thread_id; /* Id for connection in server */
my_ulonglong affected_rows;
my_ulonglong insert_id; /* id if insert on table with NEXTNR */
my_ulonglong extra_info; /* Used by mysqlshow */
unsigned long packet_length;
enum mysql_status status;
MYSQL_FIELD *fields;
MEM_ROOT field_alloc;
my_bool free_me; /* If free in mysql_close */
my_bool reconnect; /* set to 1 if automatic reconnect */
struct st_mysql_options options;
char scramble_buff[9];
struct charset_info_st *charset;
unsigned int server_language;
} MYSQL;
MYSQL_RES
这个结构代表返回行的一个查询的(SELECT, SHOW, DESCRIBE, EXPLAIN)的结果。返回的数据称为“数据集”,用过数据库的朋友应该对数据库中查询后得到的结果集不会陌生,在C的API里对应的就是MYSQL_RES了,从数据库读取数据,最后就是从MYSQL_RES中读取数据。typedef struct st_mysql_res {
my_ulonglong row_count;
unsigned int field_count, current_field;
MYSQL_FIELD *fields;
MYSQL_DATA *data;
MYSQL_ROWS *data_cursor;
MEM_ROOT field_alloc;
MYSQL_ROW row; /* If unbuffered read */
MYSQL_ROW current_row; /* buffer to current row */
unsigned long *lengths; /* column lengths of current row */
MYSQL *handle; /* for unbuffered reads */
my_bool eof; /* Used my mysql_fetch_row */
} MYSQL_RES;
MYSQL_ROW
这是一个行数据的类型安全(type-safe)的表示。当前它实现为一个计数字节的字符串数组。(如果字段值可能包含二进制数据,你不能将这些视为空终止串,因为这样的值可以在内部包含空字节) 行通过调用mysql_fetch_row()获得。typedef char **MYSQL_ROW;
MYSQL_FIELD
这个结构包含字段信息,例如字段名、类型和大小。其成员在下面更详细地描述。你可以通过重复调用mysql_fetch_field()对每一列获得MYSQL_FIELD结构。字段值不是这个结构的部分;他们被包含在一个MYSQL_ROW结构中。
typedef struct st_mysql_field {
char *name; /* Name of column */
char *table; /* Table of column if column was a field */
char *def; /* Default value (set by mysql_list_fields) */
enum enum_field_types type; /* Type of field. Se mysql_com.h for types */
unsigned int length; /* Width of column */
unsigned int max_length; /* Max width of selected set */
unsigned int flags; /* Div flags */
unsigned int decimals; /* Number of decimals in field */
} MYSQL_FIELD;
my_ulonglong
typedef unsigned long my_ulonglong;
该类型用于行编号和mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()。这种类型提供0到1.84e19的一个范围。在一些系统上,试图打印类型my_ulonglong的值将不工作。为了打印出这样的值,将它变换到unsigned long并且使用一个%lu打印格式。例如:
printf (Number of rows: %lu\n", (unsigned long) mysql_num_rows(result));
连接MySQL,查询数据
现在假设MySQL已安装, 用户和数据表在数据库被创造。以防有什么不明问题的情况, 请参考www.mysql.com 网站。
前面已经说过,MySQL的库文件在mysqlclient。因此在编译MySQL程序的时候有必要加上-lmysqlclient编译选项。MySQL的头文件在/usr/include/mysql目录下(根据Linux的发行版本的不同,这个目录也有所不同),因此你的程序头部看起来有点这个样子: #include <mysql.h>
MySQL的变量类型和函数都包含在这个头文件当中
然后,我们需要创建连接数据库的变量,可以简单地这么做:MYSQL mysql;
在连接数据库之前,我们要调用以下函数初始化这个变量:mysql_init(&mysql);
然后,调用mysql_real_connect函数:MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned int clientflag);
该函数被调用连接到数据库。host是MySQL服务器的主机名,user是登录的用户名,passwd是登录密码,db是要连接的数据库,port是MySQL服务器的TCP/IP端口,unix_socket是连接类型,clientflag是MySQL运行成ODBC数据库的标记。在这篇文章当中该标记设成0,连接寻建立后,这个函数返回0。
现在可以连接数据库,进行查询了:char *query;
使用这个字符串我们可以创立任何SQL查询语句进行查询。执行这个查询的函数是:int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned int length);
mysql是我们前面用过的变量,q是SQL查询语句,length是这个查询语句的长度。如果查询成功,函数返回0。
查询之后,我们要到一个MYSQL_RES变量来使用查询的结果。以下这行创立这个变量:MYSQL_RES *res;
然后
res = mysql_store_result(&mysql);
对客户端而言,有两种方法处理结果集合。一种方法是通过调用mysql_store_result()立刻检索全部结果。该函数从服务器获得查询返回的所有行,并将他们存储在客户端。第二种方法是对客户通过调用mysql_use_result()初始化一个一行一行地结果集合的检索。该函数初始化检索,但是实际上不从服务器获得任何行。
在两种情况中,你通过mysql_fetch_row()存取行。用mysql_store_result()、mysql_fetch_row()储存取已经从服务器被取出的行。用mysql_use_result()、mysql_fetch_row()实际上从服务器检索行。调用mysql_fetch_lengths()可获得关于每行中数据值尺寸的信息。
在你用完一个结果集合以后,调用mysql_free_result()释放由它使用的内存。
两种检索机制是互补的。客户程序应该选择最适合他们的要求的途径。在实践中,客户通常更愿意使用mysql_store_result()。
该函数读出查询结果。
尽管可以很容易地查询了,要用这个查询的结果还要用到其它的函数。第一个是:
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
该函数把结果转换成“数组”。你可能注意到了,该函数返回的是MYSQL_ROW变量类型。以下语句创立那样的变量:
MYSQL_ROW row = mysql_fetch_row(res)
如前所解释的,变量row是一个字符串数组。也就是说,row[0]是数组的第一个值,row[1]是数组的第二个值...当我们用mysql_fetch_row的时候,接着变量row会取得结果的下一组的数据。当到了结果的尾部,该函数返回一负值。
使用数据集结束后,记得释放数据集,否则会发生内存泄漏,释放数据集函数如下:void mysql_free_result(MYSQL_RES *result)
释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为一个结果集合分配的内存。当你用完了一个结果集合时,你必须调用mysql_free_result()来释放它使用的内存。
最后我们要关闭这个连接:mysql_close(&mysql);
例子程序
执行一个select操作,从数据库中取数据,并执行一个insert操作,往数据库中插入数据,根据这两个操作你可以自由的扩展为任意数据库操作,
准备条件
1、已经安装mysql,上有数据库test,如果没有执行Create Databse test
建立数据库
2、test数据库上有表t1,如果没有,执行CREATE TABLE `t1` (
`id` int(11) default NULL,
`name` varchar(100) default NULL
)
建立表t1
testsql.c:
/* testsql.c
** An example to use MYSQL C API
** Copyright 2004 Coon Xu.
** Author: Coon Xu
** Date: 05 Nov 2004
*/
#include <mysql.h>
#include <stdio.h>
int main(){
MYSQL mysql; // need a instance to init
MYSQL_RES *res;
MYSQL_ROW row;
char *query;
int t,r;
// connect the database
mysql_init(&mysql);
if (!mysql_real_connect(&mysql,"localhost", "mmim", "mmim", "test",0,NULL,0))
{
printf( "Error connecting to database: %s\n",mysql_error(&mysql));
}
else printf("Connected...\n");
// get the result from the executing select query
query = "select * from t1";
t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));
if (t)
{
printf("Error making query: %s\n",
mysql_error(&mysql));
}
else printf("[%s] made...\n", query);
res = mysql_store_result(&mysql);
while(row = mysql_fetch_row(res))
{
for(t=0;t<mysql_num_fields(res);t++)
{
printf("%s ",row[t]);
}
printf("\n");
}
printf("mysql_free_result...\n");
mysql_free_result(res); //free result after you get the result
sleep(1);
// execute the insert query
query = "insert into t1(id, name) values(3, 'kunp')";
t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));
if (t)
{
printf("Error making query: %s\n",
mysql_error(&mysql));
}
else printf("[%s] made...\n", query);
mysql_close(&mysql);
return 0;
}
编译
假定mysql的头文件在/usr/include/mysql,库文件在/usr/lib/mysql,执行下列命令进行编译:
gcc testsql.c -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient
在这篇文章里,我们将学会怎么使用MySQL 的C APIs(Application Programming Interfaces 编程接口)。为了很好地了解这篇文章,您需要具备以下前提知识:
C语言变量
C语言函数
C语言指针
简介
C APIs包含在mysqlclient库文件当中与MySQL的源代码一块发行,用于连接到数据库和执行数据库查询。有一些例子在MySQL原代码的clients目录里。
MySQL C 变量类型
以下变量类型在MySQL的库当中定义。我们需要这些变量是为了使用MySQL的函数。这些变量有详细的解释,但是这些解释对于写代码来说并不重要。
MYSQL
以下代码块是用来连接数据库的通讯过程,要连接MYSQL,必须建立MYSQL实例,通过mysql_init初始化方能开始进行连接,这个在后面会讲到。typedef struct st_mysql {
NET net; /* Communication parameters */
gptr connector_fd; /* ConnectorFd for SSL */
char *host,*user,*passwd,*unix_socket,
*server_version,*host_info,*info,*db;
unsigned int port,client_flag,server_capabilities;
unsigned int protocol_version;
unsigned int field_count;
unsigned int server_status;
unsigned long thread_id; /* Id for connection in server */
my_ulonglong affected_rows;
my_ulonglong insert_id; /* id if insert on table with NEXTNR */
my_ulonglong extra_info; /* Used by mysqlshow */
unsigned long packet_length;
enum mysql_status status;
MYSQL_FIELD *fields;
MEM_ROOT field_alloc;
my_bool free_me; /* If free in mysql_close */
my_bool reconnect; /* set to 1 if automatic reconnect */
struct st_mysql_options options;
char scramble_buff[9];
struct charset_info_st *charset;
unsigned int server_language;
} MYSQL;
MYSQL_RES
这个结构代表返回行的一个查询的(SELECT, SHOW, DESCRIBE, EXPLAIN)的结果。返回的数据称为“数据集”,用过数据库的朋友应该对数据库中查询后得到的结果集不会陌生,在C的API里对应的就是MYSQL_RES了,从数据库读取数据,最后就是从MYSQL_RES中读取数据。typedef struct st_mysql_res {
my_ulonglong row_count;
unsigned int field_count, current_field;
MYSQL_FIELD *fields;
MYSQL_DATA *data;
MYSQL_ROWS *data_cursor;
MEM_ROOT field_alloc;
MYSQL_ROW row; /* If unbuffered read */
MYSQL_ROW current_row; /* buffer to current row */
unsigned long *lengths; /* column lengths of current row */
MYSQL *handle; /* for unbuffered reads */
my_bool eof; /* Used my mysql_fetch_row */
} MYSQL_RES;
MYSQL_ROW
这是一个行数据的类型安全(type-safe)的表示。当前它实现为一个计数字节的字符串数组。(如果字段值可能包含二进制数据,你不能将这些视为空终止串,因为这样的值可以在内部包含空字节) 行通过调用mysql_fetch_row()获得。typedef char **MYSQL_ROW;
MYSQL_FIELD
这个结构包含字段信息,例如字段名、类型和大小。其成员在下面更详细地描述。你可以通过重复调用mysql_fetch_field()对每一列获得MYSQL_FIELD结构。字段值不是这个结构的部分;他们被包含在一个MYSQL_ROW结构中。
typedef struct st_mysql_field {
char *name; /* Name of column */
char *table; /* Table of column if column was a field */
char *def; /* Default value (set by mysql_list_fields) */
enum enum_field_types type; /* Type of field. Se mysql_com.h for types */
unsigned int length; /* Width of column */
unsigned int max_length; /* Max width of selected set */
unsigned int flags; /* Div flags */
unsigned int decimals; /* Number of decimals in field */
} MYSQL_FIELD;
my_ulonglong
typedef unsigned long my_ulonglong;
该类型用于行编号和mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()。这种类型提供0到1.84e19的一个范围。在一些系统上,试图打印类型my_ulonglong的值将不工作。为了打印出这样的值,将它变换到unsigned long并且使用一个%lu打印格式。例如:
printf (Number of rows: %lu\n", (unsigned long) mysql_num_rows(result));
连接MySQL,查询数据
现在假设MySQL已安装, 用户和数据表在数据库被创造。以防有什么不明问题的情况, 请参考www.mysql.com 网站。
前面已经说过,MySQL的库文件在mysqlclient。因此在编译MySQL程序的时候有必要加上-lmysqlclient编译选项。MySQL的头文件在/usr/include/mysql目录下(根据Linux的发行版本的不同,这个目录也有所不同),因此你的程序头部看起来有点这个样子: #include <mysql.h>
MySQL的变量类型和函数都包含在这个头文件当中
然后,我们需要创建连接数据库的变量,可以简单地这么做:MYSQL mysql;
在连接数据库之前,我们要调用以下函数初始化这个变量:mysql_init(&mysql);
然后,调用mysql_real_connect函数:MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned int clientflag);
该函数被调用连接到数据库。host是MySQL服务器的主机名,user是登录的用户名,passwd是登录密码,db是要连接的数据库,port是MySQL服务器的TCP/IP端口,unix_socket是连接类型,clientflag是MySQL运行成ODBC数据库的标记。在这篇文章当中该标记设成0,连接寻建立后,这个函数返回0。
现在可以连接数据库,进行查询了:char *query;
使用这个字符串我们可以创立任何SQL查询语句进行查询。执行这个查询的函数是:int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned int length);
mysql是我们前面用过的变量,q是SQL查询语句,length是这个查询语句的长度。如果查询成功,函数返回0。
查询之后,我们要到一个MYSQL_RES变量来使用查询的结果。以下这行创立这个变量:MYSQL_RES *res;
然后
res = mysql_store_result(&mysql);
对客户端而言,有两种方法处理结果集合。一种方法是通过调用mysql_store_result()立刻检索全部结果。该函数从服务器获得查询返回的所有行,并将他们存储在客户端。第二种方法是对客户通过调用mysql_use_result()初始化一个一行一行地结果集合的检索。该函数初始化检索,但是实际上不从服务器获得任何行。
在两种情况中,你通过mysql_fetch_row()存取行。用mysql_store_result()、mysql_fetch_row()储存取已经从服务器被取出的行。用mysql_use_result()、mysql_fetch_row()实际上从服务器检索行。调用mysql_fetch_lengths()可获得关于每行中数据值尺寸的信息。
在你用完一个结果集合以后,调用mysql_free_result()释放由它使用的内存。
两种检索机制是互补的。客户程序应该选择最适合他们的要求的途径。在实践中,客户通常更愿意使用mysql_store_result()。
该函数读出查询结果。
尽管可以很容易地查询了,要用这个查询的结果还要用到其它的函数。第一个是:
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
该函数把结果转换成“数组”。你可能注意到了,该函数返回的是MYSQL_ROW变量类型。以下语句创立那样的变量:
MYSQL_ROW row = mysql_fetch_row(res)
如前所解释的,变量row是一个字符串数组。也就是说,row[0]是数组的第一个值,row[1]是数组的第二个值...当我们用mysql_fetch_row的时候,接着变量row会取得结果的下一组的数据。当到了结果的尾部,该函数返回一负值。
使用数据集结束后,记得释放数据集,否则会发生内存泄漏,释放数据集函数如下:void mysql_free_result(MYSQL_RES *result)
释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为一个结果集合分配的内存。当你用完了一个结果集合时,你必须调用mysql_free_result()来释放它使用的内存。
最后我们要关闭这个连接:mysql_close(&mysql);
例子程序
执行一个select操作,从数据库中取数据,并执行一个insert操作,往数据库中插入数据,根据这两个操作你可以自由的扩展为任意数据库操作,
准备条件
1、已经安装mysql,上有数据库test,如果没有执行Create Databse test
建立数据库
2、test数据库上有表t1,如果没有,执行CREATE TABLE `t1` (
`id` int(11) default NULL,
`name` varchar(100) default NULL
)
建立表t1
testsql.c:
/* testsql.c
** An example to use MYSQL C API
** Copyright 2004 Coon Xu.
** Author: Coon Xu
** Date: 05 Nov 2004
*/
#include <mysql.h>
#include <stdio.h>
int main(){
MYSQL mysql; // need a instance to init
MYSQL_RES *res;
MYSQL_ROW row;
char *query;
int t,r;
// connect the database
mysql_init(&mysql);
if (!mysql_real_connect(&mysql,"localhost", "mmim", "mmim", "test",0,NULL,0))
{
printf( "Error connecting to database: %s\n",mysql_error(&mysql));
}
else printf("Connected...\n");
// get the result from the executing select query
query = "select * from t1";
t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));
if (t)
{
printf("Error making query: %s\n",
mysql_error(&mysql));
}
else printf("[%s] made...\n", query);
res = mysql_store_result(&mysql);
while(row = mysql_fetch_row(res))
{
for(t=0;t<mysql_num_fields(res);t++)
{
printf("%s ",row[t]);
}
printf("\n");
}
printf("mysql_free_result...\n");
mysql_free_result(res); //free result after you get the result
sleep(1);
// execute the insert query
query = "insert into t1(id, name) values(3, 'kunp')";
t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));
if (t)
{
printf("Error making query: %s\n",
mysql_error(&mysql));
}
else printf("[%s] made...\n", query);
mysql_close(&mysql);
return 0;
}
编译
假定mysql的头文件在/usr/include/mysql,库文件在/usr/lib/mysql,执行下列命令进行编译:
gcc testsql.c -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient
下载
wget http://218.90.147.70/EverMore/EIO2007Beta/EIO2007BetaZH_Lin.tar.gz
解压
mkdir tmp
cd tmp
tar -xvf /media/hda10/EIO2007BetaZH_Lin.tar.gz -C .
安装
cd 4.1.1446.101ZH.B1simple
chmod a+x setup
sudo ./setup
安装过程中文是乱码,大家摸索着选吧,也不难。
最后一步完成时弹出一个对话框,不知道在说什么。
但在控制台发现如下提示:
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# SIGSEGV (0xb) at pc=0xa77c3424, pid=12097, tid=2806041520
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_01-b08 mixed mode)
# Problematic frame:
# C [libX11.so.6+0x1e424] XFreeFontSet+0x15
#
# An error report file with more information is saved as hs_err_pid12097.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
刚才的对话框,可能是报告这个错误。
中文显示问题
这时候,已经有了Applications-Office-永中集中Office 2007菜单项
运行一下看看,发现中文全是方块
参考http://forum.ubuntu.org.cn/viewtopic.php?p=115165#115165
执行下面的指令,
sudo ln -s /usr/lib/jvm/java-1.5.0-sun-1.5.0.06/jre/ /usr/local/EIOffice/Jre
运行后汉字还是方块。
我想可能与locale有关,现在我的系统是en_US,可换了zh_CN后问题依然没有解决。
最后去/usr/local/EIOffice/Jre看了一下才发现了问题,链接的时间出错了,jre链到了Jre目录下,而我们是要替换Jre。
补救
sudo rm /usr/local/EIOffice/Jre/jre
sudo mv /usr/local/EIOffice/Jre /usr/local/EIOffice/Jre.bak
重新链接
sudo ln -s /usr/lib/jvm/java-1.5.0-sun-1.5.0.06/jre /usr/local/EIOffice/Jre
现在中文可以显示了,但效果不好。字体列表中仅有
Lucida Sans,Lucida Bright,Lucida Sans Typewriter
三种英文字体。新建文档时有永中宋体可用,但下拉框里是没有永中宋体的。
建立字体目录
mkdir /usr/X11R6/lib/X11/fonts/TrueType/ -p
链接永中宋体
sudo ln -s /usr/lib/X11/fonts/TrueType/yzdwsj6.ttf /usr/X11R6/lib/X11/fonts/TrueType/
链接其它常用字体
sudo ln -s /usr/share/fonts/zh_CN/*.tt? /usr/X11R6/lib/X11/fonts/TrueType/
这时再运行,应该发现宋体下拉列表已经有不少中文字体可选了
/usr/share/fonts/zh_CN/里的字体可能是任意你喜欢的字体,我这里使用windows的一些字体(盗版的)。
总结
这样,一个完美的中英文办公环境便产生了。用以上方法安装完成后,程序在中英文界面下均可正常运行,均可用scim输入汉字。
wget http://218.90.147.70/EverMore/EIO2007Beta/EIO2007BetaZH_Lin.tar.gz
解压
mkdir tmp
cd tmp
tar -xvf /media/hda10/EIO2007BetaZH_Lin.tar.gz -C .
安装
cd 4.1.1446.101ZH.B1simple
chmod a+x setup
sudo ./setup
安装过程中文是乱码,大家摸索着选吧,也不难。
最后一步完成时弹出一个对话框,不知道在说什么。
但在控制台发现如下提示:
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# SIGSEGV (0xb) at pc=0xa77c3424, pid=12097, tid=2806041520
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_01-b08 mixed mode)
# Problematic frame:
# C [libX11.so.6+0x1e424] XFreeFontSet+0x15
#
# An error report file with more information is saved as hs_err_pid12097.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
刚才的对话框,可能是报告这个错误。
中文显示问题
这时候,已经有了Applications-Office-永中集中Office 2007菜单项
运行一下看看,发现中文全是方块
参考http://forum.ubuntu.org.cn/viewtopic.php?p=115165#115165
执行下面的指令,
sudo ln -s /usr/lib/jvm/java-1.5.0-sun-1.5.0.06/jre/ /usr/local/EIOffice/Jre
运行后汉字还是方块。
我想可能与locale有关,现在我的系统是en_US,可换了zh_CN后问题依然没有解决。
最后去/usr/local/EIOffice/Jre看了一下才发现了问题,链接的时间出错了,jre链到了Jre目录下,而我们是要替换Jre。
补救
sudo rm /usr/local/EIOffice/Jre/jre
sudo mv /usr/local/EIOffice/Jre /usr/local/EIOffice/Jre.bak
重新链接
sudo ln -s /usr/lib/jvm/java-1.5.0-sun-1.5.0.06/jre /usr/local/EIOffice/Jre
现在中文可以显示了,但效果不好。字体列表中仅有
Lucida Sans,Lucida Bright,Lucida Sans Typewriter
三种英文字体。新建文档时有永中宋体可用,但下拉框里是没有永中宋体的。
建立字体目录
mkdir /usr/X11R6/lib/X11/fonts/TrueType/ -p
链接永中宋体
sudo ln -s /usr/lib/X11/fonts/TrueType/yzdwsj6.ttf /usr/X11R6/lib/X11/fonts/TrueType/
链接其它常用字体
sudo ln -s /usr/share/fonts/zh_CN/*.tt? /usr/X11R6/lib/X11/fonts/TrueType/
这时再运行,应该发现宋体下拉列表已经有不少中文字体可选了
/usr/share/fonts/zh_CN/里的字体可能是任意你喜欢的字体,我这里使用windows的一些字体(盗版的)。
总结
这样,一个完美的中英文办公环境便产生了。用以上方法安装完成后,程序在中英文界面下均可正常运行,均可用scim输入汉字。
这备忘录的状况
这备忘录提供信息为了这个互连网社会。这备忘录不指定任何一种性质的互连网的标
准。这备忘录的发行是无限期的。
摘要
这LDAP(1)定义了一个研究过滤器的网络表示法来传送给一个LDAP服务器。一些
应用软件可以发现它的用处来拥有描绘这个研究过滤器的一个普通的方法以一个人类能读
的形式。这个文档定义了一个人类能读的字符串格式为了LDAP研究过滤器。
目录
1。LDAP研究过滤器的定义 2
2。 字符串研究过滤器定义 2
3。 例子 3
4。 安全考虑 3
5。 参考 3
6。 作者地址 4
1。LDAP研究过滤器的定义
一个LDAP研究过滤器是被定义为如下(1):
Filter ::=CHOICE (
and (0) SET OF Filter,
or (1) SET OF Filter,
not (2) Filter,
equalityMatch (3) AttributeValueAssertion,
substrings [4] SubstringFilter,
greaterOrEqual [5] AttributeValueAssertion,
lessOrEqual [6] AttributeValueAssertion,
present [7] AttributeType,
approxMatch [8] AttributeValueAssertion
}
SubstringFilter ::= SEQUENCE {
type AttributeType,
SEQUENCE OF CHOICE {
initial [0] LDAPString,
any [1] LDAPString,
final [2] LDAPString
}
}
AttributeValueAssertion ::= SEQUENCE
attributeType AttributeType,
attributeValue AttributeValue
}
AttributeType ::= LDAPString
AttributeValue ::= OCTET STRING
LDAPString ::= OCTET STRING
这LDAPString上面的地方是有限在这IA5字符集里。这AttributeType是属性对象标识
符的一个字符串的表示法在这个星罗棋布的OID格式(e.g.,"2.5.4.10"),或者这个属性的更短
的字符串(e.g.,"organizationName",or"o").这AttributeValue
OCTET STRING有形式定义在(2)。这过滤器是为了传送使用基本编码规则定义的网络而
被编码在(3),以及简化描述在(1)。
2。 字符串研究过滤器定义
一个LDAP研究过滤器的字符串表示法是通过下列的BNF而被定义的。它使用一个前
缀格式。
::= '(' ')'
::= | | |
::= '&'
::= '|'
::= '!'
::= |
- ::=
| |
::=
::= | | |
::= '='
::= '~='
::= '>='
::= '<='
::= '=*'
::= '='
::= NULL |
::= '*'
::= NULL | '*'
::= NULL |
是一个字符串象征一个AttributeType,和有一个格式定义在(1)。是一个字
符串象征AttributeValue,
或者一部分,和有这个格式定义在(2)。假如一个必须包含字符‘*’或者‘(‘or’)’
的一个,这些字符应该被避免包含这反斜线符号‘\’字符。
3。 例子
这一段给予了一些使用这个标志的研究过滤器的一些例子。
(cn=Babs Jensen)
(!(cn=Tim Howes))
(&(objectClass=Person)(|(sn=Jensen)(cn=Babs J*)))
(o=univ*of*mich*)
4。 安全考虑
安全问题没在这个备忘录中讨论。
5。 参考
[1] Yeong, W., Howes, T., and S. Kille, "Lightweight Directory Access
Protocol", RFC 1487, Performance Systems International,
University of Michigan, ISODE Consortium, July 1993.
[2] Howes, T., Kille, S., Yeong, W., and C. Robbins, "The String
Representation of Standard Attribute Syntaxes", RFC 1488,
University of Michigan, ISODE Consortium, Performance Systems
International, NeXor Ltd., July 1993.
[3] "Specification of Basic Encoding Rules for Abstract Syntax
Notation One (ASN.1)", CCITT Recommendation X.209, 1988.
6。 作者地址
Tim Howes
University of Michigan
ITD Research Systems
535 W William St.
Ann Arbor, MI 48103-4943
USA
Phone: +1 313 747-4454
EMail: tim@umich.edu
RFC1558——A String Representation of LDAP Search Filters LDAP研究过滤器的字符串表达
这备忘录提供信息为了这个互连网社会。这备忘录不指定任何一种性质的互连网的标
准。这备忘录的发行是无限期的。
摘要
这LDAP(1)定义了一个研究过滤器的网络表示法来传送给一个LDAP服务器。一些
应用软件可以发现它的用处来拥有描绘这个研究过滤器的一个普通的方法以一个人类能读
的形式。这个文档定义了一个人类能读的字符串格式为了LDAP研究过滤器。
目录
1。LDAP研究过滤器的定义 2
2。 字符串研究过滤器定义 2
3。 例子 3
4。 安全考虑 3
5。 参考 3
6。 作者地址 4
1。LDAP研究过滤器的定义
一个LDAP研究过滤器是被定义为如下(1):
Filter ::=CHOICE (
and (0) SET OF Filter,
or (1) SET OF Filter,
not (2) Filter,
equalityMatch (3) AttributeValueAssertion,
substrings [4] SubstringFilter,
greaterOrEqual [5] AttributeValueAssertion,
lessOrEqual [6] AttributeValueAssertion,
present [7] AttributeType,
approxMatch [8] AttributeValueAssertion
}
SubstringFilter ::= SEQUENCE {
type AttributeType,
SEQUENCE OF CHOICE {
initial [0] LDAPString,
any [1] LDAPString,
final [2] LDAPString
}
}
AttributeValueAssertion ::= SEQUENCE
attributeType AttributeType,
attributeValue AttributeValue
}
AttributeType ::= LDAPString
AttributeValue ::= OCTET STRING
LDAPString ::= OCTET STRING
这LDAPString上面的地方是有限在这IA5字符集里。这AttributeType是属性对象标识
符的一个字符串的表示法在这个星罗棋布的OID格式(e.g.,"2.5.4.10"),或者这个属性的更短
的字符串(e.g.,"organizationName",or"o").这AttributeValue
OCTET STRING有形式定义在(2)。这过滤器是为了传送使用基本编码规则定义的网络而
被编码在(3),以及简化描述在(1)。
2。 字符串研究过滤器定义
一个LDAP研究过滤器的字符串表示法是通过下列的BNF而被定义的。它使用一个前
缀格式。
符串象征AttributeValue,
或者一部分,和有这个格式定义在(2)。假如一个
的一个,这些字符应该被避免包含这反斜线符号‘\’字符。
3。 例子
这一段给予了一些使用这个标志的研究过滤器的一些例子。
(cn=Babs Jensen)
(!(cn=Tim Howes))
(&(objectClass=Person)(|(sn=Jensen)(cn=Babs J*)))
(o=univ*of*mich*)
4。 安全考虑
安全问题没在这个备忘录中讨论。
5。 参考
[1] Yeong, W., Howes, T., and S. Kille, "Lightweight Directory Access
Protocol", RFC 1487, Performance Systems International,
University of Michigan, ISODE Consortium, July 1993.
[2] Howes, T., Kille, S., Yeong, W., and C. Robbins, "The String
Representation of Standard Attribute Syntaxes", RFC 1488,
University of Michigan, ISODE Consortium, Performance Systems
International, NeXor Ltd., July 1993.
[3] "Specification of Basic Encoding Rules for Abstract Syntax
Notation One (ASN.1)", CCITT Recommendation X.209, 1988.
6。 作者地址
Tim Howes
University of Michigan
ITD Research Systems
535 W William St.
Ann Arbor, MI 48103-4943
USA
Phone: +1 313 747-4454
EMail: tim@umich.edu
RFC1558——A String Representation of LDAP Search Filters LDAP研究过滤器的字符串表达
dns_get_mx -- 同getmxrr()取得mx記錄
語法: int getmxrr ( string hostname, array mxhosts [, array &weight])
說明 :
搜尋主機hostname的MX記錄,如果找到記錄則傳回true,如果找不到記錄或發生錯誤則傳回false。
搜尋到MX記錄的列表會放到陣列mxhosts中,如果有給予參數weight,它將會被收集到的資訊填滿。
//检查域名的mx记录是否指向新浪的邮件服务器
$sinamx = "mx.sinanet.com"; //新浪邮件服务器
$flag = 1; //默认为域名指向新浪邮件服务器
if( $domaintype == '2' ) //用户使用独立域名
{
if(dns_get_mx($domain, $mxrecords))
{
//没有指定邮件转发服务器
if(!isset($mxrecords) || (count($mxrecords) == 0))
{
$flag = 0;
}
//检查域名的mx是否指向新浪邮件服务器
for ($i = 0; ($flag == 1) && ($i < count($mxrecords)); $i++)
{
if( $mxrecords[$i] != $sinamx )
{
$flag = 0;
break;
}
}
<?php
$domain = "sinanet.com";
$domaintype = 2;
$sinamx = "mx.sinanet.com"; //新浪邮件服务器
$flag = 1; //默认为域名指向新浪邮件服务器
if( $domaintype == '2' ) //用户使用独立域名
{
if(dns_get_mx($domain, $mxrecords))
{
//没有指定邮件转发服务器
if(!isset($mxrecords) || (count($mxrecords) == 0))
{
$flag = 0;
}
//检查域名的mx是否指向新浪邮件服务器
for ($i = 0; ($flag == 1) && ($i < count($mxrecords)); $i++)
{
echo $mxrecords[$i]."\n";
if( $mxrecords[$i] != $sinamx )
{
$flag = 0;
break;
}
}
}
}
?>
語法: int getmxrr ( string hostname, array mxhosts [, array &weight])
說明 :
搜尋主機hostname的MX記錄,如果找到記錄則傳回true,如果找不到記錄或發生錯誤則傳回false。
搜尋到MX記錄的列表會放到陣列mxhosts中,如果有給予參數weight,它將會被收集到的資訊填滿。
//检查域名的mx记录是否指向新浪的邮件服务器
$sinamx = "mx.sinanet.com"; //新浪邮件服务器
$flag = 1; //默认为域名指向新浪邮件服务器
if( $domaintype == '2' ) //用户使用独立域名
{
if(dns_get_mx($domain, $mxrecords))
{
//没有指定邮件转发服务器
if(!isset($mxrecords) || (count($mxrecords) == 0))
{
$flag = 0;
}
//检查域名的mx是否指向新浪邮件服务器
for ($i = 0; ($flag == 1) && ($i < count($mxrecords)); $i++)
{
if( $mxrecords[$i] != $sinamx )
{
$flag = 0;
break;
}
}
<?php
$domain = "sinanet.com";
$domaintype = 2;
$sinamx = "mx.sinanet.com"; //新浪邮件服务器
$flag = 1; //默认为域名指向新浪邮件服务器
if( $domaintype == '2' ) //用户使用独立域名
{
if(dns_get_mx($domain, $mxrecords))
{
//没有指定邮件转发服务器
if(!isset($mxrecords) || (count($mxrecords) == 0))
{
$flag = 0;
}
//检查域名的mx是否指向新浪邮件服务器
for ($i = 0; ($flag == 1) && ($i < count($mxrecords)); $i++)
{
echo $mxrecords[$i]."\n";
if( $mxrecords[$i] != $sinamx )
{
$flag = 0;
break;
}
}
}
}
?>
代码提示:将下面的代码复制到〈BODY〉区
<style type="text/css">
<!--
td { font-size: 12px; line-height: 150%}
-->
</style>
<script language="JavaScript">
<!--
function hve_display(t_id,i_id){//显示隐藏程序
var t_id;//表格ID
var i_id;//图片ID
var on_img="image/119.gif";//打开时图片
var off_img="image/119.gif";//隐藏时图片
if (t_id.style.display == "none") {//如果为隐藏状态
t_id.style.display="";//切换为显示状态
i_id.src=on_img;}//换图
else{//否则
t_id.style.display="none";//切换为隐藏状态
i_id.src=off_img;}//换图
}
//-->
</script>
<table width="200">
<tr>
<td>
<table width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#006699">
<tr bgcolor="#006699">
<td bgcolor="#E28EEE"> </td>
<td width="20"><img src="image/119.gif" width="13" height="13" name="img1" style="cursor: hand"></td>
</tr>
<!--图片的ID是img1,要隐藏的表格ID是table1,onclick调用hve_display程序;style设置鼠标为手型。-->
</table>
<table ID="table1" width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#E28EEE" height="120">
<tr bgcolor="#FFFFFF">
<td bgcolor="#FCE3FD"><p><a href="#">七色风</a><br>
<a href="#">中讯数据</a> </p>
</td>
</tr>
</table>
<table width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#006699">
<tr bgcolor="#006699">
<td bgcolor="#E28EEE"> </td>
<td width="20"><img src="image/119.gif" width="13" height="13" name="img2" style="cursor: hand"></td>
</tr>
</table>
<table id="table2" width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#E28EEE" height="120">
<tr bgcolor="#FFFFFF">
<td bgcolor="#FCE3FD"> </td>
</tr>
</table>
<table width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#006699">
<tr bgcolor="#006699">
<td bgcolor="#E28EEE"> </td>
<td width="20"><img src="image/119.gif" width="13" height="13" name="img3" style="cursor: hand"></td>
</tr>
</table>
<table id="table3" width="201" border="0" cellspacing="1" cellpadding="0" bgcolor="#E28EEE" height="120">
<tr bgcolor="#FFFFFF">
<td bgcolor="#FCE3FD"> </td>
</tr>
</table>
<table width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#006699">
<tr bgcolor="#006699">
<td bgcolor="#E28EEE"> </td>
<td width="20"><img src="image/119.gif" width="13" height="13" name="img4" style="cursor: hand"></td>
</tr>
</table>
<table id="table4" width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#E28EEE" height="120">
<tr bgcolor="#FFFFFF">
<td bgcolor="#FCE3FD"> </td>
</tr>
</table>
</td>
</tr>
</table>
<style type="text/css">
<!--
td { font-size: 12px; line-height: 150%}
-->
</style>
<script language="JavaScript">
<!--
function hve_display(t_id,i_id){//显示隐藏程序
var t_id;//表格ID
var i_id;//图片ID
var on_img="image/119.gif";//打开时图片
var off_img="image/119.gif";//隐藏时图片
if (t_id.style.display == "none") {//如果为隐藏状态
t_id.style.display="";//切换为显示状态
i_id.src=on_img;}//换图
else{//否则
t_id.style.display="none";//切换为隐藏状态
i_id.src=off_img;}//换图
}
//-->
</script>
<table width="200">
<tr>
<td>
<table width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#006699">
<tr bgcolor="#006699">
<td bgcolor="#E28EEE"> </td>
<td width="20"><img src="image/119.gif" width="13" height="13" name="img1" style="cursor: hand"></td>
</tr>
<!--图片的ID是img1,要隐藏的表格ID是table1,onclick调用hve_display程序;style设置鼠标为手型。-->
</table>
<table ID="table1" width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#E28EEE" height="120">
<tr bgcolor="#FFFFFF">
<td bgcolor="#FCE3FD"><p><a href="#">七色风</a><br>
<a href="#">中讯数据</a> </p>
</td>
</tr>
</table>
<table width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#006699">
<tr bgcolor="#006699">
<td bgcolor="#E28EEE"> </td>
<td width="20"><img src="image/119.gif" width="13" height="13" name="img2" style="cursor: hand"></td>
</tr>
</table>
<table id="table2" width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#E28EEE" height="120">
<tr bgcolor="#FFFFFF">
<td bgcolor="#FCE3FD"> </td>
</tr>
</table>
<table width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#006699">
<tr bgcolor="#006699">
<td bgcolor="#E28EEE"> </td>
<td width="20"><img src="image/119.gif" width="13" height="13" name="img3" style="cursor: hand"></td>
</tr>
</table>
<table id="table3" width="201" border="0" cellspacing="1" cellpadding="0" bgcolor="#E28EEE" height="120">
<tr bgcolor="#FFFFFF">
<td bgcolor="#FCE3FD"> </td>
</tr>
</table>
<table width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#006699">
<tr bgcolor="#006699">
<td bgcolor="#E28EEE"> </td>
<td width="20"><img src="image/119.gif" width="13" height="13" name="img4" style="cursor: hand"></td>
</tr>
</table>
<table id="table4" width="200" border="0" cellspacing="1" cellpadding="0" bgcolor="#E28EEE" height="120">
<tr bgcolor="#FFFFFF">
<td bgcolor="#FCE3FD"> </td>
</tr>
</table>
</td>
</tr>
</table>
http://www-128.ibm.com/developerworks/cn/linux/shell/awk/awk-1/index.html
在php中有没有这样的函数呢,恳请高人指点。最好是能给一个源代码,谢谢了。
gethostbyname()
操作系统命令nslookup
gethostbyname()
操作系统命令nslookup
http://blog.wangyuhui.net/vi-tips/
vi 里面实现批量字符串替换:
1、打开文件
2、ESC
3、shift + :
4、输入%s/from/to/g, 其中%s表示替换,from是被替换的字符串,to是替换后的,g表示global
如果要替换11到22行,则:34,78s/from/to/
-------------------------------------
上下左右:
ctrl+u/d 上下半屏,ctrl+f/b,上下一屏
H/G屏幕头/文章末 ,0/$ 行首行末
增删改:
yy/dd 复制/删除 一行,p/P:将yy/dd的内容paste出来
I/A 在行首/末添加, o/O 开新行,d0/d$ 删除到行首,行末
u:undo查:
? 向前查找, n/N 重复上一次查找
—————————————————————————
文本处理命令:
awk:处理结构化的文本(每行以固定符号分成若干列),提取打印某些字段,如:
ls -l|awk ‘{print $1}’ –将ls-l结果的第一列打印出来
awk -F”:” ‘{print $1″ “$6}’ /etc/passwd ,将以:分割的/etc/passwd文件的第1,6列打印出来,中间以空格分开
详见IBM DW中国的AWK实例(共3篇) 或 Bash新手指南中文版第6章。
grep:过滤,大家用得最多的命令,支持正则表达式。参数有:
-i忽略大小写,-n显示line number,-c 统计在每个文件的出现次数,-l只显示符合的文件的名字。
sed:流编辑器,主要用于替换,如:
sed -e ‘1,10s/foo/bar/g’ myfile2.txt 将1到10行的文本中的foo 替换成bar,s代表替换,g代表全局替换
支持正则的替换字符串,可以只替换某个范围内的内容。
用法不算简单,详见IBM DW中国的Sed实例(共3篇)或 Bash新手指南中文版第5章。
sort:排序,参数有:
-r逆序, -n 数字比较 , -M 日历比较 Feb,Dec, -f 忽略大小写
同样支持结构化文件,如
sort -t : -k 1,1 /etc/passwd,以: 分割,只按第1列排序
sort -t : -k 1,1 -k2.2,3.4 /etc/passwd ,以:分割,先按第1列排序,再按第2列的第二个字符到第3列的第4个字符排序。
uniq:去除重复行。
除了正常用法外,还有-c统计重复次数,和-u (唯一)和 -d (重复)两个参数,只显示唯一的和重复的行。
vi 里面实现批量字符串替换:
1、打开文件
2、ESC
3、shift + :
4、输入%s/from/to/g, 其中%s表示替换,from是被替换的字符串,to是替换后的,g表示global
如果要替换11到22行,则:34,78s/from/to/
-------------------------------------
上下左右:
ctrl+u/d 上下半屏,ctrl+f/b,上下一屏
H/G屏幕头/文章末 ,0/$ 行首行末
增删改:
yy/dd 复制/删除 一行,p/P:将yy/dd的内容paste出来
I/A 在行首/末添加, o/O 开新行,d0/d$ 删除到行首,行末
u:undo查:
? 向前查找, n/N 重复上一次查找
—————————————————————————
文本处理命令:
awk:处理结构化的文本(每行以固定符号分成若干列),提取打印某些字段,如:
ls -l|awk ‘{print $1}’ –将ls-l结果的第一列打印出来
awk -F”:” ‘{print $1″ “$6}’ /etc/passwd ,将以:分割的/etc/passwd文件的第1,6列打印出来,中间以空格分开
详见IBM DW中国的AWK实例(共3篇) 或 Bash新手指南中文版第6章。
grep:过滤,大家用得最多的命令,支持正则表达式。参数有:
-i忽略大小写,-n显示line number,-c 统计在每个文件的出现次数,-l只显示符合的文件的名字。
sed:流编辑器,主要用于替换,如:
sed -e ‘1,10s/foo/bar/g’ myfile2.txt 将1到10行的文本中的foo 替换成bar,s代表替换,g代表全局替换
支持正则的替换字符串,可以只替换某个范围内的内容。
用法不算简单,详见IBM DW中国的Sed实例(共3篇)或 Bash新手指南中文版第5章。
sort:排序,参数有:
-r逆序, -n 数字比较 , -M 日历比较 Feb,Dec, -f 忽略大小写
同样支持结构化文件,如
sort -t : -k 1,1 /etc/passwd,以: 分割,只按第1列排序
sort -t : -k 1,1 -k2.2,3.4 /etc/passwd ,以:分割,先按第1列排序,再按第2列的第二个字符到第3列的第4个字符排序。
uniq:去除重复行。
除了正常用法外,还有-c统计重复次数,和-u (唯一)和 -d (重复)两个参数,只显示唯一的和重复的行。
http://www.chinahtml.com/databases/4/2005/11299916311055.shtml
find . -name TEMP -mtime +3 | xargs rm
http://warran.blueidea.com/archives/2007/4803.shtml
https://memcached.org/downloads
Debian/Ubuntu: apt-get install libevent-dev Redhat/Centos: yum install libevent-devel 。
经实践,它本质上是使用了这个libevent,并不是libevent-devel,但编译时应该需要这个libevent-devel库,libevent-devel在用yum安装时会把libevent库给以依赖的形式下载下来,于是运行正常。
验证libevent-devel是和libevent包是有yum有依赖的:
http://warran.blueidea.com/archives/2007/4803.shtml
https://memcached.org/downloads
Debian/Ubuntu: apt-get install libevent-dev Redhat/Centos: yum install libevent-devel 。
经实践,它本质上是使用了这个libevent,并不是libevent-devel,但编译时应该需要这个libevent-devel库,libevent-devel在用yum安装时会把libevent库给以依赖的形式下载下来,于是运行正常。
验证libevent-devel是和libevent包是有yum有依赖的: