Skip navigation.

【*可可熊D窝*】

cocobear'home

Posts tagged with "programming"

项目文档--概要设计说明书 V0.1

一引言


1.1编写目的

确定整个程序设计框架,以及需要实现的功能,对程序接口进行定义,定义运行状态以及出错处理。

1.2背景

a.项目名称:xylFTP(待定)
b.
任务提出者:王老师
开发者:见软件需求说明书1.2.b
用户:服务端主要面向Linux用户,客户端面向所有可以使用JVM的用户。
中心:运行FTP服务器的机器

1.3定义

JVM:java virtual machine
FTP:File Transfer Protocol

1.4参考资料

a.软件需求说明书[url]http://wangcong.org/blog/?p=119
b.见软件需求说明书1.4

二总体设计

2.1需求规定

a.输入:服务端需要配置文件xylftp.con,不接受其它参数输入。客户端接受从终端输入的命令,以及启动客户端所带参数。
-u$user 使用$user连接,当不使用-u时使用shell用户名连接。
-h[$command]显示客户端所允许的命令,$command指定的情况下显示$command相关使用方法。
-v显示版本信息
-d显示更多额外信息,供查错使用。
-a自动登录,使用.xylftpauto.conf文件中包含的内容自动登录

b.输出:服务端在运行过程中产生文件xylftp.log,收集一些客户端连接信息,包括登录时间,IP,下载、上传文件、数据量,以及断线时间。客户端响应终端输入显示帮助,以及服务端返回的信息,同时保存登录时用户信息在xylftpauto.conf文件中,供自动登录使用。




2.2运行环境

服务端支持i368,x86_64,客户端适用于所有可使用JVM的机器上。

2.3基本设计概念和处理流程

服务端:
目的是设计一个简洁,高效的FTP服务器,并不涉及到较为复杂的安全策略(有关FTP的明文传输),以较快的速度完成整体框架的设计,然后对具体模块进行改进,优化。
服务端程序配套的带有一个xylftptool的工具,可以用它来生成配置文件(当配置文件被改乱或者丢失的时候使用),以及检查配置文件的错误,同时可以生成用户数据,采用md5加密存储。服务端启动的时候先读取xylftp.conf文件,将文件中的参数传递给主程序,然后通过参数解析函数完成参数的处理,把相应的值赋给全局变量以及函数。主程序调用ftp_linsten()函数进行监听,如果相应端口(未必是21,可根据xylftp.conf文件更改)有连接请求,则调用ftp_server()处理,此时应该考虑服务端使用的是passive还是port模式,分别采取不同的处理方式,如果是passive模式,则应开启相应的data port等待客户端的数据连接,如果是port模式,则使用端口20数据传输的初始化。随后该函数使用fork()建立新的进程处理用户请求。主程序继续处于ftp_listen()状态,直到进程被杀死。

客户端;
设计一个简单,实用的FTP客户端,支持常用的FTP命令,使用java标准库开发,并且预留GUI接口。
客户端首先接收命令行的输入,使用命令解释程序来解析命令,如果本地可以完全的命令,直接调用相应的函数完成,如果需要传送到远程FTP主机,则传输相应的命令到远程FTP。同时客户端不断接收服务端的处理结果,并显示。

2.4结构





2.5功能需求与程序的关系

服务端提供FTP服务,客户端连接服务器使用其提供的功能。


2.6人工处理过程

无人工处理过程

2.7尚未解决的问题


服务端运行模式。

三接口设计

3.1用户接口

服务端不向用户提供任何命令,用户可以通过修改配置文件xylftp.conf文件来实现对服务端启动方式的修改。

客户端提供命令如help,quit,bye等,详见需求规定(暂时未完成)

3.2外部接口

服务端需要在运行有Linux系统主机的shell下启动,无交互模式。客户端需要JVM的支持。

3.3内部接口

见2.4结构

四运行设计


4.1运行模块组合

(vsftpd有两种启动模式:stand alone以及super daemon,不知道我们需要这样做吗?具体两种方式见附文一。
服务端支持被动模式吗?如果支持被动模式难度似乎会增加很多,见附文二)


4.2运行控制

由4.1决定

4.3运行时间

由4.1决定

五系统数据结构设计


5.1逻辑结构设计要点

