【发布时间】:2015-11-21 20:49:50
【问题描述】:
抱歉英语不好,这不是我的母语。
我是 perl 编程的新手,我现在面临一个乏味的问题好几个小时了。
我使用 IO::Socket::INET 编写了一个简单的客户端-服务器。它在 Windows 上可以完美运行,但在 Linux 上就坏了。
在 Linux 上,第一个 recv 获取服务器的通信,因此,第二个正在无休止地等待通信。
在 Windows 上运行命令“perl -version”会给我这个结果:
这是 perl 5, version 20, subversion 2 (v5.20.2) 为 MSWin32-x64-multi-t 线程(带有 1 个注册补丁,请参阅 perl -V for 更详细)
在 Linux 上:
这是 perl 5, version 20, subversion 2 (v5.20.2) 为 x86_64-linux-gnu-thread-multi(有 42 个注册补丁,见 perl -V 更多细节)
这是一个服务器的例子:
use IO::Socket;
my $socket= IO::Socket::INET->new( Proto => "tcp",
LocalPort => 2559,
Listen => SOMAXCONN,
Reuse => 1);
while(1)
{
print "Waiting for a client\n";
my $client = $socket->accept();
$client->send("Hello, please connect yourself");
$client->send("Username:");
$client->recv(my $username, 1024);
$client->send("Password:");
$client->recv(my $cipheredpassword, 1024);
$client->send("Thank you, Goodbye.");
$client->close();
print "Connection closed\n";
}
这是一个客户的例子:
use IO::Socket;
use Digest::MD5 qw(md5_hex);
my $username = "";
my $password = "";
my $server = IO::Socket::INET->new( Proto => "tcp",
PeerAddr => "localhost",
PeerPort => 2559);
# Pick up both $firstServerMessage and
# $serverAskUsernameMessage on Linux
$server->recv(my $firstServerMessage, 1024);
print "$firstServerMessage\n";
# Hangs on Linux
$server->recv(my $serverAskUsernameMessage, 1024);
while($username eq "")
{
print "$serverAskUsernameMessage\n";
chomp($username = <STDIN>);
}
$server->send($username);
$server->recv(my $serverAskPasswordMessage, 1024);
while($password eq "")
{
print "$serverAskPasswordMessage\n";
chomp($password = <STDIN>);
}
my $hashedPassword = md5_hex($password);
$server->send($hashedPassword);
$server->recv(my $lastServerMessage, 1024);
print $lastServerMessage;
我知道解决这个问题的简单方法是避免连续出现多个 ->recv,但我也很想知道为什么它不能在 Linux 上运行。
我尝试使用 ->flush 和 ->autoflush(1),但没有成功。
您的帮助和知识将不胜感激, 信用证
【问题讨论】:
-
你为什么不想只使用低级 Socket?当相同的代码在不同的操作系统上工作不同时,如果你有一堆额外的包装器,就更难理解为什么会这样。也许在这种情况下(在 linux 上)它会更高效,更容易进入低级