perl - IO::Socket 与 Socket 我都是 "use"吗?

标签 perl sockets tcp dns hostname

我正在为我的网络类(class)编写一个小程序,但遇到了一些困惑。

我目前的工作正常,但我发现我发现的 perl 网络示例之间存在一些不一致。

有的人导入了Socket模块,有的人导入了IO::Socket模块。更令人困惑的是,有些同时导入了 Socket 和 IO::Socket。

有道理吗?我以为 IO::Socket 会导入 Socket?

我问是因为我正在尝试使用函数“getaddrinfo()”,它一直对我大喊“未定义的子例程 &main::getaddrinfo 在 ./tcp_server.pl 第 13 行调用。”在 Socket perldoc 中。

我通过手动指定主机 IP 让它工作...但我希望它自动检索它正在运行的机器的主机 IP。有什么建议吗?

这是我的代码:

#!/usr/bin/perl

# Flushing to STDOUT after each write
$| = 1;

use warnings;
use strict;
use Socket;
use IO::Socket::INET;


# Server side information
# Works with IPv4 addresses on the same domain
my ($err, @res)  = getaddrinfo(`hostname`); #'128.101.38.191';
my $listen_port  = '7070';
my $protocal     = 'tcp';
my ($socket, $client_socket);
my ($client_address, $client_port);
# Data initializer
my $data = undef;


# Creating interface
$socket = IO::Socket::INET->new (
LocalHost   => shift @res,
LocalPort   => $listen_port,
Proto       => $protocal,
Listen      => 5,
Reuse       => 1,
) or die "Socket could not be created, failed with error: $!\n"; # Prints error code

print    "Socket created using host: @res \n";
print    "Waiting for client connection on port $listen_port\n";

while(1) {
    # Infinite loop to accept a new connection
    $client_socket = $socket->accept()
        or die "accept error code: $!\n";

# Retrieve client information
$client_address = $client_socket->peerhost();
$client_port    = $client_socket->peerport();

print "Client accepted: $client_address, $client_port\n";

# Write
$data = "Data from Server";
print $client_socket "$data\n";

# Read
$data = <$client_socket>;
print "Received from client: $data\n";

}
$socket->close();

最佳答案

只使用 IO::Socket 更容易:

use strict;
use warnings;
use IO::Socket::INET;
my $server = IO::Socket::INET->new(
    LocalPort => 7080,
    Listen => 10,
    Reuse => 1
) or die $!;
while (1) {
    my $client = $server->accept or next;
    print $client "foo\n";
}

如果你想使用 IPv6,只需将 IO::Socket::INET 替换为 IO::Socket::IP 或 IO::Socket::INET6。如果您稍后想在套接字上使用 SSL,请将其替换为 IO::Socket::SSL 并添加一些证书。这有点开销,但代码编写少了很多,也更容易理解。

关于perl - IO::Socket 与 Socket 我都是 "use"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22150346/

相关文章:

Python TCP 几个同时监听多个端口

Java TCP FIN 但没有流内 eof

perl - 我可以使用 <> 运算符跳过整个文件吗?

perl - 模棱两可的调用解析为 CORE::join(),限定为这样或使用 & at

python - 如何将数字更改为科学数字并获得最小值(科学数字格式)

mysql - 如何将来自三个 Perl 数组的数据插入到单个 MySQL 表中?

c++ - 使用 read() 时,TCP 流中包含哪些 header ?

c++ - 发送大数据时增强数据包之间丢失的asio tcp数据

java - Java服务器-TCP套接字在不关闭套接字连接的情况下检测EOF

postgresql - 在 OpenShift v3 上将 Postgresql 配置为服务