我正在为我的网络类(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/