2

当谈到 Perl 中的套接字编程时,我想知道一件事。我正在尝试通过我的套接字发送两个变量。它有效,我可以发送两个,但我想一个接一个地接收它们。让我向您展示我的代码和我得到的输出:

服务器

my $var1 = 200;
chomp($var1);
$socket->send($var1);

my $var2 = 300;
chomp($var2);
$socket->send($var2);

客户

$socket->recv(my $var1, 4000);
chomp($var1);
$socket->recv(my $var2, 4000);
chomp($var2);

print "From server: My height is: $var1 cm, weight is: $var2 kg\n";

好吧,我的预期输出应该是:来自服务器:我的身高是:400 厘米,体重是:300 厘米。相反,我的输出如下所示:来自服务器:我的身高是:400300 厘米,体重是:

好吧,我不明白为什么我的代码是错误的。我不应该像这样一个接一个地接收数据吗?我最终将如何解决这个问题以正确接收数据?

4

1 回答 1

2

简短回答:使用数据报套接字或实现分隔不同消息的通信协议。

你问:

我不应该像这样一个接一个地接收数据吗?

您可以在UDP: 等数据报套接字 上轻松完成此操作IO::Socket::INET->new(Type => SOCK_DGRAM, ...)。写入器/读取器协议在那里传输和接收离散的数据包,发送/接收将做你想做的事。

另一方面,像 TCP 这样的流套接字具有连续的字节流模型。在这里,您需要某种记录分隔符或消息大小或类似的初始传输。我怀疑这是你正在使用的。

流套接字与普通文件不同,它们显示为“字节流”IO 句柄。如果一个文件包含字符串“300400”,没有任何换行符,那么该文件的读者怎么会知道这个字符串实际上是两条记录而不是一条(或六或五或不完整的记录等)?

于 2013-04-23T21:43:38.210 回答