免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 10198 | 回复: 40
打印 上一主题 下一主题

use Socket;如何控制连接超时?在windows下 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-29 07:04 |只看该作者 |倒序浏览
如题~我见有人提过,但都没有答案~

论坛徽章:
0
2 [报告]
发表于 2004-12-29 09:07 |只看该作者

use Socket;如何控制连接超时?在windows下

不用Socket,如下代码:


  1. use strict;
  2. use IO::Socket;

  3. my $socket = IO::Socket::INET->;new(
  4. Timeout =>; "10",
  5. ....
  6. )
复制代码

论坛徽章:
0
3 [报告]
发表于 2004-12-29 22:59 |只看该作者

use Socket;如何控制连接超时?在windows下


  1. connect (S, pack('S n C4 x8', 2, 37, unpack ('C4', ((gethostbyname ('bbs.chinaunix.net'))[4])[0])));
复制代码


这句是use Socket;句子,如果改为use IO::Socket;并加上Timeout?

论坛徽章:
0
4 [报告]
发表于 2004-12-30 08:57 |只看该作者

use Socket;如何控制连接超时?在windows下

perldoc

论坛徽章:
0
5 [报告]
发表于 2004-12-30 15:47 |只看该作者

use Socket;如何控制连接超时?在windows下

我就差这个了,帮帮忙啊~如何改为use IO::Socket;并加上Timeout?

论坛徽章:
0
6 [报告]
发表于 2004-12-30 16:14 |只看该作者

use Socket;如何控制连接超时?在windows下

[quote]原帖由 "freeand"]我就差这个了,帮帮忙啊~如何改为use IO::Socket;并加上Timeout?[/quote 发表:


现在你的程序看,你的程序后面会有很多地方用到IO::Socket库里面的对象,所以不能简单的改成SOCKET,你最好把程序贴全,看看有没有办法

用Socket new 出来的SOCKET HANDLER不一定支持你在IO::Socket里面的对象了

论坛徽章:
0
7 [报告]
发表于 2004-12-30 17:06 |只看该作者

use Socket;如何控制连接超时?在windows下



  1. #!/usr/bin/perl
  2. use Socket;
  3. socket (S, 2, 1, 0);
  4. select (S);
  5. $| = 1;
  6. select (STDOUT);
  7. connect (S, pack('S n C4 x8', 2, 37, unpack ('C4', ((gethostbyname ('bbs.chinaunix.net'))[4])[0])));
  8. $aa = (hex (unpack ('H*', <S>;)) - 2208988800);
  9. close(S);
  10. undef $|;
  11. print $aa . $/;
  12. exit;

复制代码


就这样了~

论坛徽章:
0
8 [报告]
发表于 2004-12-30 17:25 |只看该作者

use Socket;如何控制连接超时?在windows下

应该是可以改的,37 port的服务是什么啊?是你们自己定义的一个daemon么?

你select (STDOUT)了所以可以不用管'S n C4 x8'这个,我不知道IO::Socket的是不是这个值,没准也差不多


  1. $socket = IO::Socket::INET->;new(
  2. Proto =>; "tcp",
  3. Timeout =>; "10",
  4. PeerAddr =>; "bbs.chinaunix.net",
  5. PeerPort =>; "your_service_name(37)",
  6. )
复制代码

论坛徽章:
0
9 [报告]
发表于 2004-12-30 17:37 |只看该作者

use Socket;如何控制连接超时?在windows下

能将程序写完整吗?谢谢,我不知如何整合成功啊。。。

论坛徽章:
0
10 [报告]
发表于 2004-12-30 18:01 |只看该作者

use Socket;如何控制连接超时?在windows下

[Perl文]IO::Socket简介

writer:demonalex
email:demonalex_at_hackermail.com


另一个构造socket库,使用对象构造模式。如果您看过wawa老大的动网EXPLOIT与isno大哥的WEBDAVX,您就
会发现这些EXPLOITS都是使用这个库做的,所以如果您想写EXPLOITS的话,不妨看看此文。

以前我写的是传统的C语言‘遗留’下了的SOCKET库,它使用了部分C库的二进制格式,导致PERL无法完全使
用它。而这篇文所介绍的IO::Socket库是IO::Handle的子类,完全对象编程,一切就会‘自由’很多了......

使用格式与常用方法(父类IO::Handle与IO::File的通用方法就不在下文中说明了):
-----------------------------------------------------------------------------
导入IO::Socket包:
use IO::Socket;
讲解:
IO::Socket下又有两个子类IO::Socket::INET与IO::Socket::UNIX,我们
现在用的当然是IO::Socket::INET了。
-----------------------------------------------------------------------------
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会话就算完成了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP