兴海北路

---男儿仗剑自横行
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

  • 随笔 - 85
  • 文章 - 0
  • 评论 - 17
  • 引用 - 0

常用链接

留言簿(6)

随笔分类

随笔档案

收藏夹

全是知识啊

搜索

  •  

最新评论

阅读排行榜

评论排行榜

谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词

谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词

这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级。整理这篇文章的动机是两个问题:

问题一:
使用Windows记事本的“另存为”,可以在GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。同样是txt文件,Windows是怎样识别编码方式的呢?

我很早前就发现Unicode、Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节,分别是FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。但这些标记是基于什么标准呢?

问题二:
最近在网上看到一个ConvertUTF.c,实现了UTF-32、UTF-16和UTF-8这三种编码方式的相互转换。对于Unicode(UCS2)、GBK、UTF-8这些编码方式,我原来就了解。但这个程序让我有些糊涂,想不起来UTF-16和UCS2有什么关系。
查了查相关资料,总算将这些问题弄清楚了,顺带也了解了一些Unicode的细节。写成一篇文章,送给有过类似疑问的朋友。本文在写作时尽量做到通俗易懂,但要求读者知道什么是字节,什么是十六进制。

0、big endian和little endian
big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。还是将49写在前面,就是little endian。

“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。

我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。

1、字符编码、内码,顺带介绍汉字编码
字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。

GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。

GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。

从ASCII、GB2312、GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。

有的中文Windows的缺省内码还是GBK,可以通过GB18030升级包升级到GB18030。不过GB18030相对GBK增加的字符,普通人是很难用到的,通常我们还是用GBK指代中文Windows内码。

这里还有一些细节:

GB2312的原文还是区位码,从区位码到内码,需要在高字节和低字节上分别加上A0。

在DBCS中,GB内码的存储格式始终是big endian,即高位在前。

GB2312的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。不过这不影响DBCS字符流的解析:在读取DBCS字符流时,只要遇到高位为1的字节,就可以将下两个字节作为一个双字节编码,而不用管低字节的高位是什么。

2、Unicode、UCS和UTF
前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容),与GB码不兼容。例如“汉”字的Unicode编码是6C49,而GB码是BABA。

Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案。Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。

