QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 878|回复: 3

半天学会了TCL

[复制链接]
发表于 2003-12-31 23:07:16 | 显示全部楼层 |阅读模式
公司用这个东东来做测试用的脚本语言,要求要学.按照培训教程,很快就学会了,接着下午就试着用它来写了个静态网页服务器,短短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服务器了.

以上代码凭回忆写出,有可能有语法错误.
发表于 2005-2-20 08:55:47 | 显示全部楼层
我顶!!!!!!!!!!!!!!!1
回复

使用道具 举报

发表于 2005-2-20 13:03:06 | 显示全部楼层
[quote:7738a38ce8="BOoRFGOnZ"]我顶!!!!!!!!!!!!!!!1[/quote]   
回复

使用道具 举报

发表于 2005-2-21 19:57:28 | 显示全部楼层
厉害~~~~~~~~


-----------------
菜鸟,学习中
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-6 16:35 , Processed in 0.034011 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表