应该要用到排序算法可使用哈唏排序

5.2物理结构设计要点

直接使用系统调用存储文件,不考虑存取的物理关系。

5.3数据结构与程序的关系

没必要

六系统出错处理设计


6.1出错信息

服务端:
error01-读取xylftp.conf文件错误,请确认xylftp.conf存在,并且有读取权限。
error02-xylftp.conf文件格式错误,请根据说明更改xylftp.conf文件内容。
error03-xylftp已经运行,结束xylftp进行,重新启动。
error04-其它FTP服务器(也可能是其它应用程序)占用21端口,结束相关占用21端口程序的进程。
error05-用户名不存在,使用其它用户名登录,或者联系FTP管理员。
error06-密码错误,尝试其它密码,或者联系FTP管理员。
error07-[大家添加一些]
客户端:
error01-无法连接远程主机,请确认远程主机是否活动,使用ping命令,请确认远程主机是否使用默认端口21
error02-无法上传文件出错,请确认使用的用户是否具有相应目录的写权限。
error03-无法下载文件出错,请确认使用的用户是否具有相应的读取权限,以及本地目录是否有写入权限。
error04-下载过程中出错,请确认网络处于连接状态,并重新下载。
error05-远程主机关闭,请与远程FTP管理员联系。
error06-[大家添加一些]

6.2补救措施

下载过程中出错(包括文件传输中断,以及文件校验不符),则重新下载,重试次数3次。

6.3系统维护设计


服务端运行时产生详细的运行记录供维护使用,客户端使用-d参数显示详细的服务端返回信息。

附文一:

vsftpd 啟動的模式
vsftpd 可以擁有兩種啟動的方式,分別是一直在監聽的 stand alone ,一種則是透過 xinetd 這個 super daemon 來管理的方式,兩種方式所使用的啟動程序不太相同,而我們的 CentOS 則預設是以 stand alone 來啟動的。 那什麼時候應該選擇 stand alone 或者是 super daemon 呢?如果你的 ftp 伺服器是提供給整個網際網路來進行大量下載的任務,例如各大專院校的 FTP 伺服器,那建議你使用 stand alone 的方式, 服務的速度上會比較好。如果僅是提供給內部人員使用的 FTP 伺服器,那使用 super daemon 來管理即可啊。


附文二:
Tinyftp is a small ftp server. It implements a set of all
the neccessary commands for performing the main actions,
suppported by the protocol. The server is based on rfc959.
This server does not support "passive" mode, because it needs
a simultaneous communication on a custom free port for
additional data transfers. For this we will need an IPC, which
hardens the implementation a lot.
The only valid user, that can log in is "anonymous", because of
the different authentication mechanism on different platforms.
All server options are set from the command line parameters.

使用awk消除行号

