一、基础篇
HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。
1、通用头域
通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、Connection、Date、Pragma、Transfer- Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。下面简单介绍几个在UPnP消息中使用的通用头域。
Cache-Control头域
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no- store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、 private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、 max-age。各个消息中的指令含义如下:
Public指示响应可被任何缓存区缓存。
Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
no-cache指示请求或响应消息不能缓存
no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
Date头域
Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。
Pragma头域
Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。
2、请求消息
请求消息的第一行为下面的格式:
Method SP Request-URI SP HTTP-Version CRLF
Method表示对于Request-URI完成的方法,这个字段是大小写敏感的,包括OPTIONS、GET、HEAD、POST、PUT、 DELETE、TRACE。方法GET和HEAD应该被所有的通用WEB服务器支持,其他所有方法的实现是可选的。GET方法取回由Request- URI标识的信息。HEAD方法也是取回由Request-URI标识的信息,只是可以在响应时,不返回消息体。POST方法可以请求服务器接收包含在请求中的实体信息,可以用于提交表单,向新闻组、BBS、邮件群组和数据库发送消息。
SP表示空格。
Request-URI遵循URI格式,在此字段为星号(*)时,说明请求并不用于某个特定的资源地址,而是用于服务器本身。
HTTP-Version表示支持的HTTP版本,例如为HTTP/1.1。
CRLF表示换行回车符。
请求头域允许客户端向服务器传递关于请求或者关于客户机的附加信息。请求头域可能包含下列字段Accept、Accept-Charset、Accept - Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If- Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、 Proxy-Authorization、Range、Referer、User-Agent。对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理。
阅读全文
HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。
1、通用头域
通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、Connection、Date、Pragma、Transfer- Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。下面简单介绍几个在UPnP消息中使用的通用头域。
Cache-Control头域
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no- store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、 private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、 max-age。各个消息中的指令含义如下:
Public指示响应可被任何缓存区缓存。
Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
no-cache指示请求或响应消息不能缓存
no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
Date头域
Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。
Pragma头域
Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。
2、请求消息
请求消息的第一行为下面的格式:
Method SP Request-URI SP HTTP-Version CRLF
Method表示对于Request-URI完成的方法,这个字段是大小写敏感的,包括OPTIONS、GET、HEAD、POST、PUT、 DELETE、TRACE。方法GET和HEAD应该被所有的通用WEB服务器支持,其他所有方法的实现是可选的。GET方法取回由Request- URI标识的信息。HEAD方法也是取回由Request-URI标识的信息,只是可以在响应时,不返回消息体。POST方法可以请求服务器接收包含在请求中的实体信息,可以用于提交表单,向新闻组、BBS、邮件群组和数据库发送消息。
SP表示空格。
Request-URI遵循URI格式,在此字段为星号(*)时,说明请求并不用于某个特定的资源地址,而是用于服务器本身。
HTTP-Version表示支持的HTTP版本,例如为HTTP/1.1。
CRLF表示换行回车符。
请求头域允许客户端向服务器传递关于请求或者关于客户机的附加信息。请求头域可能包含下列字段Accept、Accept-Charset、Accept - Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If- Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、 Proxy-Authorization、Range、Referer、User-Agent。对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理。
阅读全文
让我们算一算有多少种方法
处理诸如 PHP 之类的现代编程语言的乐趣之一就是有大量的选项可用。PHP 可以轻松地赢得 Perl 的座右铭“There's more than one way to do it”(并非只有一种方法可做这件事),尤其是在文件处理上。但是在这么多可用的选项中,哪一种是完成作业的最佳工具?当然,实际答案取决于解析文件的目标,因此值得花时间探究所有选项。
传统的 fopen 方法
fopen 方法可能是以前的 C 和 C++ 程序员最熟悉的,因为如果您使用过这些语言,那么它们或多或少都是您已掌握多年的工具。对于这些方法中的任何一种,通过使用 fopen(用于读取数据的函数)的标准方法打开文件,然后使用 fclose 关闭文件,如清单 1 所示。
清单 1. 用 fgets 打开并读取文件
$file_handle = fopen("myfile", "r");
while (!feof($file_handle)) {
$line = fgets($file_handle);
echo $line;
}
fclose($file_handle);
阅读全文
处理诸如 PHP 之类的现代编程语言的乐趣之一就是有大量的选项可用。PHP 可以轻松地赢得 Perl 的座右铭“There's more than one way to do it”(并非只有一种方法可做这件事),尤其是在文件处理上。但是在这么多可用的选项中,哪一种是完成作业的最佳工具?当然,实际答案取决于解析文件的目标,因此值得花时间探究所有选项。
传统的 fopen 方法
fopen 方法可能是以前的 C 和 C++ 程序员最熟悉的,因为如果您使用过这些语言,那么它们或多或少都是您已掌握多年的工具。对于这些方法中的任何一种,通过使用 fopen(用于读取数据的函数)的标准方法打开文件,然后使用 fclose 关闭文件,如清单 1 所示。
清单 1. 用 fgets 打开并读取文件
$file_handle = fopen("myfile", "r");
while (!feof($file_handle)) {
$line = fgets($file_handle);
echo $line;
}
fclose($file_handle);
阅读全文
1不写注释
2不使用可以提高生产效率的IDE工具
3不使用版本控制
4不按照编程规范写代码
5不使用统一的方法
6编码前不去思考和计划
7在执行sql前不执行编码和安全检测
8不使用测试驱动开发
9编码时不打开自动报错(error_reporting)
10不使用一种好的调试工具
11不重构你的代码(refactor)
12不采用MVC这样的分层结构
13不知道以下等等概念:KISS,DRY,MVC,OOP,REST
14在函数或者类里直接用print或者echo输出东西而不是返回(return)
15不使用也不去了解单元测试
16返回HTMl而不是data,strings,objects等类型
17糟糕的代码和配置参数(hard code messages and configuration parameters)
18不优化sql查询
19不使用__autoload
20不支持自动错误操作(应该是智能纠错)
21使用$_GET替代$_POST去进行危险的参数传递(记得这40条都是错误的东西)
22不知道怎样使用正则表达式
23从未听说过sql注入和跨站脚本(安全方面,应该了解下这两个东西的英文:sql injection,cross-site scripting)
24不支持简单配置,传递参数给类的构造函数,set/get方法,定义常量
25不能理解OOP的优缺点
26无论要做的东西有多小,都使用OOP
27认为做可复用的软件就是OOP
28不使用缺省值(don't choose intelligent defaults)
29不使用单一配置文件
30不想让别人看到代码,却使用.inc替换掉.php
31不使用数据库抽象层(持久层)
32开发时不DRY(Dont repeat yourself). (就是总开发重复的东西)
33不开发可以重复使用的类或者方法.
34不使用抽象类或者接口类,继承,多态,封装.
35不使用已有的设计模式优化你的程序.
36不允许使用者定义基础目录(这点好象PHP不太适合,毕竟不是基于操作系统的开发)
37错误的使用命名空间,使用大家都普遍使用的单词作为前缀.(这样以后别人使用会造成冲突.,例如自己定义一个function 叫 array_push())
38使用数据库时不使用表前缀(这个很重要...)
39不使用或者使用一个陌生的模板引擎(方便团队开发,大家要使用常见的模板)
40不去看PHP的框架(大多数框架中都包含优秀的代码和先进的概念.值得我们学习)
2不使用可以提高生产效率的IDE工具
3不使用版本控制
4不按照编程规范写代码
5不使用统一的方法
6编码前不去思考和计划
7在执行sql前不执行编码和安全检测
8不使用测试驱动开发
9编码时不打开自动报错(error_reporting)
10不使用一种好的调试工具
11不重构你的代码(refactor)
12不采用MVC这样的分层结构
13不知道以下等等概念:KISS,DRY,MVC,OOP,REST
14在函数或者类里直接用print或者echo输出东西而不是返回(return)
15不使用也不去了解单元测试
16返回HTMl而不是data,strings,objects等类型
17糟糕的代码和配置参数(hard code messages and configuration parameters)
18不优化sql查询
19不使用__autoload
20不支持自动错误操作(应该是智能纠错)
21使用$_GET替代$_POST去进行危险的参数传递(记得这40条都是错误的东西)
22不知道怎样使用正则表达式
23从未听说过sql注入和跨站脚本(安全方面,应该了解下这两个东西的英文:sql injection,cross-site scripting)
24不支持简单配置,传递参数给类的构造函数,set/get方法,定义常量
25不能理解OOP的优缺点
26无论要做的东西有多小,都使用OOP
27认为做可复用的软件就是OOP
28不使用缺省值(don't choose intelligent defaults)
29不使用单一配置文件
30不想让别人看到代码,却使用.inc替换掉.php
31不使用数据库抽象层(持久层)
32开发时不DRY(Dont repeat yourself). (就是总开发重复的东西)
33不开发可以重复使用的类或者方法.
34不使用抽象类或者接口类,继承,多态,封装.
35不使用已有的设计模式优化你的程序.
36不允许使用者定义基础目录(这点好象PHP不太适合,毕竟不是基于操作系统的开发)
37错误的使用命名空间,使用大家都普遍使用的单词作为前缀.(这样以后别人使用会造成冲突.,例如自己定义一个function 叫 array_push())
38使用数据库时不使用表前缀(这个很重要...)
39不使用或者使用一个陌生的模板引擎(方便团队开发,大家要使用常见的模板)
40不去看PHP的框架(大多数框架中都包含优秀的代码和先进的概念.值得我们学习)
简介
英文版权归Reinhold Weber所有,中译文作者yangyang(aka davidkoree)。双语版可用于非商业传播,但须注明英文版作者、版权信息,以及中译文作者。翻译水平有限,请广大PHPer指正。
40个迹象表明你还是PHP菜鸟
阅读全文
英文版权归Reinhold Weber所有,中译文作者yangyang(aka davidkoree)。双语版可用于非商业传播,但须注明英文版作者、版权信息,以及中译文作者。翻译水平有限,请广大PHPer指正。
40个迹象表明你还是PHP菜鸟
阅读全文
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行
匹配HTML标记的正则表达式: <(\S*?)[^>]*>.*? ¦ <.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^\s* ¦\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:\d{3}-\d{8} ¦\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字
匹配身份证:\d{15} ¦\d{18}
评注:中国的身份证为15位或18位
匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]\d*$ //匹配正整数
^-[1-9]\d*$ //匹配负整数
^-?[1-9]\d*$ //匹配整数
^[1-9]\d* ¦0$ //匹配非负整数(正整数 + 0)
^-[1-9]\d* ¦0$ //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d* ¦0\.\d*[1-9]\d*$ //匹配正浮点数
^-([1-9]\d*\.\d* ¦0\.\d*[1-9]\d*)$ //匹配负浮点数
^-?([1-9]\d*\.\d* ¦0\.\d*[1-9]\d* ¦0?\.0+ ¦0)$ //匹配浮点数
^[1-9]\d*\.\d* ¦0\.\d*[1-9]\d* ¦0?\.0+ ¦0$ //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d* ¦0\.\d*[1-9]\d*)) ¦0?\.0+ ¦0$ //匹配非正浮点数(负浮点数 + 0)
阅读全文
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行
匹配HTML标记的正则表达式: <(\S*?)[^>]*>.*? ¦ <.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^\s* ¦\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:\d{3}-\d{8} ¦\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字
匹配身份证:\d{15} ¦\d{18}
评注:中国的身份证为15位或18位
匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]\d*$ //匹配正整数
^-[1-9]\d*$ //匹配负整数
^-?[1-9]\d*$ //匹配整数
^[1-9]\d* ¦0$ //匹配非负整数(正整数 + 0)
^-[1-9]\d* ¦0$ //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d* ¦0\.\d*[1-9]\d*$ //匹配正浮点数
^-([1-9]\d*\.\d* ¦0\.\d*[1-9]\d*)$ //匹配负浮点数
^-?([1-9]\d*\.\d* ¦0\.\d*[1-9]\d* ¦0?\.0+ ¦0)$ //匹配浮点数
^[1-9]\d*\.\d* ¦0\.\d*[1-9]\d* ¦0?\.0+ ¦0$ //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d* ¦0\.\d*[1-9]\d*)) ¦0?\.0+ ¦0$ //匹配非正浮点数(负浮点数 + 0)
阅读全文
php不用COM生成excel文件
最近因为工作需要,要用php来写点东西,边学边用,搜集点资料,留下来备用 [点击图片可在新窗口打开]
其实在做真正的应用的时候,大家可以将数据从数据库中取出,然后按照每一列数据结束后加\t,每一行数据结束后加\n的方法echo出来,在php的开头用header("Content-type:application/vnd.ms-excel");表示输出的是excel文件,用 header("Content-Disposition:filename=test.xls");表示输出的文件名为text.xls。这样就ok 了。
我们更可以修改header让他输出更多格式的文件,这样php在处理各种类型文件方面就更加方便了,例如:
#header("Content-type:application/vnd.ms-word");
#header("Content-Disposition:filename=xx.doc");
#header("Content-type:application/vnd.ms-excel");
#header("Content-Disposition:filename=xx.xls");
#header("Content-type:application/vnd.ms-PowerPoint");
#header("Content-Disposition:filename=xx.ppt");
最近因为工作需要,要用php来写点东西,边学边用,搜集点资料,留下来备用 [点击图片可在新窗口打开]
<?
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=test.xls");
echo "test1\t";
echo "test2\t\n";
echo "test1\t";
echo "test2\t\n";
echo "test1\t";
echo "test2\t\n";
echo "test1\t";
echo "test2\t\n";
echo "test1\t";
echo "test2\t\n";
echo "test1\t";
echo "test2\t\n";
?>
在php环境运行上面的代码,大家就可以看到浏览器询问用户是否下载excel文档,点击保存,硬盘上就多了一个excel的文件,使用excel打开就会看到最终的结果,怎么样不错吧。header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=test.xls");
echo "test1\t";
echo "test2\t\n";
echo "test1\t";
echo "test2\t\n";
echo "test1\t";
echo "test2\t\n";
echo "test1\t";
echo "test2\t\n";
echo "test1\t";
echo "test2\t\n";
echo "test1\t";
echo "test2\t\n";
?>
其实在做真正的应用的时候,大家可以将数据从数据库中取出,然后按照每一列数据结束后加\t,每一行数据结束后加\n的方法echo出来,在php的开头用header("Content-type:application/vnd.ms-excel");表示输出的是excel文件,用 header("Content-Disposition:filename=test.xls");表示输出的文件名为text.xls。这样就ok 了。
我们更可以修改header让他输出更多格式的文件,这样php在处理各种类型文件方面就更加方便了,例如:
#header("Content-type:application/vnd.ms-word");
#header("Content-Disposition:filename=xx.doc");
#header("Content-type:application/vnd.ms-excel");
#header("Content-Disposition:filename=xx.xls");
#header("Content-type:application/vnd.ms-PowerPoint");
#header("Content-Disposition:filename=xx.ppt");
http://ks.lupaworld.com/upload/manual/other/Embedded%20FreeBSD%20Cookbook.pdf
背景:为何要用nc,nc比telnet相对有优势一点,可以作探测之用,hack常用工具,特别是有时路由抽风(为嘛抽风?技术中心基础运维的事儿,走专线,路由没配置好,或是专线满了没有人管,于是队列日志一堆一堆的全是失败信息,满了,磁盘也满了,这是业务问题?),北京到XX有两条路由,一条走专线,一条走VPN,我们这里回指的路由是从专线走的,之前你们的服务器应该也是走的专线,可能你们修改了服务器以后,他有时候匹配到了专线的路由,有时候匹配到了VPN的路由,造成丢包,看看你们那边是不是绑定策略能从专线过来?这种问题怎么从应用层来排查到是网路抽风呢?用netcat加循环设置看现象卡不卡了,无其它办法,如基础运维说没问题,我们也就蔫了,呵呵。
——————————————————————————————————————————————————————————
netcat简称:
[root@localhost ~]# type -a nc
nc is /usr/bin/nc
$ nc -w 10 localhost 2389
该连接将在 10 秒后中断。
注意: 不要在服务器端同时使用 -w 和 -l 参数,因为 -w 参数将在服务器端无效果。
一、循环连接多次:
实践如下:
二、有时候设置值设置不进去,设置一下值:
三、一行shell解决设置memcacheq的键值存起来,方便第一里面的循环:
四、保存为shell如,a.sh,循环设置测试:
上面这样得用vi去复制粘贴多行,于是有下面的简单一行实现循环的语句:
来自:http://www.2cto.com/os/201401/272319.html
阅读全文
一、端口和服务的关系
端口号与相应服务的对应关系存放在/etc/services文件中,这个文件中可以找到大部分端口。使用netstat命令
显示的服务名称也是从这个文件中找的。有人说将这个文件中的相应端口号注释掉,就可以禁用该端口。
我试了却不起作用,这种方法应该是没有用的,是误传!将相应端口号注释掉,唯一的作用就是使用netsat
命令时,将不显示服务名(比如ftp)而是显示端口号(比如21)。原理也很简单:netstat无法在/etc/services
文件中找到端口号对应的服务名,自然就无法显示了。所以/etc/services文件只是起到端口号与相应服务的
映射关系,与端口的启动和关闭没有关系!
二、查看本机开放的端口
1、netstat 查看端口和连接
netstat 列出目前已经连接的服务名
netstat -a 列出目前已经连接的和正在监听的服务名
netstat -an 列出目前已经连接的和正在监听的端口号(与上面的命令功能一样,只是不解释端口号对应的服务名)
netstat -ap 在上面命令的基础上列出连接的PID(进程号),用这个PID,可以使用KILL 来杀死连接
例如:某个连接的PID=111,想踢出去就使用 KILL -9 111。ok!
netstat -rn 输出路由表
2、nmap
nmap 127.0.0.1 查看本机开放的端口,会扫描所有端口
nmap -p 1024 65535 127.0.0.1 扫描指定端口范围
nmap -PT 192.168.1.1-111 扫描一组范围的电脑
三、关闭和开启端口(服务)
关闭端口的方法:
1、因为每个端口都有对应的服务,因此要关闭端口只要关闭相应的服务就可以了。
2、用IPTABLE对端口进行限制,这样也能使端口不被访问,但端口本身并没有关闭。
在这儿只介绍关闭服务的方法,IPTABLE的应用以后再讨论。
linux中开机自动启动的服务一般都存放在两个地方:
/etc/init.d/文件夹下的服务:
这个文件夹下的服务都可以通过运行相应的SCRIPT来启动或关闭。
例如:启动sendmail服务 ./sendmail start (打开了TCP 25端口)
关闭sendmail服务 ./sendmail stop (关闭TCP 25 端口)
查看sendmail服务当前状态 ./sendmail status (查看服务是否运行)
/etc/xinetd.d/文件夹下的服务:
这个文件夹下的服务需要通过更改服务的配置文件,并重新启动xinetd才可以。
例如:要启动其中的auth服务,打开/etc/xinetd.d/auth配置文件,更改“disable=no”,保存退出。运行/etc/rc.d/init.d/xinetd restart
要停止其中的auth服务,打开/etc/xinetd.d/auth配置文件,更改“disable=yes”,保存退出。运行/etc/rc.d/init.d/xinetd restart
四、控制开机自动启动的服务
上面说的控制服务开关方法是在启动linux之后进行操作的,如果我想在linux启动时控制哪些服务启动、哪些服务关闭怎么做?
控制服务自动启动的方法有3个:
1、更改/etc/rc.d下的对应文件夹:
如果你登陆的默认界面是字符界面,那么修改rc.3文件夹,如果登陆界面默认是图形界面,那么修改rc.5。
在文件夹中,每个服务的名字前都带有“K”或“S”,S就代表这个服务开机自动运行了,把它删了或前缀改为“K”下次就不会启动了。
2、使用ntsysv命令:
输入ntsysv命令,将会出现一个服务列表,需要启动的打“*”,简单。
3、使用chkconfig命令:
让某个服务不自动启动:例如httpd:chkconfig --level 35 httpd off ;35指的是运行级别
让某个服务自动启动:例如httpd:chkconfig --level 35 httpd on ;
查看所有服务的启动状态:chkconfig --list
查看某个服务的启动状态:chkconfig --list |grep httpd
端口和服务的操作就到这儿吧。
这个小脚本可以检测WWW,ftp,ssh,sendmail + pop3服务是否开启:
端口号与相应服务的对应关系存放在/etc/services文件中,这个文件中可以找到大部分端口。使用netstat命令
显示的服务名称也是从这个文件中找的。有人说将这个文件中的相应端口号注释掉,就可以禁用该端口。
我试了却不起作用,这种方法应该是没有用的,是误传!将相应端口号注释掉,唯一的作用就是使用netsat
命令时,将不显示服务名(比如ftp)而是显示端口号(比如21)。原理也很简单:netstat无法在/etc/services
文件中找到端口号对应的服务名,自然就无法显示了。所以/etc/services文件只是起到端口号与相应服务的
映射关系,与端口的启动和关闭没有关系!
二、查看本机开放的端口
1、netstat 查看端口和连接
netstat 列出目前已经连接的服务名
netstat -a 列出目前已经连接的和正在监听的服务名
netstat -an 列出目前已经连接的和正在监听的端口号(与上面的命令功能一样,只是不解释端口号对应的服务名)
netstat -ap 在上面命令的基础上列出连接的PID(进程号),用这个PID,可以使用KILL 来杀死连接
例如:某个连接的PID=111,想踢出去就使用 KILL -9 111。ok!
netstat -rn 输出路由表
2、nmap
nmap 127.0.0.1 查看本机开放的端口,会扫描所有端口
nmap -p 1024 65535 127.0.0.1 扫描指定端口范围
nmap -PT 192.168.1.1-111 扫描一组范围的电脑
三、关闭和开启端口(服务)
关闭端口的方法:
1、因为每个端口都有对应的服务,因此要关闭端口只要关闭相应的服务就可以了。
2、用IPTABLE对端口进行限制,这样也能使端口不被访问,但端口本身并没有关闭。
在这儿只介绍关闭服务的方法,IPTABLE的应用以后再讨论。
linux中开机自动启动的服务一般都存放在两个地方:
/etc/init.d/文件夹下的服务:
这个文件夹下的服务都可以通过运行相应的SCRIPT来启动或关闭。
例如:启动sendmail服务 ./sendmail start (打开了TCP 25端口)
关闭sendmail服务 ./sendmail stop (关闭TCP 25 端口)
查看sendmail服务当前状态 ./sendmail status (查看服务是否运行)
/etc/xinetd.d/文件夹下的服务:
这个文件夹下的服务需要通过更改服务的配置文件,并重新启动xinetd才可以。
例如:要启动其中的auth服务,打开/etc/xinetd.d/auth配置文件,更改“disable=no”,保存退出。运行/etc/rc.d/init.d/xinetd restart
要停止其中的auth服务,打开/etc/xinetd.d/auth配置文件,更改“disable=yes”,保存退出。运行/etc/rc.d/init.d/xinetd restart
四、控制开机自动启动的服务
上面说的控制服务开关方法是在启动linux之后进行操作的,如果我想在linux启动时控制哪些服务启动、哪些服务关闭怎么做?
控制服务自动启动的方法有3个:
1、更改/etc/rc.d下的对应文件夹:
如果你登陆的默认界面是字符界面,那么修改rc.3文件夹,如果登陆界面默认是图形界面,那么修改rc.5。
在文件夹中,每个服务的名字前都带有“K”或“S”,S就代表这个服务开机自动运行了,把它删了或前缀改为“K”下次就不会启动了。
2、使用ntsysv命令:
输入ntsysv命令,将会出现一个服务列表,需要启动的打“*”,简单。
3、使用chkconfig命令:
让某个服务不自动启动:例如httpd:chkconfig --level 35 httpd off ;35指的是运行级别
让某个服务自动启动:例如httpd:chkconfig --level 35 httpd on ;
查看所有服务的启动状态:chkconfig --list
查看某个服务的启动状态:chkconfig --list |grep httpd
端口和服务的操作就到这儿吧。
这个小脚本可以检测WWW,ftp,ssh,sendmail + pop3服务是否开启:
#!/bin/bash
#program: Using to study the [ if ... then ... fi ] program
#dsk 2007/10/8 3:00
#content: I will using this program to show you sevices
#1. print the program's work in your screen
echo "Now, the service of your Linux system will be detect!"
echo "The www, ftp,ssh,and sendmail + pop3 will be detect!"
echo " "
#2. www
www='netstat -an|grep LISTEN|grep :80'
if [ "$www" != "" ]; then
echo "WWW is runing"
else
echo "WWW is NOT runing"
fi
#3. ftp
ftp='netstat -an|grep LISTEN|grep :21'
if [ "$ftp" != "" ]; then
echo "FTP is runing"
else
echo "FTP is not runing"
fi
#4. ssh
ssh='netstat -an|grep LISTEN|grep :22'
if [ "$ssh" != "" ];then
echo "SSH is running"
else
echo "SSH is not running"
fi
#5. sendmail + pop3
smtp='netstat -an|grep LISTEN|grep :25'
pop3='netstat -an|grep LISTEN|grep :110'
if [ "$smtp" != "" ] && [ "$pop3" != "" ]; then
echo "Sendmail is OK!"
elif [ "$smtp" != "" ] && [ "$pop3" = "" ]; then
echo "Sendmail have some problems of your pop3!"
elif [ "$smtp" = "" ] && [ "$pop3" != "" ]; then
echo "Sendmail have some problems of your smtp!"
else
echo "Sendmail is NOT running!"
fi
#program: Using to study the [ if ... then ... fi ] program
#dsk 2007/10/8 3:00
#content: I will using this program to show you sevices
#1. print the program's work in your screen
echo "Now, the service of your Linux system will be detect!"
echo "The www, ftp,ssh,and sendmail + pop3 will be detect!"
echo " "
#2. www
www='netstat -an|grep LISTEN|grep :80'
if [ "$www" != "" ]; then
echo "WWW is runing"
else
echo "WWW is NOT runing"
fi
#3. ftp
ftp='netstat -an|grep LISTEN|grep :21'
if [ "$ftp" != "" ]; then
echo "FTP is runing"
else
echo "FTP is not runing"
fi
#4. ssh
ssh='netstat -an|grep LISTEN|grep :22'
if [ "$ssh" != "" ];then
echo "SSH is running"
else
echo "SSH is not running"
fi
#5. sendmail + pop3
smtp='netstat -an|grep LISTEN|grep :25'
pop3='netstat -an|grep LISTEN|grep :110'
if [ "$smtp" != "" ] && [ "$pop3" != "" ]; then
echo "Sendmail is OK!"
elif [ "$smtp" != "" ] && [ "$pop3" = "" ]; then
echo "Sendmail have some problems of your pop3!"
elif [ "$smtp" = "" ] && [ "$pop3" != "" ]; then
echo "Sendmail have some problems of your smtp!"
else
echo "Sendmail is NOT running!"
fi
http://www.21ic.com/info/images/dpj/2001-903.htm
添加组件:
工程 --部件--windows comm contrl
应该是MSCOMM32.OCX,此文件在WIN9X中位于Windows/System目录夹内,在WINXP中位于Windows/System32目录夹内.你再仔细找找看是否有此控件.
需在菜单栏工程(P)下拉菜单中选部件(O),在其属性页中找MICROSOFT COMM CONTROL6.0,对选钩方框打钩,就能在工具箱中出现电话机样的MSCOMM控件.如果上法找不到MICROSOFT COMM CONTROL6.0,则需从其它相同系统的System或System32目录夹将MSCOMM32.OCX复制到你机器系统的相同目录夹内,然后按文件下拉菜单中选部件(O),由浏览(B)去选中MSCOMM32.OCX文件,它就在部件(O)属性页中可找到,然后按前法操作,工具箱中就会有MSCOMM控件了.
谢谢!太好了!这一控件,为什么在我重启VB6.0后,需要重新添加呢?即使这样也完全满足需求,非常感谢!
我已经做完了程序,但在自己的机器上可以使用,但在一台没有装过VC的机器上运行不了,是MSCOMM控件的问题,我已经把MSCOMM32.OCX拷到那台机器上,用Depends工具查出相应的DLL也拷过去了,还是不行,请问还需要哪些东东呀!
答:需要程序或手动注册控件
如下:
cmd
Regsvr32 C:\windows\system32\Mscomm32.ocx
详细步骤:http://www.docin.com/p-1540065.html
下载代码:www.xiangdong.org/vb/vb.zip
工程 --部件--windows comm contrl
应该是MSCOMM32.OCX,此文件在WIN9X中位于Windows/System目录夹内,在WINXP中位于Windows/System32目录夹内.你再仔细找找看是否有此控件.
需在菜单栏工程(P)下拉菜单中选部件(O),在其属性页中找MICROSOFT COMM CONTROL6.0,对选钩方框打钩,就能在工具箱中出现电话机样的MSCOMM控件.如果上法找不到MICROSOFT COMM CONTROL6.0,则需从其它相同系统的System或System32目录夹将MSCOMM32.OCX复制到你机器系统的相同目录夹内,然后按文件下拉菜单中选部件(O),由浏览(B)去选中MSCOMM32.OCX文件,它就在部件(O)属性页中可找到,然后按前法操作,工具箱中就会有MSCOMM控件了.
谢谢!太好了!这一控件,为什么在我重启VB6.0后,需要重新添加呢?即使这样也完全满足需求,非常感谢!
我已经做完了程序,但在自己的机器上可以使用,但在一台没有装过VC的机器上运行不了,是MSCOMM控件的问题,我已经把MSCOMM32.OCX拷到那台机器上,用Depends工具查出相应的DLL也拷过去了,还是不行,请问还需要哪些东东呀!
答:需要程序或手动注册控件
如下:
cmd
Regsvr32 C:\windows\system32\Mscomm32.ocx
详细步骤:http://www.docin.com/p-1540065.html
下载代码:www.xiangdong.org/vb/vb.zip
CentOS5.2系统安装在虚拟机上,编译gcc.
挂载CentOS的DVD系统光盘,然后进入CentOS目录内,安装顺序如下:
注意:必须安装: kernel-headers-2.6.18-92.el5.i386.rpm 这个包,否则报错:
warning: glibc-headers-2.5-24.i386.rpm: Header V3 DSA signature: NOKEY, key ID e8562897
error: Failed dependencies:
kernel-headers is needed by glibc-headers-2.5-24.i386
kernel-headers >= 2.2.1 is needed by glibc-headers-2.5-24.i386
安装:g++
卸载apache相关:
强制安装:--force
强制卸载 --nodeps
libtool:
错误:checking for C compiler default output... configure: error: C compiler cannot create executables
原因:/etc/yum.conf 它已经配置好了相关的库和路径等等的依赖性!
解决:yum install libc6-dev
yum clean headers
yum clean packages
我在网上看到有人说要下一个LIBC6-DEV的包,我用YUM试了一下,下不到这个包,我看了上面既然是c++的问题,那我就下一个gcc-c++
看看
yum install gcc-c++
刚好操下命令后,它自动的帮我下了两个软件
gcc-c++
libstc++
下好以后
就这样完全通过了?那就接着试试:
sudo yum install qt4-devel curl-devel gcc glibc-devel2
yum install glibc-devel
升级:
rpm -Uvh *.rpm
应该就是下面的那些包,不行再reinstall一次看看:
2.5u]# rpm -Uvh *.rpm
Preparing... ########################################### [100%]
1:libgcc ########################################### [ 6%]
2:glibc-common ########################################### [ 12%]
3:glibc ########################################### [ 18%]
4:binutils ########################################### [ 24%]
5:glibc-headers ########################################### [ 29%]
6:glibc-devel ########################################### [ 35%]
7:libstdc++ ########################################### [ 41%]
8:libstdc++-devel ########################################### [ 47%]
9:apr ########################################### [ 53%]
10:cpp ########################################### [ 59%]
11:libgomp ########################################### [ 65%]
12:gcc ########################################### [ 71%]
13:apr-devel ########################################### [ 76%]
14:binutils-devel ########################################### [ 82%]
15:gcc-c++ ########################################### [ 88%]
16:glibc-utils ########################################### [ 94%]
17:libtool ########################################### [100%]
最后,还是发现cannot create executables,等等,最后进过比对后发现我的rpm包和系统运维的rpm包一个是CentOS-5.2-i386-bin-DVD.iso,另外一个是:CentOS-5.2-x86_64-bin-DVD.iso,我的是CentOS-5.2-i386-bin-DVD.iso,我倒。。。!! !
请参考我如何发现系统不同的这篇文章:http://www.xiangdong.org/blog/post/1503/,笑死我也。。。
结束:
查正得出:x86-64系统可以运行i386软件。只有你编译什么东西就在什么东西的连接选项上添加-march=i386 -m32,如:gcc a.c -march=i386 -m32 你也可以加到Makefile里面。
挂载CentOS的DVD系统光盘,然后进入CentOS目录内,安装顺序如下:
rpm -ivh cpp-4.1.2-42.el5.i386.rpm
rpm -ihv kernel-headers-2.6.18-92.el5.i386.rpm
rpm -ivh glibc-headers-2.5-24.i386.rpm
rpm -ivh glibc-devel-2.5-24.i386.rpm
rpm -ivh libgomp-4.1.2-42.el5.i386.rpm
rpm -ivh gcc-4.1.2-42.el5.i386.rpm
rpm -ihv kernel-headers-2.6.18-92.el5.i386.rpm
rpm -ivh glibc-headers-2.5-24.i386.rpm
rpm -ivh glibc-devel-2.5-24.i386.rpm
rpm -ivh libgomp-4.1.2-42.el5.i386.rpm
rpm -ivh gcc-4.1.2-42.el5.i386.rpm
注意:必须安装: kernel-headers-2.6.18-92.el5.i386.rpm 这个包,否则报错:
warning: glibc-headers-2.5-24.i386.rpm: Header V3 DSA signature: NOKEY, key ID e8562897
error: Failed dependencies:
kernel-headers is needed by glibc-headers-2.5-24.i386
kernel-headers >= 2.2.1 is needed by glibc-headers-2.5-24.i386
安装:g++
rpm -ihv libstdc++-devel-4.1.2-42.el5.i386.rpm
rpm -ihv gcc-c++-4.1.2-42.el5.i386.rpm
rpm -ihv gcc-c++-4.1.2-42.el5.i386.rpm
卸载apache相关:
rpm -e --nodeps httpd-2.2.3-11.el5_1.centos.3
rpm -e system-config-httpd-1.3.3.3-1.el5
rpm -e httpd-manual-2.2.3-11.el5_1.centos.3
rpm -e system-config-httpd-1.3.3.3-1.el5
rpm -e httpd-manual-2.2.3-11.el5_1.centos.3
强制安装:--force
强制卸载 --nodeps
libtool:
rpm -ihv imake-1.0.2-3.i386.rpm
rpm -ihv imake-1.0.2-3.i386.rpm
rpm -ihv automake-1.9.6-2.1.noarch.rpm
rpm -ihv imake-1.0.2-3.i386.rpm
rpm -ihv automake-1.9.6-2.1.noarch.rpm
rpm -ihv libobjc-4.1.2-42.el5.i386.rpm
rpm -ihv gcc-objc-4.1.2-42.el5.i386.rpm
rpm -ihv gcc-objc-4.1.2-42.el5.i386.rpm
rpm -ihv gcc-objc-4.1.2-42.el5.i386.rpm
rpm -ihv gcc-objc-4.1.2-42.el5.i386.rpm
错误:checking for C compiler default output... configure: error: C compiler cannot create executables
原因:/etc/yum.conf 它已经配置好了相关的库和路径等等的依赖性!
解决:yum install libc6-dev
yum clean headers
yum clean packages
我在网上看到有人说要下一个LIBC6-DEV的包,我用YUM试了一下,下不到这个包,我看了上面既然是c++的问题,那我就下一个gcc-c++
看看
yum install gcc-c++
刚好操下命令后,它自动的帮我下了两个软件
gcc-c++
libstc++
下好以后
就这样完全通过了?那就接着试试:
yum install glibc-devel-X.X.X-XX
sudo yum install qt4-devel curl-devel gcc glibc-devel2
yum install glibc-devel
升级:
rpm -Uvh *.rpm
应该就是下面的那些包,不行再reinstall一次看看:
2.5u]# rpm -Uvh *.rpm
Preparing... ########################################### [100%]
1:libgcc ########################################### [ 6%]
2:glibc-common ########################################### [ 12%]
3:glibc ########################################### [ 18%]
4:binutils ########################################### [ 24%]
5:glibc-headers ########################################### [ 29%]
6:glibc-devel ########################################### [ 35%]
7:libstdc++ ########################################### [ 41%]
8:libstdc++-devel ########################################### [ 47%]
9:apr ########################################### [ 53%]
10:cpp ########################################### [ 59%]
11:libgomp ########################################### [ 65%]
12:gcc ########################################### [ 71%]
13:apr-devel ########################################### [ 76%]
14:binutils-devel ########################################### [ 82%]
15:gcc-c++ ########################################### [ 88%]
16:glibc-utils ########################################### [ 94%]
17:libtool ########################################### [100%]
最后,还是发现cannot create executables,等等,最后进过比对后发现我的rpm包和系统运维的rpm包一个是CentOS-5.2-i386-bin-DVD.iso,另外一个是:CentOS-5.2-x86_64-bin-DVD.iso,我的是CentOS-5.2-i386-bin-DVD.iso,我倒。。。!! !
请参考我如何发现系统不同的这篇文章:http://www.xiangdong.org/blog/post/1503/,笑死我也。。。
结束:
查正得出:x86-64系统可以运行i386软件。只有你编译什么东西就在什么东西的连接选项上添加-march=i386 -m32,如:gcc a.c -march=i386 -m32 你也可以加到Makefile里面。
加密日志
High.Performance.MySQL中的MySQL’s Logical Architecture节讲述的就是有三种锁的级别:页级、表级、行级:
http://www.chinaz.com/Program/Mysql/1111442M2008.html
MySQL中InnoDB和MyISAM类型的差别:
http://www.chinaz.com/Program/Mysql/11054332H008.html
里面内容:
注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。验证了朱彦斌两个实用的Mysql技巧:
innodb表如何更快得到count(*)结果
http://www.imysql.cn/2008_06_24_speedup_innodb_count
.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
证明了为何数据库删除后还是那么大小!
InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
http://www.chinaz.com/Program/Mysql/1111442M2008.html
MySQL中InnoDB和MyISAM类型的差别:
http://www.chinaz.com/Program/Mysql/11054332H008.html
里面内容:
注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。验证了朱彦斌两个实用的Mysql技巧:
innodb表如何更快得到count(*)结果
http://www.imysql.cn/2008_06_24_speedup_innodb_count
.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
证明了为何数据库删除后还是那么大小!
InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
解决/usr/bin/ld: cannot find -lmysqlclient错误 27. 10. 类似/usr/bin/ld: cannot find -xxxx的错误有很多, 首先我们可以最简单的判断一下: 这类情况一般是由于缺乏某某库文件, 又或者可能是由于已存在的库问题版本不对造成的 一般都是解决的办法就是安装缺乏的devel包就可以解决, 当然还有其他的未知因素, 我们看一个实例: 我在一台装centos5.2 x86_64的系统上配置php环境, 提示这个错误 "/usr/bin/ld: cannot find -lmysqlclient" 于是我安装了 # yum -y install mysql-devel!





