IO::Socket简介

上一篇 / 下一篇  2008-12-04 12:28:08 / 个人分类:perl

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP
导入IO::Socket包:
6Vy\#JI]YeE(L0use IO::Socket;51Testing软件测试网Y#H ?6mnp$r WCSj
讲解:51Testing软件测试网S/n"C%c J Jq
IO::Socket下又有两个子类IO::Socket::INET与IO::Socket::UNIX,我们51Testing软件测试网0k#ZK4}@E%uiq
现在用的当然是IO::Socket::INET了。
6Pp!m4wtCWcQ0-----------------------------------------------------------------------------
j??AtPAcNt0o0new()方法:
'p\!E5HN1}H0SOCKET对象变量=IO::Socket::INET->new(SOCKET变量值);
j2A&}P$GB#yXLz T0实例:51Testing软件测试网l.L7JK0u f'md}M
$sock=IO::Socket::INET->new('192.168.1.2:23');
+Jk,\~ D0讲解:51Testing软件测试网"Y'Jkx9U/V/x2l$z3Wv
所有的PERL对象编程都把对象‘形象化’为某个变量,这里的SOCKET句柄51Testing软件测试网'AD'~3CM2~
对象也不例外,调用此方法的返回值便为SOCKET对象变量了。这里使用参数为
lgY%k?0S|o0简单参数模式,在双引号或但引号内的socket地址结构为'主机IP或域名:端口51Testing软件测试网'y9p*}t*jLD&B1h:u
号或服务名称',也可以是'主机IP或域名:服务名称(端口号)'。51Testing软件测试网E N bz%{
除了最简单的单参数调用外,new方法还有很多参数可以选择性调用的,下
I{f^Q0面就对这些参数作出一个简单的概括吧:
8K ~9Z.T f0***********************************************************************51Testing软件测试网+s/\/k-p@z F
参数 描述 值类型51Testing软件测试网7G9dX6V;l$o
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
C_g"Fk Kd Zz0PeerAddr 远程主机的地址 主机地址[:端口或服务]51Testing软件测试网\Q,iy@ k7D
PeerHost 与PeerAddr相同51Testing软件测试网0p5~tt+e{ PNO/NI,t Q
PeerPort 远程端口或服务 端口或服务
3LB/LmLv4FE0LocalAddr 本地地址 主机地址[:端口或服务]
+F?"r7|i0LocalHost 与LocalAddr相同51Testing软件测试网H#S3P0X^;C mM
LocalPort 本地端口 端口或服务
k*rCE$W7I~ \"@9oq0Proto 所使用的协议 协议名或协议号
,ZIwh5@*ubM0Type 套接字类型 SOCK_STREAM/SOCK_DGRAM...51Testing软件测试网;] ?Zc/XEahXb
Listen 监听的队列长度 整形数51Testing软件测试网8JsJFlu!n'K8}
Reuse 用于避免重启时BIND时间间隙 布尔值51Testing软件测试网 q+hG:Pj!A(s
Timeout 超时值 整形数
C xg e)C:k0MultiHomed 用于连接多IP地址 布尔值51Testing软件测试网t9\N9iC%d
***********************************************************************51Testing软件测试网5taE-bw
参数PeerAddr(远程主机地址)与PeerHost(远程主机名)基本相同,调用方
{ Q j/B!Z xzq[k0式也相同,其值格式除了标准的格式外,还可以加':'号后再加端口或服务,这51Testing软件测试网K lx'kB*A7W!RX/q(UV?
样的的话,后面的参数PeerPort(远程主机端口或服务)的值就无效了。51Testing软件测试网%OO"ds5V+Q-ns*o I
参数PeerPort(远程主机端口或服务),其值的格式可以是端口,还可以是51Testing软件测试网0j8c1uW7^ F
服务名,更可以是‘组合’,如:"telnet(23)";当PeerAddr(远程主机地址)或
?St&d)\S,`0PeerHost(远程主机名)的值格式中指明了端口,再调用此参数时,此参数的值
i(u.XkF#^#w3h0无效。51Testing软件测试网r"utV r.Y@y#\%S7R
参数LocalAddr(本地主机地址)、LocalHost(本地主机名)、LocalPort(本
5S.Ko a"C2Y0地主机端口或服务)之间的关系与调用方式与上面介绍的三个参数PeerAddr(远
H0o%w6eN|0程主机地址)、PeerHost(远程主机名)、PeerPort(远程主机端口或服务)相当。
3u5R'Bmp \u7Q9g0还有一种情况,就是如果只定义了LocalPort(本地主机端口或服务),而没
`!U3pM&P!g2c,vk0有定义LocalAddr(本地主机地址)或LocalHost(本地主机名),那IO::Socket会
;kSwRv0将本地机器的地址的值默认为INADDR_ANY通配符,也就是不定义本地主机的地
E2mT/gHN3Fx W]0址值的话就定义为允许所有接口。51Testing软件测试网que${]!@?5B,G8@
Proto(协议类型)的值可以用两种方式表示。一种是直接的字符串表示方51Testing软件测试网 D*{B!Q)_
式,如:
^ P1M4p{0proto=>"tcp"
V8~e+r6M`:G0表示该协议类型为TCP。第二种方式就是直接使用协议号了,EGP---8、
?3M{M:G0HMP---20、ICMP---1、RAW---255、RDP---27、RVD---66、TCP---6、
tu(M2F u[(P0UDP---17、XNS-IDP---22、其他---22、ALL---0;也可以使用getprotobyname51Testing软件测试网B?YE&CE Ev0kh:A|
函数加协议名为参数调用获的该值,如:
b3ZJ"L G}4S#]F0proto=>getprotobyname('tcp')
]P:GV'eb0该形式也表示该协议的类型为TCP。建议还是使用第一种方式比较方便。
hd3R;R!Jb9UE0Type(套接字类型)的值通常为SOCK_STREAM(流套接字)、SOCK_DGRAM(数据51Testing软件测试网D z7?8r0_r;s(ns
报套接字)、SOCK_RAW(原始套接字)等,不用说大家都知道,TCP用的是流套接51Testing软件测试网!? C_2l9m_q
字,UDP用的是数据报套接字,构造IP包用的是原始套接字。51Testing软件测试网2gI UP4k
如果上面的参数Proto(协议类型)与Type(套接字类型)的值都不定义的话,
4Jccn:V"[0IO::Socket::INET就会通过程序中上下‘文’部分猜估它们的值,猜估不到
J*u v^Q'^0的话就会默认为'tcp'。51Testing软件测试网 b Q%y!c'DCz:nj@
参数Listen(监听队列的长度)的值是一个整形数。它代表能接受的连接主51Testing软件测试网3m:?:~Rm2E
机数量。如果您要构造服务端的话,Listen这个步骤是必不可少的。
0N A1?"H%ag0调用Reuse(在绑定前设置SO_REUSEADDR)可以免去服务器在终止到重启之51Testing软件测试网i3n,w3CD
间的所停留的时间。
$Hl*m8]N:z0h0Timeout(超时值)以秒计算,用于连接中的connect与accept这两个步骤,
!b7h%d-vU8o Q t2Z0调用目的是为了在连接远程主机不可到达时限制连接的挂起时间。51Testing软件测试网2RA ]1J3K z&\J
MultiHomed(用于连接多IP地址)的值是一个布尔值,当其值为真时,如果51Testing软件测试网$N&J \!F7U0W'm Y
要连接的主机拥有多个IP地址,则本机的new方法调用gethostbyname()穷举其51Testing软件测试网eN3J j1ZEL:g8f(I
所有IP地址,直到能成功调用为止。
y R'Yq%`Nk0从楼上的列表中可以看到IO::Socket与传统C库的Socket API接口在调用
4J7c6i(E k?0上有什么不同了:
z4{G [B ^V!T+_ d0^01)控制范围不同。C库提供的接口在生成SOCKET句柄时只能控制的只有域、套接51Testing软件测试网I.Gcg.X6Fah|*N9p
字类型、协议这几个参数。而IO::Socket接口的创建语句(调用new方法)几乎
#G#@1A"Bu%Z8k"[? \:E0能决定这个套接字的所有参数。51Testing软件测试网~{o ur!~V&@}
2)调用所使用的‘协议’定义部分不同。IO::Socket接口调用new方法中的参数51Testing软件测试网H7[$W Qi-E$E
'Proto'的值可以直接定义为'tcp',这比传统C库的Socket定义更为简便。51Testing软件测试网*Z I J*x#L7Lq
3)IO::Socket在定义时能直接定义本地主机地址、本地端口与远程主机地址、51Testing软件测试网y4c:?|C2_7z4V#B
远程端口在一个Socket中,如果是这种情况的服务端就无需调用accept了,
NV5d,{.sDR.|0在I/O读写部分可以直接向这个Socket进行读写操作,而无需再定义远程客户
B0Cy a?.D&p a`H0端的Socket了。
,lE/^!k%jMK0{O0-----------------------------------------------------------------------------
!dW}&D)qT/v9M0accept()方法:51Testing软件测试网%|0f hX5N@7RV
远程连接套接字对象变量=服务端套接字对象变量->accept();
o,Asjl)]2?0实例:
*o:V}._nf2`0$remote_sock=$sock->accept();51Testing软件测试网 g?Z3Y/S:N(m&D
讲解:
d/R)Gpb0此方法的调用环境与传统C中SOCKET库调用原理一样,用于服务端的等待监
(G8]K-n%E.K-W:v6B1Af0听过程。无参数,返回值为远程连接的套接字对象变量。调用此方法也是一个
1q|*TNc0生成套接字的过程,只不过此套接字为远程连接的套接字而已,它以对象变量51Testing软件测试网8W2q#MmWK;Z
方式存在,据有与本地套接字变量相同的属性与方法。51Testing软件测试网/`.?,V9}yQtT

fy1|H0rBoV0accept()方法在IO::Socket包里还提供另一种双返回值的调用方法:
|0S*c8ly6K5l051Testing软件测试网"FHih-` M
(远程连接套接字对象变量,远程主机压缩地址变量)=服务端对象变量->accept();51Testing软件测试网 h;utX3{ np
实例:51Testing软件测试网 O#r9X6S8a%S0|X
($remote_sock,$remote_addr)=$sock->accept();
v6w{+X?0讲解:51Testing软件测试网?lyU hBJ
与楼上一个返回值的调用方式基本相同,只是返回值中多了一个变量而已,51Testing软件测试网9VpMk~.{ ?5vD.Gq
返回值中多了个变量------远程主机压缩地址变量。51Testing软件测试网z;kF Tv^y
-----------------------------------------------------------------------------51Testing软件测试网:} Xb0U-~
bind()方法:
n;G'c _M4we0返回值变量=服务端套接字对象变量->bind(本地端口号,本地主机网络地址);51Testing软件测试网6l.u ec?'w
实例:51Testing软件测试网s"].Feh],UB
$result=$sock->bind(80,'127.0.0.1');51Testing软件测试网P&H:Ks]$J$dr
讲解:
!N7|Vk^ |0bind方法用于在服务器端绑定主机的地址与端口。它使用的两个参数都为51Testing软件测试网HkzQBUe
未压缩值,第一个为端口,第二个为主机的网络适配器接口地址(可以使用默认
K E+aA5h2hc0的保留字INADDR_ANY,此保留字包括了主机的所有网络适配器接口地址,调用
:\y\+w4A$T3h*?0它时,它会以穷举的方法穷举所有的网络适配器接口地址,直到找到为止);返
7l$Y,No:V7]0回值为布尔值,用于检测这次调用是否成功。
6B3FH&e f5t0-----------------------------------------------------------------------------
7R@5tg/]%w0t0connect()方法:
"jxN2l]*B_2Uf0返回值变量=套接字对象变量->connect(压缩地址变量);
-H.h*MQ,c:Z;\0实例:
1F%mIJks sx0$result=$sock->connect($pack_addr);51Testing软件测试网Z1^0B ^b4I3OF
讲解:51Testing软件测试网KSw,He;a dR-X
常用于TCP连接(也可用于UDP,不过不常用),调用将向远程主机发送连接
[}4HH+g(Q0请求。参数‘压缩地址变量’为sockaddr_in形式值,返回值为布尔值。若调用51Testing软件测试网!t1C9~@E
此方法则建立IO::Socket::INET对象时不能赋予参数'PeerAddr'或'PeerHost'、
8Z Uy)c} Tm0'PeerPort',否则就会出现程序逻辑错误。51Testing软件测试网"{8y2J d0V#R;[8B8\

,^,n1b+A'x"[S2l0connect()方法也有双参数调用方式,使用起来更简单:51Testing软件测试网0kQ x}6x{
51Testing软件测试网frd@ oH
返回值变量=套接字对象变量->connect(远程端口号,远程主机地址);
jp_0wIrU&W2S*OG0实例:
XsD.w_ n7b9MD"k0$result=$sock->connect($remote_port,$remote_host);51Testing软件测试网#_S)].t4v#})at7C
讲解:51Testing软件测试网i0x])H8D
调用的目的与楼上单参数的调用方式相当。第一个参数为远程需要连接的51Testing软件测试网qC3l^^L^t
主机的端口(等于new方法的参数'PeerPort'),第二个参数为需要连接的主机51Testing软件测试网 r1V5_.m:\
地址(等于new方法的参数'PeerAddr'或'PeerHost'),返回值为布尔值。51Testing软件测试网;` K.A+J/p1jh!K)O,z
-----------------------------------------------------------------------------
(Ac RL N'Xd&I*i3dQS}0listen()方法:51Testing软件测试网r@%Pa._.I L}q)Q
返回值变量=套接字对象变量->listen(请求队列的最大长度值);
_%~vB oO"wuH!QN0实例:
U|\Kd3`Rte mX0$result=$sock->listen(20);51Testing软件测试网 yw;w4KC
讲解:
y I,vo z?0I`Dz*qw6p0TCP服务端不可缺少的方法。单参数,参数为此服务端接受远端请求队列51Testing软件测试网)Q&p]3t1g{ M{,TD
的最大长度值,返回值为布尔值。调用此方法等同于在建立IO::Socket::INET51Testing软件测试网"W+c8[I/}1T b"a}1M+@?
对象时定义参数'Listen'的值,所以若在new方法中定义了参数'Listen'再调51Testing软件测试网"PAL3fR%_Y
用此方法的话就会出现‘程序定义冲突’这样的逻辑错误了。51Testing软件测试网|$I`Iv\S8Z
-----------------------------------------------------------------------------
t hW-xX-w JCg0shutdown()方法:51Testing软件测试网{)Y/ZN"yH^
返回值变量=套接字对象变量->shutdown(控制参数);
~#} g J[`O5v0实例:51Testing软件测试网 FA0Ds/nOa)GB ey
$result=$sock->shutdown(2);51Testing软件测试网p&WAP6h+L
讲解:51Testing软件测试网X-V%E2W'@ F
此方法是除了close外的另一个关闭套接字对象的方法。单参数,参数值
;? \8iky2L1D} `]0为外加参数定义,下为此方法的外加参数列表:51Testing软件测试网6n EQ)T(?1Lb
***********************************************************************51Testing软件测试网V1^p:?"d$n1^H
参数值 描述
K[D+| m9G?GL0±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
Fh8t%@ _/J#N0}00 关闭对象套接字的读操作
ahrE]01 关闭对象套接字的写操作51Testing软件测试网2BQ*Ws7vX
2 关闭对象套接字的所有操作51Testing软件测试网t f fFHY
***********************************************************************51Testing软件测试网"Aa/hM2W(F"u^ Xl4C
其返回值为布尔值。
,KV3Atl pn"I0-----------------------------------------------------------------------------51Testing软件测试网wb#uBG(eWq!i
send()方法:
~`8U)^$X3~0成功发送的数据值变量=套接字对象变量->send(发送数据,标志值,目标地址值);
#s o!d2u1X0实例:
/T0s?4Xz7`Gv0$succ_bytes=$sock->send('hihi\n',0,$pack_host);51Testing软件测试网CN Ve0gF P
讲解:51Testing软件测试网2C bI#|OK o
send方法是专门为SOCKET发送数据的特殊方法,调用格式与参数格式也基
"cMz}%Q HO8dv0本与C库的SOCKET API中的send函数相同。第一个参数是需要发送的数据;第二
X8U,~U#U&ZdQF7d0参数是标志值,不添的话默认为0;第三个参数通常只用于UDP连接,是需要连51Testing软件测试网? jyl&Cj.[5y&PL
接的sockaddr_in格式地址值(注意:当第三个参数有必要一定要写时,第二个参51Testing软件测试网}N?!is6u
数也一定要加上);返回值为成功发送的数据值大小(以byte为单位)。51Testing软件测试网MI"t.|!J
-----------------------------------------------------------------------------51Testing软件测试网#` hgA[+R)j4`
recv()方法:
!X:HC;ID1s,A:E[/t A0压缩远程地址地址=套接字对象变量->recv(接收数据变量,接收数据值长度,标志值);51Testing软件测试网6hw.e i){y8{5cw D
实例:
)A8S6n.T.I$W(e0$remote_pack_address=$sock->recv($mem,100,0);
7`)Pn*T0y7P0讲解:
_&U:jh[r0recv方法是专门为SOCKET接收数据的特殊方法,调用格式与参数格式也与51Testing软件测试网GW^ce'FJ
C库的SOCKET API基本一样。第一个参数是存放接收后的数据的变量值;第二个51Testing软件测试网Oj[$l8y;V c,[1`+Ze uQ
参数是接收的数据的长度值;第三个参数是标志值,默认为0就可以了(省略此
[5N JL-KD0值不填,系统默认也为0)。
:zLO#q4j`-Q0-----------------------------------------------------------------------------51Testing软件测试网sa+c]gBM
IO::Socket接口的常用方法就介绍完了,不过还有一个问题是需要注意的:
3tQ&Y-yc#u-Cs(Rc t0作为一个简单的客户端,它的步骤只需要先调用new方法,然后立刻就可以进行基本I/O操作(使用print与getline51Testing软件测试网U&J2| CG|'z'U9k
等基本I/O方法)了,最后只需调用close方法结束会话,那么整个SOCKET会话就算完成了。

TAG: perl

 

评分:0

我来说两句

Open Toolbar