在读ABS(Advanced Bash-Scripting Guide)的时候,遇到书中的示例代码如下:
   1 #!/bin/bash
   2 # broken-link.sh
   3 # Written by Lee bigelow <ligelowbee@yahoo.com>
   4 # Used with permission.
   5 
   6 #A pure shell script to find dead symlinks and output them quoted
   7 #so they can be fed to xargs and dealt with :)
   8 #eg. broken-link.sh /somedir /someotherdir|xargs rm
   9 #
  10 #This, however, is a better method:
  11 #
  12 #find "somedir" -type l -print0|\
  13 #xargs -r0 file|\
  14 #grep "broken symbolic"|
  15 #sed -e 's/^\|: *broken symbolic.*$/"/g'
  16 #
  17 #but that wouldn't be pure bash, now would it.
  18 #Caution: beware the /proc file system and any circular links!
  19 ##############################################################
  20 
  21 
  22 #If no args are passed to the script set directorys to search 
  23 #to current directory.  Otherwise set the directorys to search 
  24 #to the agrs passed.
  25 ####################
  26 [ $# -eq 0 ] && directorys=`pwd` || directorys=$@
  27 
  28 #Setup the function linkchk to check the directory it is passed 
  29 #for files that are links and don't exist, then print them quoted.
  30 #If one of the elements in the directory is a subdirectory then 
  31 #send that send that subdirectory to the linkcheck function.
  32 ##########
  33 linkchk () {
  34     for element in $1/*; do
  35     [ -h "$element" -a ! -e "$element" ] && echo \"$element\"
  36     [ -d "$element" ] && linkchk $element
  37     # Of course, '-h' tests for symbolic link, '-d' for directory.
  38     done
  39 }
  40 
  41 #Send each arg that was passed to the script to the linkchk function
  42 #if it is a valid directoy.  If not, then print the error message
  43 #and usage info.
  44 ################
  45 for directory in $directorys; do
  46     if [ -d $directory ]
  47 then linkchk $directory
  48 else 
  49     echo "$directory is not a directory"
  50     echo "Usage: $0 dir1 dir2 ..."
  51     fi
  52 done
  53 
  54 exit 0


想复制下来自己执行一下,无奈每行都有行号,不能直接做为shell脚本执行,当然不甘心了,于是想到强大的awk,写了如下awk脚本:
{
i=2;
while (i <= NF) {
ORS=" ";
if (i == NF) {
ORS="\n";
}
print $i;
i++;}
}

其实很简单,只要实现不打印第一个字段的内容,就可以完成消除行号。似乎应该有更简单的awk脚本,更是暂时没有想到,所以用了这个笨办法,从第二个字段开始打印,直到NF(当前记录的字段总数),默认的print打印字段后是输出一个“\n”,于是做了一个简单的判定,只有当打印最后一个字段后才输出"\n",否则使用" "(空格)作为print的额外输出。

不知道哪位对awk比较熟悉,如何能使这个脚本更简单(用一行语句就搞定),麻烦告诉我一声。

同样,这个脚本可以处理使用"cat -n"(该命令作用是给每一行加行号) 命令生成的文件

有关awk的参考文章:FROM

改进的bash脚本[网页资源提取]

提取网页中资源的一个小工具

使用方法(假设保存bash脚本的文件名为get):

./get -u http://my.opera.com/blog/ -t pdf

上面的命令会连接到my.opera.com/blog自动搜索pdf格式的资源,并下载(先给get加可执行权限)

如果网页文件已经保存,可以使用下面的命令:

./get -f index.html -t pdf

得到的结果与前面相同

代码如下:

#!/bin/bash
#Write for downing special type of file in website.
#Author:cocobear
#E-Mail:cocobearc@gmail.com
URL=false
FILE=false
HELP=false
TYPE=false
function help() {
        echo "Usage:$0 -[f <filename> h u <url> ] -[t type] "
        exit 1;
}
function awkfile() {
        filename="$1.$2"
        #type="$2$" match specify type at the end of url 
        awk -v type="$2$" '
        BEGIN {FS = "\""} 
        {
        for (i=1;i<=NF;i++)
        if (($i ~ /^http:/) && ($i ~ type ))
                {print $i}
        }' $1 > $filename
        echo "Delete temp file."
        rm  $1
        if [ -s $filename ]
        then wget -i $filename
        else echo "Find nothing match $2"
        fi
        echo "Delete temp file."
        rm  $filename
        exit 
}
function processurl() {
        tempfile="downfile"
        if [ -e $tempfile ]
        then
                echo "$tempfile exist!!" 
                exit 1
        fi
        #redirection 
        wget -O $tempfile $1
        if [ -s $tempfile ]
        then awkfile $tempfile $2
        else echo "Nothing down!"
        fi
        exit 
}

if [ $# -eq  ];
then
        help
        exit 1
fi

#deal with option
while getopts :f:hu:t: option
do
case $option in
f)FILE=$OPTARG
;;
h)help
;;
u)URL=$OPTARG
;;
t)TYPE=$OPTARG
;;
?)
echo "Missing arguments!"
help
;;
esac
done
if [ $TYPE = "false" ]
then {
        echo "Missing type"
        help
}
else {
        if [ $FILE = "false" ] && [ $URL = "false" ]
        then {
                echo "Must specify the filename or url"
                help
        }
        else {
                if [ $FILE != "false" ] &&  [ $URL != "false" ]
                then {
                        echo "filename and url can't be specify together"
                        help
                }
                fi
        }
        fi
}
fi
#main
if [ $FILE != "false" ]
then {
        if [ -e $FILE ]
        then awkfile $FILE $TYPE
        else {
                echo "No such file!"
                exit 1
        }
        fi
}
else processurl $URL $TYPE
fi

主要用到的就是awk进行文本的分析,大部分的shell是用来分析参数的,在写这个脚本的时候基本是边学边写的,也弄懂了不少东西。有时间的时候会写一个详细的分析解释

第一个bash脚本[提取网页中的特定资源]

RT 应该算是第一个比较有意义的bash脚本:D ,可以提取网页中的资源,类似于flashget等工具中的"下载全部链接",只是偶的脚本只是把网页中的资源地址保存在一个文件里面,然后可以使用wget -i filename来下载。 下面这个脚本是提取网页中的mp3地址(偶在下听力材料的时候觉得一个一个点链接下载麻烦,想到了写这个脚本),先简单的贴出来:
#!/bin/bash
#Write for downing special type of file in website.
#Author:cocobear
#E-mail:cocobearc@gmail.com
if [ $# -eq  ];
then
        echo "Usage:$0 filename" 
        exit 1
fi
#Can't write as "filename = aaa",there is no blank around '='
#filename=aaaa
mp3=.mp3
filename="$1$mp3"
awk '
BEGIN { FS = "\"" }
{
for (n=1;n<NF;n++)
if (($n ~ /^http:/) && ($n ~ /\.mp3$/))
        {print $n}

}' $1 > $filename



需要改进之处:添加选择下载文件类型,自动使用wget开始下载 顺便在这里写个笔记:

合并字符串:

var="$var1$var2"
变量赋值:
var=something
这里的=两边不可以有空格,以前写C的时候习惯两边写空格,结果在这里不行p:

vim中导出语法高亮的文件:

:runtime! syntax/2html.vim
在命令行中输入以上内容

它本身并不是语法文件,只是一个把当前窗口转换成 HTML 的脚本。Vim 打开一个新窗 口,在那里它构造 HTML 文件

Extensions to the C Language Family(C语言家族扩展) 翻译

gcc-3.1.1的C语言扩展


原文地址:
http://gcc.gnu.org/onlinedocs/gcc-3.1.1/gcc/index.html#toc_C%20Extensions

花了挺长时间来翻译的这个,其中也学到了不少东西。似乎是最后两节没有翻译,因为原来的文档是老师给的,没有仔细与gnu网站上的内容对照。刚开始还准备翻译最新的4.1.1,但是最后章节里的东西太多了,有点吓人,就没有去做,:D 还是老版本的精炼!

blog内访问:
C语言家族扩展
kerneltravel访问:
C语言家族扩展

翻译人员
5.1--5.6林峰
5.7--5.20董溥
5.21--5.26王聪
5.27--5.34刘洋
5.35--5.43贾孟树


可以使用右键保存

不怎么写html代码,结果标签没用好,导致如果改名就不能正确使用前面的书签,现在已经修正!

C语言写的一个俄罗斯方块

和前一个21点游戏一样,也是用到了TC256的一些函数,不过仅限于几个画图的函数,其实完全可以自己写的,呵呵,懒了一点,不过原本的计划是做更多一些的界面,所以用了TC256,由于时间关系,没有做那么多的界面,也没有加入鼠标的支持,美化也做的不够,暂时只能这样了,以后有时间的时候继续改进吧,大家在使用的时候发现BUG或者别的问题请给我留言或者EM:cocobearc@gmail.com

游戏下载地址:

http://files.myopera.com/cocobear/files/corussia.tar.gz

源码下载:

http://files.myopera.com/cocobear/files/corussia.c


C语言写的21点游戏[支持鼠标键盘]

用TC256写的一个扑克版的游戏,支持鼠标与键盘的操作, 在WIN2000下运行可能鼠标只能在一个固定的范围内移动,暂时没有找到解决的办法,;应该是TC256鼠标驱动的问题,本来想不用TC256的鼠标驱动,自己重新再写一个,但是这样所有有关鼠标的操作都要重新再写一遍,就没有重新写.欢迎指出BUG,提出建议,偶的邮箱:cocobearc@gmail.com

游戏下载地址:

http://files.myopera.com/cocobear/files/card.rar

源代码:

http://files.myopera.com/cocobear/files/card.c

PS:压缩文件中的一个指向DOS的快捷方式不可以删哦,不然就不能运行了!
December 2009
S M T W T F S
November 2009January 2010
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31