Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl-通过套接字发送多个数据_Perl_Sockets - Fatal编程技术网

Perl-通过套接字发送多个数据

Perl-通过套接字发送多个数据,perl,sockets,Perl,Sockets,当涉及到Perl中的套接字编程时,有一件事我很好奇。我正试图通过我的插座发送两个变量。它的工作,我可以发送这两个,但我想收到他们一个接一个。让我向您展示我的代码和我得到的输出: 服务器 my $var1 = 200; chomp($var1); $socket->send($var1); my $var2 = 300; chomp($var2); $socket->send($var2); 客户 $socket->recv(my $var1, 4000); chomp($v

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


我不明白为什么我的代码错了。难道我不能像这样一个接一个地接收数据吗?我最终将如何解决此问题以正确接收数据

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

你问:

难道我不能像这样一个接一个地接收数据吗

您可以在UDP:
IO::Socket::INET->new(Type=>SOCK_DGRAM,…)
等数据报套接字上轻松做到这一点。在那里,writer/reader协议正在发送和接收离散的数据包,send/recv将执行您想要的操作

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


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

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