Perl语言高级编程专题Lesson 9周晓方courses@xfzhou.homedns.org1MAC地址, IP地址, 端口号•MAC地址:–网卡绑定的唯一48bit地址,六段16进制表示•IPv4地址:–––––32bit网际网地址,表示成四段十进制数10.10.10.1127.x.x.x是localhost, 表示本地,用于开发调试10.x.x.x, 172.16-32.x.x, 192.168.x.x等用于内网子网的第一个IP用于路由,最后一个IP用于广播互联网上IP地址和域名之间有对应关系(DNS)•端口号:–1~65535的一个数字,常用协议有固定的端口号(1~1023)–http 80, ftp 21, https 443, smtp 25, pop3 101, etc•每台PC可以装多个网卡,每个网卡对应一个MAC地址,但可绑定多个IP地址,每个IP可以有多个域名2网络常用工具(以Windows为例)•••••ping 域名或IP了解远程机器的相应情况nslookup 域名或IP检测DNS信息tracert 域名或IP列出到达指定IP的路径netstat –p tcp列出TCP连接的端口号和情况ipconfig (/all)列出本机网卡的MAC/IP地址等以下这些是微软网络的命令•net share查看本机共享资源•net view /domain查看域、工作组名•net view \\\\pc_name查看其他机器的共享资源3ftp(File Transfer Protocol)入门•命令行ftp的常用命令––––––––––––open 域名或IP [端口号]并输入用户和口令ls或dir列出远程目录的文件列表cd/pwd/mkdir改变/显示/创建远程目录lcd改变本地目录!进入shellbin/ascii传输模式get/mgetname下载单个文件/一组文件put/mputname上传单个文件/一组文件prompt是否逐一提示(传多个文件时)hash传输文件时是否提示进度close关闭连接quit退出4•面向对象格式,完全摹仿命令行方式––––––Perl脚本连接ftp站点$ftp = Net::FTPànew($host [, %options,例如port=>21等])$success = $ftpàlogin($user, $password)$ftpàbinary / ascii / hash / pwd / ls / dir / cwd(dir) / delete(file) …$ftpàget(远端文件名[, 本地文件名[, 起点]]) 可以断点续传$ftpàput(本地文件名[, 远端文件名] )上传文件use Net::FTP; #列目录并下载打印index.txt文件打开句柄读远端文件use constant HOST => 'localhost';$fh= $ftpàretr(文件)use constant USER => 'anonymous';#connect, login, and list directory–打开句柄写远端文件my $ftp = Net::FTP->new(HOST) or die $@;$ftp->login(USER) or die $@;$fh=$ftpàstor(文件)print $ftp->pwd, \"\\n\";$fh=$ftpàappe(文件)my @dir = $ftp->dir;print join(\"\\n\", @dir), \"\\n\";–远端文件的修改时间#download a file and dump to STDOUT$time=$ftpàmdtm(file)my $fn = 'index.txt';my $fh= $ftp->retr($fn);warn \"Can't find $fn\" if not $fh;–得到远端文件大小print <$fh> if $fh;$size=$ftpàsize(文件)$ftp->quit;5•(续上页)断点续传下载的一种写法:$offset = (stat($file))[7] || 0; #如果文件大小>0则续传$ftp àget($file, $file, $offset);•如何透过防火墙/代理访问ftp:参考Net::ConfigNet::FTP的父对象——Net::Cmd•command($command)方法发送命令ok方法返回成功与否response方法返3位结果码的第一位code方法返回3位数值型结果码message方法返回文本消息结果码在400以上的表示错误信息,例如正常login一个ftp服务器后会有类似这样的反馈:331 Anonymous access ok: give e-mail address as passwordPassword:*****230 User anonymous logged-in6发邮件的协议SMTP:25•下面是一次SMTP(Simple Mail Transfer Protocol) 对话:连接SMTP服务器C:>telnet mailserver.com 25220 mailserver.com Welcome to RaidenMAILDSMTP service v1903, Wed, 26 May 2004 13:21:40 +0800, (C)2001-2003HELO my_domain.com220连接成功打招呼,告知域名告知发件人邮箱告知收件人邮箱开始写信250 my_domain.com250好的250邮箱正确250邮箱正确354写信提示mail from: userA@mailserver.com250 (EMPTY) Sender OKdatarcpt to:
250 userB@mailserver.com recipient verified354 start mail input; end with .hello!..quit信的内容.表示信结束礼貌地退出250 mail received, ready to proceed.221 RaidenMAILDSMTP service signing off失去了跟主机的连接。C:>_250信收到221服务结束C:>_7收邮件的协议POP3:110•下面是一次POP3(Post Office Protocol 3)对话:连接POP3服务器登录用户名登录口令列出所有邮件+OK Welcome to RaidenMAILDPOP3 service v1903, Wed, 26 May 2004 13:51:56 +0800,(C)2001-2003user USER2pass ****listC:>telnet mailserver.com 110+OK连接成功+OK有这个用户+OK登录成功+OK有1封信编号、长度+OK USER USER2 OK+OK Password OK, enter mailbox now.+OK 1 1121 112.+OK 112 octetsReceived: from local([192.168.11.111]) by RaidenMAILD([10.11.11.1]); Wed, 26 May 2004 13:24:58 +0800hello!..dele 1quitretr1看第1封信来源和日期信的内容删除第1封信礼貌地退出+OK mail 1 deleted+OK RaidenMAILDPOP3 service signing off失去了跟主机的连接。C:>_+OK删除成功+OK结束服务C:>_8用Perl发信(no spam,严禁发送垃圾信件)•Net::SMTP的例子#!/usr/bin/perl -wuse strict;use Net::SMTP;use constant HOST => '你的SMTP邮箱服务器地址';use constant USER => '你的用户名';use constant SENDER => '发信人@域名';use constant RECIPIENT => '收信人@域名';my $smtp= Net::SMTP->new(HOST);#-----SMTP需要身份认证?-----print \"Authenticate Password for \" . USER . \":\";my $password = ;chomp $password;$smtp->auth(USER, $password);#-----开始发信----$smtp->mail(SENDER);$smtp->recipient(RECIPIENT); # 可以同时给多人($addr1, $addr2, $addr3...)$smtp->data(<<\"HERE\");helloHERE$smtp->quit;9用Perl发信(II)•身份认证需要安装Authen::SASL模块,见CPAN$smtpàauth('用户名', '密码');•数据可以分多段发送,并发送信封:$smtpàdata();$smtpàdatasend(\"From:发方\\n\\"To: 收方\\n\\"Subject: 主题subject\\n\";$smtpàdatasend(@data); #可分多次调用datasend$smtpàdataend;#表示信体结束•可以在quit之前反复$smtpàmail(…)发送多封信件•发送带附件的信要用到MIME::Tool或者MIME::Lite等模块10用Net::POP3收信$pop3 = Net::POP3ànew('服务器地址')$message = $pop3àlogin(用户名,密码)$last = $popàlast$popàdelete(消息编号)$popàreset$hashref = $popàlist$size=$popàlist(消息编号)#连接#登录#消息编号是1~$last, 如果$last>=1#给消息做删除标记,quit时才删除#复位,取消所有的删除标记#返回散列引用, (消息编号è长度)#返回指定消息的长度#读取消息,返回数组引用#读取消息,返回可读句柄$arrayref= $popàget(消息编号)$handle = $popàgetfh(消息编号)print <$handle> ……$popàquit#退出11用Net::HTTP下载网页•下载三个网页(超文本, jpeg, 错误连接)并显示use Net::HTTP;my ($path, $http, $code, $mess, %h, $buf, $n);$http = Net::HTTP->new(Host => \"animal.vine.homedns.org\", KeepAlive=> 1)or die $@;foreach$path (\"/\", \"/041/04131A.jpg\", \"/bad\") {$http->write_request(GET => $path, 'User-Agent' => \"Mozilla/5.0\");($code, $mess, %h) = $http->read_response_headers;print STDERR \"$path\\ncode: $code, mess : $mess, hash pairs :\\n\";print STDERR \"$k = $v\\n\" while ($k, $v) = each %h ;print \"------\\n\";next if $code ne\"200\";binmodeSTDOUT;while (1) {$buf;$n = $http->read_entity_body ($buf, 1024);die \"read failed: $!\" unless defined $n;last unless $n;print $buf;}print \"\\n======\\n\\n\";}12运行结果•注意Code/mess/%h的返回值连接超文本/code : 200, mess : Ok, hash pairs :Content-Type = text/htmlConnection = Keep-AliveLast-Modified = Sat, 31 Jan 2004 13:47:34 GMTServer = Xitami/ProContent-Length = 521Keep-Alive = timeout=30, max=25------Jan, (以下省略,共521字节)=====连接JPEG二进制图像/041/04131A.jpgcode : 200, mess : Ok, hash pairs :连接无效网页时/badcode : 404, mess : Not found, hash pairs :Content-Type = text/htmlServer = Xitami/ProContent-Length = 117------Content-Type = image/jpegConnection = Keep-AliveLast-Modified = Sun, 08 Feb 2004 07:56:10 GMTServer = Xitami/ProContent-Length = 12073Keep-Alive = timeout=30, max=25------??? JFIF(二进制内容,以下省略,共12073字节)13期末课题设计选题库•用Perl/Tk设计一个华容道游戏,用户能用鼠标控制,布局可参考http://www.2003.com.cn/pupil/yizhi/hrd.html•用Perl/Tk和Net::SMTP/POP3等设计一个邮件软件,可以收发文本邮件。发信可选择认证功能,如果收件人是多人,则自动发送多次,每次发给一个收件人。收信时列出邮件编号,每次显示一封信,不从服务器删除信件。•设计一个ftp目录克隆软件,只下载需要更新的文件和目录。要求有Tk界面,提示ftp路径、登录信息。先搜索本地和远端目录,确定并列出需要更新的文件列表,然后一一下载,并显示进度条。14期末课题设计选题库•写一个天气预报转发软件,找一个上海市天气预报的网址,下载并转成文本格式,然后用Tk显示,并用SMPT发信给客户。至少要有天气情况、最低最高气温、风力风向等,比如http://www.meteo.online.sh.cn/gb/cgi-bin/shtqyb.exe/showtab?prod=shtqyb&data=shrx&sxjl=sxjl•写一个天气情况记录软件(记录股票价格也一样),和上题类似,但结果记录在Excel文件中(OLE),如果每6小时运行一次的话就可以得到一个天气变化的记录表。再把气温变化用图标形式保存到GIF文件中(也通过Win32::OLE控制Excel来实现)。•用Perl/Byacc/Flex的知识写一个C语言源程序格式美化软件。•自选题15期末课题设计规定•每2-3人合作做一个Project,专人负责文档。•如果有问题,可随时email提问。•要求本周末写需求报告,确定明确的项目目标、输入输出、功能、交互细节等。•下周上课前完成软件结构设计文档(实现方法、软件流程、框图等)和详细设计文档(子程序的安排,每个子程序的接口,文件、数据结构等),课堂安排答疑。•下周末前完成编码、调试。准备Viewgraph。•下下周上课时各小组上台讲解Project。16