【问题标题】:Perl - Sending multiple data through socketsPerl - 通过套接字发送多个数据
【发布时间】:2013-04-23 21:10:31
【问题描述】:

当谈到 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 厘米,体重是:

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

【问题讨论】:

  • 在变量之间插入一些分隔符,并在接收方对其进行拆分

标签: perl sockets


【解决方案1】:

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

你问:

这样我是不是应该可以一一接收数据?

您可以在 datagram 套接字(如 UDP:IO::Socket::INET->new(Type => SOCK_DGRAM, ...))上轻松做到这一点。写入器/读取器协议在那里传输和接收离散的数据包,而发送/接收将执行您想要的操作。

另一方面,

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    相关资源
    最近更新 更多