[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > Perl > 正文
用Perl語言進行Socket編程
本文出自: 作者: (2001-08-20 15:00:00)
網絡編程是一門神秘且復雜的藝術,當然也十分有趣。Perl語言提供了豐富的TCP/IP網絡函數,所有這些函數都
直接來源C語言的socket庫函數. 
由Perl語言和C語言的socket庫函數在型式和使用方法上都是一樣的,因此會使用Perl語言進行Socket編程, 當
然也就會使用C語言進行Socket編程. 
下面是Perl語言中有關的socket庫函數列表: 
函數原型 使用說明 
accept(NEWSOCKET,GENERICSOCKET) 接受請求的socket連接.如果成功,則返回壓縮形式的網絡地址;否則返回FALSE. 
范例: 
if (!$Connect = accept(NEW,HANDLE)) 

die "Connection failed: $! 
"; 

bind(SOCKET,NAME) 建立NAME與SOCKET的綁定,其中NAME應該是對應socket正確類型的壓縮地址. 
如果成功,則返回真;否則返回假. 
在使用socket進行網絡編程時,這一函數十分重要,因為它建立了socket句柄與網絡上某個地址的關聯. 
范例: 
bind(SH,$SocketAddress); 
connect(SOCKET,NAME) 試圖與已經調用了accept()函數並等待建立連接的另外一個進程進行對話. 
如果成功,則返回真;否則返回假.NAME應該是對應SOCKET句柄正確類型的壓縮地址 
范例: 
connect(SOCK,$address) || die "Can’t connect with remote host: $! 
"; 
gethostbyaddr(ADDRESS,TYPE) 將壓縮形式的網絡地址轉換為更易人閱讀理解的名字與地址. 
當只知道主機的IP地址時,可以使用本函數查詢主機名及其他網絡信息.它返回一個列表,包含如下信息: 
($name, $alias, $addrtype, $length, $address) 
其中, $name是與IP地址對應的主機名, $alias是對應$name的其他別名, $addrtype是網絡地址的類型, $length是
地址的長度, 而$address則是壓縮形式IP地址的列表. 
范例: 
$PackedAddress = pack("C4", $IPAddr); 
($name, $alias, $addrtype, $length, $address) 
=gethostbyaddr($PackedAddress,2); 
gethostbyname(NAME) 與上面的gethostbyaddr()函數類似,不過在這裡主機名是作為參數.返回的信息格式完全相同. 
范例: 
$Host = "stuff.com"; 
($name, $alias, $addrtype, $length, $address) 
=gethostbyname($Host); 
@IP = unpack("C4",$address[0]); 
$HostIP = join(".", @IP); 

驗証郵箱密碼的程序的原碼 
下面的代碼在兩種操作系統下對263.net和pop.netease.com兩個POP3服務器嚴格測試, 証明是成功的. 
第一種: 
操作系統:Windows 98 中文版 
WWW服務器:Apache 1.3.9 for Win 
Perl 解釋器:ActiveState Tool Corp的Perl for Win32 , version 5.005_03 built for MSWin32-x86-object 
第二種: 
操作系統:Red Hat Linux 6.1 
WWW服務器:Apache 1.3.6 for Linux 
Perl 解釋器:version 5.005_03 built for i386-linux 

#!/usr/bin/perl 
# test.pl 
#Author homepage: http://spot.126.com 
use strict; 
use Socket; 

my $pop3server = "263.net"; 
my $port = 110; 

$|=1; 
print "Content-type: text/html 

"; 
print "POP3 
"; 
print " 
"; 


my ($a,$name,$aliases,$proto,$type,$len,$thataddr,$thisaddr,$i); 
my $AF_INET = 2; 
my $SOCK_STREAM = 1; 
my $sockaddr = "S n a4 x8"; 

($name,$aliases,$proto) = getprotobyname("tcp"); 
($name,$aliases,$port) = getservbyname($port,"tcp") 
unless $port =~ /^d+$/;; 
($name,$aliases,$type,$len,$thataddr) = gethostbyname($pop3server); 

my $this = pack($sockaddr, $AF_INET, 12345, $thisaddr); 
my $that = pack($sockaddr, $AF_INET, $port, $thataddr); 

my $mysocket = socket(S, $AF_INET, $SOCK_STREAM, $proto); 
if ($mysocket) 


else 

print "不能打開socket: $!"; 
exit(0); 


my $mybind = bind(S, $this); 
if ($mybind) 


else 

print "無法綁定!: $!"; 
exit(0); 


my $myconnect = connect(S,$that); 
if ($myconnect) 


else 

print "連接錯誤: $!"; 
exit(0); 


my $BUF = ""; 
my $SenderIP = recv(S, $BUF, 596,0); 
if ($SenderIP) 


else 

print "接收錯誤: $!"; 
exit(0); 


if (substr($BUF,0,3) eq "+OK") 


else 

print "POP3服務器出錯! 

"; 
exit(0); 


my $BUFFER = "USER zhangsan"; 
$BUFFER .= chr(13); 
$BUFFER .= chr(10); 

my $SENVAL = send(S, $BUFFER,0); 
if ($SENVAL) 


else 

print "發送錯誤: $!"; 
exit(0); 


my $BUF = ""; 
my $SenderIP = recv(S, $BUF, 4096,0); 
if ($SenderIP) 


else 

print "接收錯誤: $!"; 
exit(0); 


if (substr($BUF,0,3) eq "+OK") 


else 

print "無此帳號! 

"; 
exit(0); 


$BUFFER = "PASS 12345678"; 
$BUFFER .= chr(13); 
$BUFFER .= chr(10); 


my $SENVAL = send(S, $BUFFER,0); 
if ($SENVAL) 


else 

print "發送錯誤: $!"; 
exit(0); 


$BUF = ""; 
my $SenderIP = recv(S, $BUF, 196, 0); 
if ($SenderIP) 


else 

print "接收錯誤: $!"; 
exit(0); 


if (substr($BUF,0,3) eq "+OK") 


else 

print "密碼錯誤!"; 
exit(0); 


print密碼是正確的! 
本程序版權歸菜瓜樂園 

EOF      
 
 
 
  
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
Java源碼:Socket編程 (2002-01-02 08:10:00)
Java做一個最簡單的Socket通話程序 (2001-12-30 08:30:00)
類似socket傳輸的flush() (2001-12-03 07:10:00)
Socket編程中select()的妙用 (2001-09-13 09:00:00)
用gcc 編譯,為何有不同的結果 (關socket函數)? (2001-08-29 10:00:00)
BSD Socket 簡易入門手冊 (2001-08-21 09:00:00)
用Perl語言進行Socket編程 (2001-08-20 15:00:00)
linux kernel 2.4.5 ipv4 socket層的一點解釋 (2001-07-30 10:00:00)
Unix環境下的Socket編程 (2001-06-26 15:00:01)
Linux程式設計- 4.socket (2001-05-24 17:24:26)

===更多相關===
 

★  樊強制作 歡迎分享  ★