根据维基百科全书(http://zh.wikipedia.org/wiki/)的记载:历史上存在两个试图独立设计Unicode的组织,即国际标准化组织(ISO)和一个软件制造商的协会(unicode.org)。ISO开发了ISO 10646项目,Unicode协会开发了Unicode项目。

在1991年前后,双方都认识到世界不需要两个不兼容的字符集。于是它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。从Unicode2.0开始,Unicode项目采用了与ISO 10646-1相同的字库和字码。

目前两个项目仍都存在,并独立地公布各自的标准。Unicode协会现在的最新版本是2005年的Unicode 4.1.0。ISO的最新标准是10646-3:2003。

UCS规定了怎么用多个字节表示各种文字。怎样传输这些编码,是由UTF(UCS Transformation Format)规范规定的,常见的UTF规范包括UTF-8、UTF-7、UTF-16。

IETF的RFC2781和RFC3629以RFC的一贯风格,清晰、明快又不失严谨地描述了UTF-16和UTF-8的编码方法。我总是记不得IETF是Internet Engineering Task Force的缩写。但IETF负责维护的RFC是Internet上一切规范的基础。

3、UCS-2、UCS-4、BMP

UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。下面让我们做一些简单的数学游戏:

UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。

UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个plane。每个plane根据第3个字节分为256行 (rows),每行包含256个cells。当然同一行的cells只是最后一个字节不同,其余都相同。

group 0的plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中,高两个字节为0的码位被称作BMP。

将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。

4、UTF编码

UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:

UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

读者可以用记事本测试一下我们的编码是否正确。

UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。

5、UTF的字节序和BOM
UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:

在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

Windows就是使用BOM来标记文本文件的编码方式的。

6、进一步的参考资料
本文主要参考的资料是 "Short overview of ISO-IEC 10646 and Unicode" (http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html)。

我还找了两篇看上去不错的资料,不过因为我开始的疑问都找到了答案,所以就没有看:

"Understanding Unicode A general introduction to the Unicode Standard" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter04a)
"Character set encoding basics Understanding character set encodings and legacy encodings" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter03)
我写过UTF-8、UCS-2、GBK相互转换的软件包,包括使用Windows API和不使用Windows API的版本。以后有时间的话,我会整理一下放到我的个人主页上(http://fmddlmyy.home4u.china.com)。

我是想清楚所有问题后才开始写这篇文章的,原以为一会儿就能写好。没想到考虑措辞和查证细节花费了很长时间,竟然从下午1:30写到9:00。希望有读者能从中受益。





作者Blog:http://blog.csdn.net/fmddlmyy/
参考资料:http://blog.csdn.net/fmddlmyy/

posted @ 2009-01-12 15:42 随意门 阅读(435) | 评论 (1)编辑 收藏
ASC编码

ASC编码

目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母,ASCII码有7位码和8位码两种形式。
因为1位二进制数可以表示(21=)2种状态:0、1;而2位二进制数可以表示(22)=4种状态:00、01、10、11;依次类推,7位二进制数可以表示(27=)128种状态,每种状态都唯一地编为一个7位的二进制码,对应一个字符(或控制码),这些码可以排列成一个十进制序号0~127。所以,7位ASCII码是用七位二进制数进行编码的,可以表示128个字符。
第0~32号及第127号(共34个)是控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;
第33~126号(共94个)是字符,其中第48~57号为0~9十个阿拉伯数字;65~90号为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
注意:在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。
为了便于查询,以下列出ASCII码表:
第128~255号为扩展字符(不常用)

ASCII码键盘ASCII 码键盘ASCII 码键盘ASCII 码键盘
27ESC32SPACE33!34"
35#36$37%38&
39'40(41)42*
43+44'45-46.
47/480491502
513524535546
55756857958:
59;60<61=62>
63?64@65A66B
67C68D69E70F
71G72H73I74J
75K76L77M78N
79O80P81Q82R
83S84T85U86V
87W88X89Y90Z
91[92\93]94^
95_96`97a98b
99c100d101e102f
103g104h105i106j
107k108l109m110n
111o112p113q114r
115s116t117u118v
119w120x121y122z
123{124|125}126~

posted @ 2009-01-12 14:32 随意门 阅读(311) | 评论 (0)编辑 收藏
Apache+php+mysql在windows下的安装与配置图解(最新版)

先准备好软件:

Apache官方下载地址:apache_2.0.55-win32-x86-no_ssl.msi更多版本在这里

php官方下载地址:php-5.0.5-Win32.zip更多镜像下载地址更多版本下载

mysql官方下载地址:mysql-4.1.14-win32.zip更多镜像下载地址更多版本下载

一、安装Apache,配置成功一个普通网站服务器

运行下载好的“apache_2.0.55-win32-x86-no_ssl.msi”,出现如下界面:

 

出现Apache HTTP Server 2.0.55的安装向导界面,点“Next”继续

 

确认同意软件安装使用许可条例,选择“I accept the terms in the license agreement”,点“Next”继续

 

将Apache安装到Windows上的使用须知,请阅读完毕后,按“Next”继续

 

设置系统信息,在Network Domain下填入您的域名(比如:goodwaiter.com),在Server Name下填入您的服务器名称(比如:www.goodwaiter.com,也就是主机名加上域名),在Administrator's Email Address下填入系统管理员的联系电子邮件地址(比如:yinpeng@xinhuanet.com),上述三条信息仅供参考,其中联系电子邮件地址会在当系统故障时提供给访问者,三条信息均可任意填写,无效的也行。下面有两个选择,图片上选择的是为系统所有用户安装,使用默认的80端口,并作为系统服务自动启动;另外一个是仅为当前用户安装,使用端口8080,手动启动。一般选择如图所示。按“Next”继续。]

 

选择安装类型,Typical为默认安装,Custom为用户自定义安装,我们这里选择Custom,有更多可选项。按“Next”继续

 

出现选择安装选项界面,如图所示,左键点选“Apache HTTP Server 2.0.55”,选择“This feature, and all subfeatures, will be installed on local hard drive.”,即“此部分,及下属子部分内容,全部安装在本地硬盘上”。点选“Change...”,手动指定安装目录。

 

我这里选择安装在“D:\”,各位自行选取了,一般建议不要安装在操作系统所在盘,免得操作系统坏了之后,还原操作把Apache配置文件也清除了。选“OK”继续。

 

返回刚才的界面,选“Next”继续。

 

确认安装选项无误,如果您认为要再检查一遍,可以点“Back”一步步返回检查。点“Install”开始按前面设定的安装选项安装。

 

正在安装界面,请耐心等待,直到出现下面的画面。

 

安装向导成功完成,这时右下角状态栏应该出现了下面的这个绿色图标,表示Apache服务已经开始运行,按“Finish”结束Apache的软件安装

 

我们来熟悉一下这个图标,很方便的,在图标上左键单击,出现如下界面,有“Start(启动)”、“Stop(停止)”、“Restart(重启动)”三个选项,可以很方便的对安装的Apache服务器进行上述操作。

 

好了现在我们来测试一下按默认配置运行的网站界面,在IE地址栏打“http://127.0.0.1”,点“转到”,就可以看到如下页面,表示Apache服务器已安装成功。

 

现在开始配置Apache服务器,使它更好的替我们服务,事实上,如果不配置,你的安装目录下的Apache2\htdocs文件夹就是网站的默认根目录,在里面放入文件就可以了。这里我们还是要配置一下,有什么问题或修改,配置始终是要会的,如图所示,“开始”、“所有程序”、“Apache HTTP Server 2.0.55”、“Configure Apache Server”、“Edit the Apache httpd conf Configuration file”,点击打开。

 

XP的记事本有了些小变化,很实用的一个功能就是可以看到文件内容的行、列位置,按下图所示,点“查看”,勾选“状态栏”,界面右下角就多了个标记,“Ln 78, Col 10”就表示“行 78,列 10”,这样可以迅速的在文件中定位,方便解说。当然,你也可以通过“编辑”,“查找”输入关键字来快速定位。每次配置文件的改变,保存后,必须在 Apache服务器重启动后生效,可以用前面讲的小图标方便的控制服务器随时“重启动”。

 

现在正式开始配置Apache服务器,“Ln 228”,或者查找关键字“DocumentRoot”(也就是网站根目录),找到如下图所示地方,然后将""内的地址改成你的网站根目录,地址格式请照图上的写,主要是一般文件地址的“\”在Apache里要改成“/”。

 

“Ln 253”,同样,你也可以通过查找“

 

“Ln321”,DirectoryIndex(目录索引,也就是在仅指定目录的情况下,默认显示的文件名),可以添加很多,系统会根据从左至右的顺序来优先显示,以单个半角空格隔开,比如有些网站的首页是index.htm,就在光标那里加上“index.htm ”文件名是任意的,不一定非得“index.html”,比如“test.php”等,都可以。

 

这里有一个选择配置选项,以前可能要配置,现在好像修正过来了,不用配置了,就是强制所有输出文件的语言编码,html文件里有语言标记(,这个就是设定文档语言为gb2312)的也会强制转换。如果打开的网页出现乱码,请先检查网页内有没有上述 html语言标记,如果没有,添加上去就能正常显示了。把“# DefaultLanguage nl”前面的“# ”去掉,把“nl”改成你要强制输出的语言,中文是“zh-cn”,保存,关闭。

 

好了,简单的Apache配置就到此结束了,现在利用先前的小图标重启动,所有的配置就生效了,你的网站就成了一个网站服务器,如果你加载了防火墙,请打开80或8080端口,或者允许Apache程序访问网络,否则别人不能访问。如果你有公网IP(一般ADSL或电话拨号上网的都是),就可以邀请所有能上网的朋友访问使用http://你的IP地址(IP地址查询可访问http://www.goodwaiter.com,查询内容内即是)你的网站了;如果你没有公网IP,也可以把内网IP地址告诉局域网内的其它用户,让他们通过http://你的内网IP地址,访问你的网站。

二、php的安装、以module方式,将php与apache结合使你的网站服务器支持php服务器脚本程序

将下载的php安装文件php-5.0.5-Win32.zip右键解压缩。

 

指定解压缩的位置,我的设定在“D:\php”

 

查看解压缩后的文件夹内容,找到“php.ini-dist”文件,将其重命名为“php.ini”,打开编辑,找到下面图中的地方, Ln385,有一个“register_globals = Off”值,这个值是用来打开全局变量的,比如表单送过来的值,如果这个值设为“Off”,就只能用“$_POST['变量名']、$_GET['变量名 ']”等来取得送过来的值,如果设为“On”,就可以直接使用“$变量名”来获取送过来的值,当然,设为“Off”就比较安全,不会让人轻易将网页间传送的数据截取。这个值是否改成“On”就看自己感觉了,是安全重要还是方便重要?

 

这里还有一个地方要编辑,功能就是使php能够直接调用其它模块,比如访问mysql,如下图所示,Ln563,选择要加载的模块,去掉前面的 “;”,就表示要加载此模块了,加载的越多,占用的资源也就多一点,不过也多不到哪去,比如我要用mysql,就要把“;extension= php_mysql.dll”前的“;”去掉。所有的模块文件都放在php解压缩目录的“ext”之下,我这里的截图是把所有能加载的模块都加载上去了,前面的“;”没去掉的,是因为“ext”目录下默认没有此模块,加载会提示找不到文件而出错。这里只是参考,一般不需要加载这么多,需要的加载上就可以了,编辑好后保存,关闭。

 

如果上一步加载了其它模块,就要指明模块的位置,否则重启Apache的时候会提示“找不到指定模块”的错误,这里介绍一种最简单的方法,直接将php安装路径、里面的ext路径指定到windows系统路径中——在“我的电脑”上右键,“属性”,选择“高级”标签,点选“环境变量”,在“系统变量”下找到“Path”变量,选择,双击或点击“编辑”,将“;D:\php;D:\php\ext”加到原有值的后面,当然,其中的“D:\php” 是我的安装目录,你要将它改为自己的php安装目录,如下图所示,全部确定。系统路径添加好后要重启电脑才能生效,可以现在重启,也可以在所有软件安装或配置好后重启。

 

现在开始将php以module方式与Apache相结合,使php融入Apache,照先前的方法打开Apache的配置文件,Ln 173,找到这里,添加进如图所示选中的两行,第一行“LoadModule php5_module D:/php/php5apache2.dll”是指以module方式加载php,第二行“PHPIniDir "D:/php"”是指明php的配置文件php.ini的位置,是当然,其中的“D:/php”要改成你先前选择的php解压缩的目录。

 

还是Apache的配置文件,Ln 757,加入“AddType application/x-httpd-php .php”、“AddType application/x-httpd-php .html”两行,你也可以加入更多,实质就是添加可以执行php的文件类型,比如你再加上一行“AddType application/x-httpd-php .htm”,则.htm文件也可以执行php程序了,你甚至还可以添加上一行“AddType application/x-httpd-php .txt”,让普通的文本文件格式也能运行php程序。

 

前面所说的目录默认索引文件也可以改一下,因为现在加了php,有些文件就直接存为.php了,我们也可以把“index.php”设为默认索引文件,优先顺序就自己排了,我的是放在第一位。编辑完成,保存,关闭。

 

现在,php的安装,与Apache的结合已经全部完成,用屏幕右下角的小图标重启Apache,你的Apache服务器就支持了php。

三、mysql的安装,与php、Apache相结合

打开下载的mysql安装文件mysql-4.1.14-win32.zip,双击解压缩,运行“setup.exe”,出现如下界面

 

mysql安装向导启动,按“Next”继续

 

选择安装类型,有“Typical(默认)”、“Complete(完全)”、“Custom(用户自定义)”三个选项,我们选择“Custom”,有更多的选项,也方便熟悉安装过程

 

在“Developer Components(开发者部分)”上左键单击,选择“This feature, and all subfeatures, will be installed on local hard drive.”,即“此部分,及下属子部分内容,全部安装在本地硬盘上”。在上面的“MySQL Server(mysql服务器)”、“Client Programs(mysql客户端程序)”、“Documentation(文档)”也如此操作,以保证安装所有文件。点选“Change...”,手动指定安装目录。

 

填上安装目录,我的是“D:\mysql”,也建议不要放在与操作系统同一分区,这样可以防止系统备份还原的时候,数据被清空。按“OK”继续。

 

返回刚才的界面,按“Next”继续。

 

确认一下先前的设置,如果有误,按“Back”返回重做。按“Install”开始安装。

 

正在安装中,请稍候,直到出现下面的界面

 

这里是询问你是否要注册一个mysql.com的账号,或是使用已有的账号登陆mysql.com,一般不需要了,点选“Skip Sign-Up”,按“Next”略过此步骤。

 

现在软件安装完成了,出现上面的界面,这里有一个很好的功能,mysql配置向导,不用向以前一样,自己手动乱七八糟的配置my.ini了,将 “Configure the Mysql Server now”前面的勾打上,点“Finish”结束软件的安装并启动mysql配置向导。

 

mysql配置向导启动界面,按“Next”继续。

 

选择配置方式,“Detailed Configuration(手动精确配置)”、“Standard Configuration(标准配置)”,我们选择“Detailed Configuration”,方便熟悉配置过程。

 

选择服务器类型,“Developer Machine(开发测试类,mysql占用很少资源)”、“Server Machine(服务器类型,mysql占用较多资源)”、“Dedicated MySQL Server Machine(专门的数据库服务器,mysql占用所有可用资源)”,大家根据自己的类型选择了,一般选“Server Machine”,不会太少,也不会占满。

 

选择mysql数据库的大致用途,“Multifunctional Database(通用多功能型,好)”、“Transactional Database Only(服务器类型,专注于事务处理,一般)”、“Non-Transactional Database Only(非事务处理型,较简单,主要做一些监控、记数用,对MyISAM数据类型的支持仅限于non-transactional),随自己的用途而选择了,我这里选择“Transactional Database Only”,按“Next”继续。

 

对InnoDB Tablespace进行配置,就是为InnoDB 数据库文件选择一个存储空间,如果修改了,要记住位置,重装的时候要选择一样的地方,否则可能会造成数据库损坏,当然,对数据库做个备份就没问题了,这里不详述。我这里没有修改,使用用默认位置,直接按“Next”继续

 

选择您的网站的一般mysql访问量,同时连接的数目,“Decision Support(DSS)/OLAP(20个左右)”、“Online Transaction Processing(OLTP)(500个左右)”、“Manual Setting(手动设置,自己输一个数)”,我这里选“Online Transaction Processing(OLTP)”,自己的服务器,应该够用了,按“Next”继续

 

是否启用TCP/IP连接,设定端口,如果不启用,就只能在自己的机器上访问mysql数据库了,我这里启用,把前面的勾打上,Port Number:3306,按“Next”继续

 

这个比较重要,就是对mysql默认数据库语言编码进行设置,第一个是西文编码,第二个是多字节的通用utf8编码,都不是我们通用的编码,这里选择第三个,然后在Character Set那里选择或填入“gbk”,当然也可以用“gb2312”,区别就是gbk的字库容量大,包括了gb2312的所有汉字,并且加上了繁体字、和其它乱七八糟的字——使用mysql的时候,在执行数据操作命令之前运行一次“SET NAMES GBK;”(运行一次就行了,GBK可以替换为其它值,视这里的设置而定),就可以正常的使用汉字(或其它文字)了,否则不能正常显示汉字。按 “Next”继续。

 

选择是否将mysql安装为windows服务,还可以指定Service Name(服务标识名称),是否将mysql的bin目录加入到Windows PATH(加入后,就可以直接使用bin下的文件,而不用指出目录名,比如连接,“mysql.exe -uusername -ppassword;”就可以了,不用指出mysql.exe的完整地址,很方便),我这里全部打上了勾,Service Name不变。按“Next”继续。

 

这一步询问是否要修改默认root用户(超级管理)的密码(默认为空),“New root password”如果要修改,就在此填入新密码(如果是重装,并且之前已经设置了密码,在这里更改密码可能会出错,请留空,并将“Modify Security Settings”前面的勾去掉,安装配置完成后另行修改密码),“Confirm(再输一遍)”内再填一次,防止输错。“Enable root access from remote machines(是否允许root用户在其它的机器上登陆,如果要安全,就不要勾上,如果要方便,就勾上它)”。最后“Create An Anonymous Account(新建一个匿名用户,匿名用户可以连接数据库,不能操作数据,包括查询)”,一般就不用勾了,设置完毕,按“Next”继续。

 

确认设置无误,如果有误,按“Back”返回检查。按“Execute”使设置生效。

 

设置完毕,按“Finish”结束mysql的安装与配置——这里有一个比较常见的错误,就是不能“Start service”,一般出现在以前有安装mysql的服务器上,解决的办法,先保证以前安装的mysql服务器彻底卸载掉了;不行的话,检查是否按上面一步所说,之前的密码是否有修改,照上面的操作;如果依然不行,将mysql安装目录下的data文件夹备份,然后删除,在安装完成后,将安装生成的 data文件夹删除,备份的data文件夹移回来,再重启mysql服务就可以了,这种情况下,可能需要将数据库检查一下,然后修复一次,防止数据出错。

与Apache及php相结合,前面已提过,这里再说一下,在php安装目录下,找到先前重命名并编辑过的 php.ini,如下图所示,Ln563,把“;extension=php_mysql.dll”前的“;”去掉,加载mysql模块。保存,关闭后,重启apache就可以了。这里也可以选择其它要加载的模块,去掉前面的“;”,就表示要加载此模块了,加载的越多,占用的资源也就多一点,不过也多不到哪去。所有的模块文件都放在php解压缩目录的“ext”之下,我这里的截图是把所有能加载的模块都加载上去了,前面的“;”没去掉的,是因为“ext” 目录下默认没有此模块,加载会提示找不到文件而出错。这里只是参考,一般不需要加载这么多,需要的加载上就可以了,编辑好后保存,关闭。

 

同样,加载了模块后,就要指明模块的位置,否则重启Apache的时候会提示“找不到指定模块”的错误,这里介绍一种最简单的方法,直接将 php安装路径、里面的ext路径指定到windows系统路径中——在“我的电脑”上右键,“属性”,选择“高级”标签,点选“环境变量”,在“系统变量”下找到“Path”变量,选择,双击或点击“编辑”,将“;D:\php;D:\php\ext”加到原有值的后面,当然,其中的“D:\php”是我的安装目录,你要将它改为自己的php安装目录,如下图所示,全部确定。系统路径添加好后要重启电脑才能生效,可以现在重启,也可以在所有软件安装或配置好后重启。

posted @ 2008-11-07 10:24 随意门 阅读(141) | 评论 (0)编辑 收藏
LINUX信息命令查看大全

来源: ChinaUnix博客  日期: 2008.07.10 19:47 
LINUX信息命令查看大全
# uname -a               # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue   # 查看操作系统版本
# cat /proc/cpuinfo      # 查看CPU信息
# hostname               # 查看计算机名
# lspci -tv              # 列出所有PCI设备
# lsusb -tv              # 列出所有USB设备
# lsmod                  # 列出加载的内核模块
# env                    # 查看环境变量资源
# free -m                # 查看内存使用量和交换区使用量
# df -h                  # 查看各分区使用情况
# du -sh         # 查看指定目录的大小
# grep MemTotal /proc/meminfo   # 查看内存总量
# grep MemFree /proc/meminfo    # 查看空闲内存量
# uptime                 # 查看系统运行时间、用户数、负载
# cat /proc/loadavg      # 查看系统负载磁盘和分区
# mount | column -t      # 查看挂接的分区状态
# fdisk -l               # 查看所有分区
# swapon -s              # 查看所有交换分区
# hdparm -i /dev/hda     # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE       # 查看启动时IDE设备检测状况网络
# ifconfig               # 查看所有网络接口的属性
# iptables -L            # 查看防火墙设置
# route -n               # 查看路由表
# netstat -lntp          # 查看所有监听端口
# netstat -antp          # 查看所有已经建立的连接
# netstat -s             # 查看网络统计信息进程
# ps -ef                 # 查看所有进程
# top                    # 实时显示进程状态用户
# w                      # 查看活动用户
# id             # 查看指定用户信息
# last                   # 查看用户登录日志
# cut -d: -f1 /etc/passwd   # 查看系统所有用户
# cut -d: -f1 /etc/group    # 查看系统所有组
# crontab -l             # 查看当前用户的计划任务服务
# chkconfig --list       # 列出所有系统服务
# chkconfig --list | grep on    # 列出所有启动的系统服务程序
# rpm -qa                # 查看所有安装的软件包
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/72691/showart_1078320.html

posted @ 2008-11-07 09:36 随意门 阅读(129) | 评论 (0)编辑 收藏
转:g++参数说明

转:g++参数说明

被转载作者email(pianopan@beeship.com ).  

[介绍]  
gcc and g++分别是gnu的c & c++编译器  

gcc/g++在执行编译工作的时候,总共需要4步  

1.预处理,生成.i的文件  
2.将预处理后的文件不转换成汇编语言,生成文件.s  
3.有汇编变为目标代码(机器代码)生成.o的文件  
4.连接目标代码,生成可执行程序  


[参数详解]  

-x language filename   
   设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根  
   据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果  
   你很个性,决定你的C代码文件的后缀名是.pig 哈哈,那你就要用这  
   个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数  
   的使用。  
   可以使用的参数吗有下面的这些  
     `c’, `objective-c’, `c-header’, `c++’, `cpp-output’,   
     `assembler’, and `assembler-with-cpp’.  
   看到英文,应该可以理解的。  
   例子用法:  
   gcc -x c hello.pig  
    
-x none filename  
  关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型  
  例子用法:  
  gcc -x c hello.pig -x none hello2.c  
    
-c   
  只激活预处理,编译,和汇编,也就是他只把程序做成obj文件  
  例子用法:  
  gcc -c hello.c  
  他将生成.o的obj文件   

-S  
  只激活预处理和编译,就是指把文件编译成为汇编代码。  
  例子用法  
  gcc -S hello.c  
  他将生成.s的汇编代码,你可以用文本编辑器察看  

-E  
  只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里  
  面.  
  例子用法:  
  gcc -E hello.c > pianoapan.txt  
  gcc -E hello.c | more  
  慢慢看吧,一个hello word 也要与处理成800行的代码  

-o  
  制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果  
  你和我有同感,改掉它,哈哈  
  例子用法  
  gcc -o hello.exe hello.c (哦,windows用习惯了)  
  gcc -o hello.asm -S hello.c  

-pipe  
  使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问  
  题  
  gcc -pipe -o hello.exe hello.c  

-ansi  
  关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一  
  些asm inline typeof关键字,以及UNIX,vax等预处理宏,  

-fno-asm  
  此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作  
  关键字。  
      
-fno-strict-prototype  
  只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式  
  的对参数的个数和类型说明,而不是没有参数.  
  而gcc无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说  
  明的类型  
    
-fthis-is-varialble  
  就是向传统c++看齐,可以使用this当一般变量使用.  
    
-fcond-mismatch  
  允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型  
    
-funsigned-char  
-fno-signed-char  
-fsigned-char  
-fno-unsigned-char  
  这四个参数是对char类型进行设置,决定将char类型设置成unsigned char(前  
  两个参数)或者 signed char(后两个参数)  
    
-include file  
  包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以  
  用它设定,功能就相当于在代码中使用#include<filename>  
  例子用法:  
  gcc hello.c -include /root/pianopan.h  
    
-imacros file  
  将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件  
  中  
    
-Dmacro  
  相当于C语言中的#define macro  
    
-Dmacro=defn  
  相当于C语言中的#define macro=defn  
    
-Umacro  
  相当于C语言中的#undef macro  

-undef  
  取消对任何非标准宏的定义  
    
-Idir  
  在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头  
  文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他  
  回先在你所制定的目录查找,然后再按常规的顺序去找.  
  对于#include<file>,gcc/g++会到-I制定的目录查找,查找不到,然后将到系  
  统的缺省的头文件目录查找  
    
-I-  
  就是取消前一个参数的功能,所以一般在-Idir之后使用  
    
-idirafter dir  
  在-I的目录里面查找失败,讲到这个目录里面查找.  
    
-iprefix prefix  
-iwithprefix dir  
  一般一起使用,当-I的目录查找失败,会到prefix+dir下查找  
    
-nostdinc  
  使编译器不再系统缺省的头文件目录里面找头文件,一般和-I联合使用,明确  
  限定头文件的位置  
    
-nostdin C++  
  规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创建  
  libg++库使用  
    
-C  
  在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很  
  方便的  
    
-M  
  生成文件关联的信息。包含目标文件所依赖的所有源代码  
  你可以用gcc -M hello.c来测试一下,很简单。  
    
-MM  
  和上面的那个一样,但是它将忽略由#include<file>造成的依赖关系。  
    
-MD  
  和-M相同,但是输出将导入到.d的文件里面  
    
-MMD  
  和-MM相同,但是输出将导入到.d的文件里面  
    
-Wa,option  
  此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选  
  项,然后传递给会汇编程序  
    
-Wl.option  
  此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选  
  项,然后传递给会连接程序.  
    

-llibrary   
  制定编译的时候使用的库  
  例子用法  
  gcc -lcurses hello.c  
  使用ncurses库编译程序  
    
-Ldir  
  制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然  
  编译器将只在标准库的目录找。这个dir就是目录的名称。  
    
-O0  
-O1  
-O2  
-O3  
  编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最  
  高    
    
-g  
  只是编译器,在编译的时候,产生条是信息。  
    
-gstabs  
  此选项以stabs格式声称调试信息,但是不包括gdb调试信息.  
    
-gstabs+  
  此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息.  
    
-ggdb  
  此选项将尽可能的生成gdb的可以使用的调试信息.  


[参考资料]  
-Linux/UNIX高级编程  
  中科红旗软件技术有限公司编著.清华大学出版社出版 

posted @ 2008-08-04 22:50 随意门 阅读(541) | 评论 (0)编辑 收藏
linux下gdb单步调试

     摘要: 用 GDB 调试程序 GDB 概述———— GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像 VC 、 BCB 等 IDE 的调试,但如果你是在 UNIX 平台下做软件,你会发现 GDB 这个调试工具有比 VC 、 BCB 的图形化调试器更强大的功能。所谓 “ 寸有所长,尺有所短 ” 就是这个道理。 一...  阅读全文

posted @ 2008-08-04 15:30 随意门 阅读(2261) | 评论 (0)编辑 收藏
mysql查看表结构命令 (转)

mysql查看表结构命令,如下:

desc 表名;
show columns from 表名;
describe 表名;
show create table 表名;

use information_schema
select * from columns where table_name='表名';

顺便记下:
show databases;
use 数据库名;
show tables;



原有一unique索引AK_PAS_Name(PAC_Name)在表tb_webparamcounter中,
执行以下sql修改索引
alter table tb_webparamcounter drop index AK_PAS_Name;
alter table tb_webparamcounter add UNIQUE AK_PAS_Name(PC_ID,PAC_Name);

若发现索引的逻辑不对,还需要再加一个字段进去,执行
alter table tb_webparamcounter drop index AK_PAS_Name;
alter table tb_webparamcounter add UNIQUE AK_PAS_Name(PC_ID,PAC_Name,PAC_Value);
注意:这时的PC_ID,PAC_Name,PAC_Value三个字段不是FOREIGN KEY
否则必需先drop FOREIGN KEY,再重做上一步才行

顺便提下oracle
select * from v$database;
select * from all_users;
select * from user_tables;

posted @ 2008-07-31 14:16 随意门 阅读(851) | 评论 (0)编辑 收藏
一个多线程web服务器实例(C,Linux,详细的web服务器原理)

     摘要: 系统:fedora core 5编译器:g++实现功能:通过http协议,用浏览器查看服务器上的html,htm,jpg,jpeg,gif,png,css文件 ,或者说查看带有jpg,jpeg,gif等文件的网页,即是web~把代码复制下来到linux里,照着后面的方法编译、运行,就可以看到一个简单的多线程服务器的效果了。 原理:在浏览器中输入一个网址,回车之后,浏览器会向相应主机的相...  阅读全文

posted @ 2008-07-02 09:49 随意门 阅读(4657) | 评论 (1)编辑 收藏
入门多线程服务器程序实例

fedora core 5
g++

服务器端程序:

#include <stdlib.h>

#include 
<sys/types.h>

#include 
<sys/socket.h>

#include 
<netinet/in.h>

#include 
<unistd.h>

#include 
<pthread.h>

#include 
<stdio.h>

#include 
<string.h>

#include 
<arpa/inet.h>



#define PORT 8848

#define BACKLOG 5

#define MAXDATASIZE 1000



void process_cli(int connectfd, sockaddr_in client);



void* start_routine(void* arg);

struct ARG {

       
int connfd;

       sockaddr_in client;

       };

       

main()

{

      
int listenfd, connectfd;

      pthread_t thread;         
//id of thread

      ARG 
*arg;

      
struct sockaddr_in server; //server's address info

      
struct sockaddr_in client; //client's

      
int sin_size;

      

      
//create tcp socket

      printf(
"socket.... ");

      
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

                    perror(
"creating socket failed.");

                    exit(
1);

      }

      

      
int opt = SO_REUSEADDR;

      setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, 
&opt, sizeof(opt));

      

      bzero(
&server,sizeof(server));

      server.sin_family 
