设为首页 收藏本站
查看: 877|回复: 0

[经验分享] perl_IO::Socket简介

[复制链接]

尚未签到

发表于 2018-8-31 08:26:41 | 显示全部楼层 |阅读模式
  导入IO::Socket包:
  use IO::Socket;
  讲解:
  IO::Socket下又有两个子类IO::Socket::INET与IO::Socket::UNIX,我们
  现在用的当然是IO::Socket::INET了。
  ----------------------------------------------------------------------------
  Notes:
  作为一个简单的客户端,它的步骤只需要先调用new方法,然后立刻就可以进行基本I/O操作(使用print与getline等基本I/O方法)了,最后只需调用close方法结束会话,那么整个SOCKET会话就算完成了。
  -----------------------------------------------------------------------------
  new()方法:
  SOCKET对象变量=IO::Socket::INET->new(SOCKET变量值);
  实例:
  $sock=IO::Socket::INET->new('192.168.1.2:23');
  讲解:
  所有的PERL对象编程都把对象‘形象化’为某个变量,这里的SOCKET句柄
  对象也不例外,调用此方法的返回值便为SOCKET对象变量了。这里使用参数为
  简单参数模式,在双引号或但引号内的socket地址结构为'主机IP或域名:端口
  号或服务名称',也可以是'主机IP或域名:服务名称(端口号)'。
  除了最简单的单参数调用外,new方法还有很多参数可以选择性调用的,下
  面就对这些参数作出一个简单的概括吧:
  ***********************************************************************
  参数              描述                          值类型
  ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
  PeerAddr          远程主机的地址                主机地址[:端口或服务]
  PeerHost          与PeerAddr相同
  PeerPort          远程端口或服务                端口或服务
  LocalAddr         本地地址                      主机地址[:端口或服务]
  LocalHost         与LocalAddr相同
  LocalPort         本地端口                      端口或服务
  Proto             所使用的协议                  协议名或协议号
  Type              套接字类型                    SOCK_STREAM/SOCK_DGRAM...
  Listen            监听的队列长度                整形数
  Reuse             用于避免重启时BIND时间间隙    布尔值
  Timeout           超时值                        整形数
  MultiHomed        用于连接多IP地址              布尔值
  ***********************************************************************
  参数PeerAddr(远程主机地址)与PeerHost(远程主机名)基本相同,调用方
  式也相同,其值格式除了标准的格式外,还可以加':'号后再加端口或服务,这
  样的的话,后面的参数PeerPort(远程主机端口或服务)的值就无效了。
  参数PeerPort(远程主机端口或服务),其值的格式可以是端口,还可以是
  服务名,更可以是‘组合’,如:"telnet(23)";当PeerAddr(远程主机地址)或
  PeerHost(远程主机名)的值格式中指明了端口,再调用此参数时,此参数的值
  无效。
  参数LocalAddr(本地主机地址)、LocalHost(本地主机名)、LocalPort(本
  地主机端口或服务)之间的关系与调用方式与上面介绍的三个参数PeerAddr(远
  程主机地址)、PeerHost(远程主机名)、PeerPort(远程主机端口或服务)相当。
  还有一种情况,就是如果只定义了LocalPort(本地主机端口或服务),而没
  有定义LocalAddr(本地主机地址)或LocalHost(本地主机名),那IO::Socket会
  将本地机器的地址的值默认为INADDR_ANY通配符,也就是不定义本地主机的地
  址值的话就定义为允许所有接口。
  Proto(协议类型)的值可以用两种方式表示。一种是直接的字符串表示方
  式,如:
  proto=>"tcp"
  表示该协议类型为TCP。第二种方式就是直接使用协议号了,EGP---8、
  HMP---20、ICMP---1、RAW---255、RDP---27、RVD---66、TCP---6、
  UDP---17、XNS-IDP---22、其他---22、ALL---0;也可以使用getprotobyname
  函数加协议名为参数调用获的该值,如:
  proto=>getprotobyname('tcp')
  该形式也表示该协议的类型为TCP。建议还是使用第一种方式比较方便。
  Type(套接字类型)的值通常为SOCK_STREAM(流套接字)、SOCK_DGRAM(数据
  报套接字)、SOCK_RAW(原始套接字)等,不用说大家都知道,TCP用的是流套接
  字,UDP用的是数据报套接字,构造IP包用的是原始套接字。
  如果上面的参数Proto(协议类型)与Type(套接字类型)的值都不定义的话,
  IO::Socket::INET就会通过程序中上下‘文’部分猜估它们的值,猜估不到
  的话就会默认为'tcp'。
  参数Listen(监听队列的长度)的值是一个整形数。它代表能接受的连接主
  机数量。如果您要构造服务端的话,Listen这个步骤是必不可少的。
  调用Reuse(在绑定前设置SO_REUSEADDR)可以免去服务器在终止到重启之
  间的所停留的时间。
  Timeout(超时值)以秒计算,用于连接中的connect与accept这两个步骤,
  调用目的是为了在连接远程主机不可到达时限制连接的挂起时间。
  MultiHomed(用于连接多IP地址)的值是一个布尔值,当其值为真时,如果
  要连接的主机拥有多个IP地址,则本机的new方法调用gethostbyname()穷举其
  所有IP地址,直到能成功调用为止。
  从楼上的列表中可以看到IO::Socket与传统C库的Socket API接口在调用
  上有什么不同了:
  1)控制范围不同。C库提供的接口在生成SOCKET句柄时只能控制的只有域、套接
  字类型、协议这几个参数。而IO::Socket接口的创建语句(调用new方法)几乎
  能决定这个套接字的所有参数。
  2)调用所使用的‘协议’定义部分不同。IO::Socket接口调用new方法中的参数
  'Proto'的值可以直接定义为'tcp',这比传统C库的Socket定义更为简便。
  3)IO::Socket在定义时能直接定义本地主机地址、本地端口与远程主机地址、
  远程端口在一个Socket中,如果是这种情况的服务端就无需调用accept了,
  在I/O读写部分可以直接向这个Socket进行读写操作,而无需再定义远程客户
  端的Socket了。
  -----------------------------------------------------------------------------
  accept()方法:
  远程连接套接字对象变量=服务端套接字对象变量->accept();
  实例:
  $remote_sock=$sock->accept();
  讲解:
  此方法的调用环境与传统C中SOCKET库调用原理一样,用于服务端的等待监
  听过程。无参数,返回值为远程连接的套接字对象变量。调用此方法也是一个
  生成套接字的过程,只不过此套接字为远程连接的套接字而已,它以对象变量
  方式存在,据有与本地套接字变量相同的属性与方法。
  accept()方法在IO::Socket包里还提供另一种双返回值的调用方法:
  (远程连接套接字对象变量,远程主机压缩地址变量)=服务端对象变量->accept();
  实例:
  ($remote_sock,$remote_addr)=$sock->accept();
  讲解:
  与楼上一个返回值的调用方式基本相同,只是返回值中多了一个变量而已,
  返回值中多了个变量------远程主机压缩地址变量。
  -----------------------------------------------------------------------------
  bind()方法:
  返回值变量=服务端套接字对象变量->bind(本地端口号,本地主机网络地址);
  实例:
  $result=$sock->bind(80,'127.0.0.1');
  讲解:
  bind方法用于在服务器端绑定主机的地址与端口。它使用的两个参数都为
  未压缩值,第一个为端口,第二个为主机的网络适配器接口地址(可以使用默认
  的保留字INADDR_ANY,此保留字包括了主机的所有网络适配器接口地址,调用
  它时,它会以穷举的方法穷举所有的网络适配器接口地址,直到找到为止);返
  回值为布尔值,用于检测这次调用是否成功。
  -----------------------------------------------------------------------------
  connect()方法:
  返回值变量=套接字对象变量->connect(压缩地址变量);
  实例:
  $result=$sock->connect($pack_addr);
  讲解:
  常用于TCP连接(也可用于UDP,不过不常用),调用将向远程主机发送连接
  请求。参数‘压缩地址变量’为sockaddr_in形式值,返回值为布尔值。若调用
  此方法则建立IO::Socket::INET对象时不能赋予参数'PeerAddr'或'PeerHost'、
  'PeerPort',否则就会出现程序逻辑错误。
  connect()方法也有双参数调用方式,使用起来更简单:
  返回值变量=套接字对象变量->connect(远程端口号,远程主机地址);
  实例:
  $result=$sock->connect($remote_port,$remote_host);
  讲解:
  调用的目的与楼上单参数的调用方式相当。第一个参数为远程需要连接的
  主机的端口(等于new方法的参数'PeerPort'),第二个参数为需要连接的主机
  地址(等于new方法的参数'PeerAddr'或'PeerHost'),返回值为布尔值。
  -----------------------------------------------------------------------------
  listen()方法:
  返回值变量=套接字对象变量->listen(请求队列的最大长度值);
  实例:
  $result=$sock->listen(20);
  讲解:
  TCP服务端不可缺少的方法。单参数,参数为此服务端接受远端请求队列
  的最大长度值,返回值为布尔值。调用此方法等同于在建立IO::Socket::INET
  对象时定义参数'Listen'的值,所以若在new方法中定义了参数'Listen'再调
  用此方法的话就会出现‘程序定义冲突’这样的逻辑错误了。
  -----------------------------------------------------------------------------
  shutdown()方法:
  返回值变量=套接字对象变量->shutdown(控制参数);
  实例:
  $result=$sock->shutdown(2);
  讲解:
  此方法是除了close外的另一个关闭套接字对象的方法。单参数,参数值
  为外加参数定义,下为此方法的外加参数列表:
  ***********************************************************************
  参数值                       描述
  ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
  0                            关闭对象套接字的读操作
  1                            关闭对象套接字的写操作
  2                            关闭对象套接字的所有操作
  ***********************************************************************
  其返回值为布尔值。
  -----------------------------------------------------------------------------
  send()方法:
  成功发送的数据值变量=套接字对象变量->send(发送数据,标志值,目标地址值);
  实例:
  $succ_bytes=$sock->send('hihi\n',0,$pack_host);
  讲解:
  send方法是专门为SOCKET发送数据的特殊方法,调用格式与参数格式也基
  本与C库的SOCKET API中的send函数相同。第一个参数是需要发送的数据;第二
  参数是标志值,不添的话默认为0;第三个参数通常只用于UDP连接,是需要连
  接的sockaddr_in格式地址值(注意:当第三个参数有必要一定要写时,第二个参
  数也一定要加上);返回值为成功发送的数据值大小(以byte为单位)。
  -----------------------------------------------------------------------------
  recv()方法:
  压缩远程地址地址=套接字对象变量->recv(接收数据变量,接收数据值长度,标志值);
  实例:
  $remote_pack_address=$sock->recv($mem,100,0);
  讲解:
  recv方法是专门为SOCKET接收数据的特殊方法,调用格式与参数格式也与
  C库的SOCKET API基本一样。第一个参数是存放接收后的数据的变量值;第二个
  参数是接收的数据的长度值;第三个参数是标志值,默认为0就可以了(省略此
  值不填,系统默认也为0)。
  -----------------------------------------------------------------------------
  ===========================================================================================================
  IO::Socket接口的常用方法就介绍完了,不过还有一个问题是需要注意的:
  作为一个简单的客户端,它的步骤只需要先调用new方法,然后立刻就可以进行基本I/O操作(使用print与getline
  等基本I/O方法)了,最后只需调用close方法结束会话,那么整个SOCKET会话就算完成了。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-559111-1-1.html 上篇帖子: Perl中use函数 下篇帖子: perl_IO::Socket模块简单实例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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