|
公司用这个东东来做测试用的脚本语言,要求要学.按照培训教程,很快就学会了,接着下午就试着用它来写了个静态网页服务器,短短20多行代码.
TCL,全名Tools Command Language,最初在Unix下开发出来,由于简单易学,功能强大,后来移植到Win,Mac等平台,自然Linux下同样也是过去经常用的一种脚本语言了.
TCL的语法和C语言的最大差别在于它实际上是一些命令的组合,把它的语法理解为命令行的集合最合适不过了.不如set a 100就是把100赋值给变量a,然后就可以用$a来使用它,例如puts $a就是显示这个变量的结果.刚开始可能很不习惯这种格式,特别是将if语句写成if {...} {...}格式就很特别.但如果理解成命令行就好理解了.
下面就是我那天写的一个网页服务器的代码:
[code:1]
proc sck_process {ClientID ClientIP ClientPort} {
gets $ClientID firstline ;#获取http请求包的第一行
#用正则表达式解析第一行,例如
#GET /index.html?id=32&nm=ww
#其中ss为?后的查询串id=32&nm=ww
set strreg "^GET /([^\?]\??(*?)( HTTP/1.1))$"
regexp $strreg $firstline s0 sUrl ss st
set filename "/home/www/"
#暂不做网址安全性检查,例如
#http://localhost/../../etc/passwd
#就可以下载密码文件啦!
append $filename $sUrl ;
#如果文件不存在返回错误页面
if {[file exists $filename]==0} {
set $filename "/home/www/err.htm"} ;
open fh $filename r
while {![eof $fh]} {
gets $fh line ;#逐行读入网页文件
puts $ClientID $line ;#写出网页内容
flush $ClientID ;#使浏览器可以边加载边显示
}
close $fh
close $ClientID ;#断开客户端连接
}
#创建服务器就这一句,当有客户端请求时
#调用sck_process过程:
set ServerSocket [socket -server sck_process 80]
#如果没有这一句就不会进入消息循环,
#程序会立即退出并关闭Socket:
vwait $ServerSocket
close $ServerSocket
[/code:1]
在此基础上,考虑Request,Response,Session等设计思路和完善对http请求包的解析,采取模块化/插件思想,就可以开发一个全功能的Web服务器了.
以上代码凭回忆写出,有可能有语法错误. |
|