= AF_INET;

      server.sin_port 
= htons(PORT);

      server.sin_addr.s_addr 
= htonl(INADDR_ANY);

      printf(
"bind.... ");

      
if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr)) == -1) {

          perror(
"bind error.");

          exit(
1);

      }

      

      printf(
"listen.... ");

      
if(listen(listenfd,BACKLOG) == -1) {

          perror(
"listen() error ");

          exit(
1);

      }



      sin_size 
= sizeof(struct sockaddr_in);

      
while(1)

      {

          
//accept() using main thread

          printf(
"accepting.... ");

          
if((connectfd = accept(listenfd,

                     (
struct sockaddr *)&client,

                     (socklen_t
*)&sin_size)) == -1) {

              perror(
"accept() error ");

              exit(
1);

          }



          arg 
= new ARG;

          arg
->connfd = connectfd;

          memcpy((
void *)&arg->client, &client, sizeof(client));

        

          
//invoke start_routine to handle this thread

          printf(
"thread_creating....");

          
if(pthread_create(&thread, NULL, start_routine, (void*)arg)){

              perror(
"pthread_creat() error");

              exit(
1);

          }          

      }

      close(listenfd);      

}



void process_cli(int connectfd, sockaddr_in client)

{

    
int num;

    
char recvbuf[MAXDATASIZE], sendbuf[MAXDATASIZE], cli_name[MAXDATASIZE];

    

    printf(
"you got a connection from %s.  ",inet_ntoa(client.sin_addr) );

    
//get client's name from client

    num 
= recv(connectfd, cli_name, MAXDATASIZE, 0);

    
if(num == 0) {

        close(connectfd);

        printf(
"Client disconnected. ");

        
return;

    }

    cli_name[num 
- 1= '

 客户端代码:

/* cthread.c */
#include 
<stdio.h>
#include 
<sys/types.h>
#include 
<netinet/in.h>
#include 
<sys/socket.h>
#include 
<netdb.h>
#include 
<unistd.h>
#include 
<string.h>
#include 
<arpa/inet.h>
#include 
<errno.h>
#include 
<stdlib.h>
#define PORT 8848
#define MAXDATASIZE 100

void process(FILE *fp, int sockfd);
char* getMessage(char* sendline, int len, FILE* fp);
int main(int argc, char *argv[])
{
    
int fd;
    
struct hostent *he;
    
struct sockaddr_in server; //server's address info

    
if(argc != 2) {
        printf(
"Usage: %s <ip address> ",argv[0]);
        exit(
1);
    }
    
    
if((he = gethostbyname(argv[1])) == NULL){
        perror(
"gethostbyname() error");
        exit(
1);
    }

    
if((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
        perror(
"socket() error");
        exit(
1);
    }

    bzero(
&server , sizeof(server));
    server.sin_family 
= AF_INET;
    server.sin_port 
= htons(PORT);
    server.sin_addr 
= *((struct in_addr *)he->h_addr);

    
if(connect(fd, (struct sockaddr *)&server,
                
sizeof(struct sockaddr)) == -1){
        perror(
"connect() error");
        exit(
1);
    }

    process(stdin,fd);

    close(fd);
}

void process(FILE *fp, int sockfd)
{
    
char sendline[MAXDATASIZE],recvline[MAXDATASIZE];
    
int numbytes;

    printf(
"connected to server. ");
    
//send name to server
    printf("Input name:");
    
if(fgets(sendline, MAXDATASIZE, fp) == NULL){
        printf(
" Exit. ");
        
return;
    }
    send(sockfd, sendline, strlen(sendline), 
0);

    
//send message to server
    
//when the string is not NULL , send another!
    while(getMessage(sendline,MAXDATASIZE,fp) != NULL) {
        send(sockfd, sendline, strlen(sendline), 
0);

        
if((numbytes = recv(sockfd, recvline, MAXDATASIZE, 0)) == 0){
            printf(
"server terminated. ");
            
return;
        }
        recvline[numbytes] 
= '

编译命令:

g++ -g -o s sthread.c -pthread

g++ -g -o c cthread.c -lc -lnsl

启动服务器:

./s

启动客户端:

./c 127.0.0.1

然后提示输入客户机的名字,再就提示输入一串字符,然后服务器就反转再发回来。

posted @ 2008-07-02 09:48 随意门 阅读(301) | 评论 (0)编辑 收藏
一个简单的linux下网络程序实例-网络编程入门

系统:fedora core 5

服务器端程序:

/* server */
#include 
<stdio.h>
#include 
<sys/types.h>
#include 
<netinet/in.h>
#include 
<sys/socket.h>
#include 
<netdb.h>
#include 
<unistd.h>
#include 
<string.h>
#include 
<arpa/inet.h>

#define PORT 8848
#define BACKLOG 1

main()
{
    
int listenfd,connectfd;
    
struct sockaddr_in server;
    
struct sockaddr_in client;
    
int sin_size;

    
if (( listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror(
"Creating socket failed.");
        
return 0;
    }

    
int opt = SO_REUSEADDR;
    setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, 
&opt, sizeof(opt));

    bzero(
&server,sizeof(server));
    server.sin_family 
= AF_INET;
    server.sin_port 
= htons(PORT);
    server.sin_addr.s_addr 
= htonl(INADDR_ANY);

    printf(
"binding... ");
    
if(bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) {
        perror(
"Bind error");
        
return 0;
    }

    printf(
"listen... ");
    
if(listen(listenfd,BACKLOG) == -1){
        perror(
"listen() error ");
        
return 0;
    }
    printf(
"accept.... ");
    sin_size 
= sizeof(struct sockaddr_in);
    
if ((connectfd = accept(listenfd, (struct sockaddr *)&client,(socklen_t *&sin_size)) == -1) {
        perror(
"accept() error ");
        
return 0;
    }
    printf(
"you got a connection from %s ",inet_ntoa(client.sin_addr) );
    send(connectfd,
"welcome to my server. ",22,0);
    close(connectfd);
    close(listenfd);
}

客户端程序:

/* client */
#include 
<stdio.h>
#include 
<sys/types.h>
#include 
<netinet/in.h>
#include 
<sys/socket.h>
#include 
<netdb.h>
#include 
<unistd.h>
#include 
<string.h>
#include 
<arpa/inet.h>
#include 
<errno.h>
#define PORT 8848
#define MAXDATASIZE 100

int main(int argc, char *argv[])
{
    
int fd, numbytes;
    
char buf[MAXDATASIZE];
    
struct hostent *he;
    
int errno;
    
struct sockaddr_in server;

    
if(argc != 2) {
        printf(
"usage: %s <ip address> ",argv[0]);
        
return 0;
    }
    printf(
"gethostbynem.... ");
    
if ((he = gethostbyname(argv[1]))==NULL){
        printf(
"gethostbyname() error ");
        
return 0;
    }
    
    
if((fd=socket(AF_INET,SOCK_STREAM, 0)) == -1){
        printf(
"socket() error ");
        
return 0;
    }
    
    
    bzero(
&server,sizeof(server));
    server.sin_family 
= AF_INET;
    server.sin_port 
= htons(PORT);
    server.sin_addr 
= *((in_addr*)he->h_addr);
    printf(
"connecting... ");
    
if(connect(fd, (struct sockaddr *)&server,sizeof(struct sockaddr)) == -1){
    
//    printf("connect() error ");
        perror("error");
        
return 0;
    }

    
if(( numbytes = recv(fd,buf,MAXDATASIZE,0)) == -1){
        printf(
"recv() error ");
        
return 0;
    }
    buf[numbytes] 
= '

 

 操作:

[root@localhost tcpsocket]# ls
help  tcpsocketC.c  tcpsocketS.c
[root@localhost tcpsocket]# g++ -g -o myserver tcpsocketS.c -lc -lnsl
[root@localhost tcpsocket]# g++ -g -o myclient tcpsocketC.c -lc -lnsl
[root@localhost tcpsocket]# ls
help  myclient  myserver  tcpsocketC.c  tcpsocketS.c
[root@localhost tcpsocket]# ./myserver
binding...
listen...
accept....

[root@localhost tcpsocket]# netstat -a | grep 8848
tcp        0      0 *:8848                      *:*                         LISTEN
[root@localhost tcpsocket]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:13:D4:3E:9F:89
          inet addr:125.221.160.241  Bcast:125.221.160.255  Mask:255.255.255.0
          inet6 addr: fe80::213:d4ff:fe3e:9f89/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:39108 errors:0 dropped:0 overruns:0 frame:0
          TX packets:46 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2359238 (2.2 MiB)  TX bytes:4040 (3.9 KiB)
          Interrupt:17 Base address:0xa000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:2005 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2005 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:2078171 (1.9 MiB)  TX bytes:2078171 (1.9 MiB)

[root@localhost tcpsocket]# ./myclient 127.0.0.1

 

posted @ 2008-07-02 09:47 随意门 阅读(334) | 评论 (0)编辑 收藏
仅列出标题
共9页: 1 2 3 4 5 6 7 8 9