【发布时间】:2011-06-28 13:44:11
【问题描述】:
是否可以在终端设备上创建一个开放端口的套接字连接。
如果连接断开打印一些东西?
我见过一些例子,但它们需要一个服务器类型的脚本和一个客户端,只是在寻找一个客户端。
谢谢
【问题讨论】:
-
例如,如果我说连接到端口 23,telnet 服务器会停止工作吗?我刚刚用端口 80 测试了这个东西,脚本在我杀死它后正在运行......
是否可以在终端设备上创建一个开放端口的套接字连接。
如果连接断开打印一些东西?
我见过一些例子,但它们需要一个服务器类型的脚本和一个客户端,只是在寻找一个客户端。
谢谢
【问题讨论】:
Perl 中内置了套接字。您只需要加载标准的Socket.pm 模块即可获得所需的常量。
perlipc 手册页会告诉您所有相关信息。然而,有许多更高级别的模块比内置模块更容易做到这一点。有些甚至是标准的。
这是一个 CLI 示例:
% perl -MIO::Socket::INET -E '$him = new IO::Socket::INET "localhost:daytime" // die; print while <$him>'
Tue Jun 28 08:17:13 2011
【讨论】:
0 是来自IO::Socket::INET->new 的有效返回吗?好像不会。
|| 就够了。
【讨论】:
这可能会满足您的需求:
use strict;
use warnings;
use constant
{ SOCKET_ERROR_MESSAGE => 'Some socket error message right here!'
, YOU_WANT_TO => 1
};
use IO::Select;
use IO::Socket::INET;
@ARGV = qw<server.domain.tld 8080> unless @ARGV;
sub handle_server_message {
...
}
my $sel
= IO::Select->new(
IO::Socket::INET->new(
PeerAddr => shift
, PeerPort => shift
));
# block until the server sends something that can be read.
while ( my ( $sock ) = $sel->can_read ) {
# you could just do this with $sock->eof...
if ( $sock->error and $sock->eof ) {
die MY_ERROR_MESSAGE if YOU_WANT_TO;
print MY_ERROR_MESSAGE;
}
else {
handle_server_message( $sock );
}
}
【讨论】: