gpt4 book ai didi

Perl 客户端 socket->recv() Vs <> 当服务器套接字调用多次发送时

转载 作者:行者123 更新时间:2023-12-01 12:47:37 25 4
gpt4 key购买 nike

我有一个 perl 服务器端套接字,它在客户端套接字上调用 send() 一个接一个地返回字段。

如果代码如下所示,我在客户端读取所有字段没有问题:

while ($response = <$sock>) {
print "$response";
last if $response eq "END_OF_REQUEST";
}

但是如果客户端代码像下面这样,它就会进入一个循环并且无法工作:

while(1) {      
$sock->recv($response, 1);
print "$response\n";
last if $response eq "END_OF_REQUEST" ;
}

我同意我可以合并所有字段并在服务器端仅调用一次发送。但我很想知道第二种方法有什么问题。在第二种方法中更改 recv 的 LENGTH arg 是否有效?

在没有适当的套接字理论知识的情况下,我开始直接动手操作。感谢您的耐心等待。

最佳答案

recv() 的长度参数是您要接收的消息的最大 长度,recv() 永远不会写入超过那么多的字符进入缓冲区。 (消息的其余部分会发生什么取决于套接字的类型;对于流式套接字,它将可用于下一个 recv() 调用,而对于数据报套接字,它会被简单地丢弃。)

因此,您的$sock->recv($response, 1); 最多只会将一个字符写入$response。显然,单字符的字符串永远不会等于 "END_OF_REQUEST"

简单的解决方案是将足够大的最大长度传递给 recv(),这样您的消息就不会被截断。


这是一个简单的演示:

use strict;
use warnings;
use IO::Socket;

my ($rd, $wr) = IO::Socket->socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC)
or die "socketpair: $!";
defined $wr->send("Hello, world!") or die "send: $!";
my $buf;
do {
defined $rd->recv($buf, 9) or die "recv: $!";
print qq(received: "$buf"\n);
} while ($buf !~ /!/);

这将输出:

received: "Hello, wo"
received: "rld!"

关于Perl 客户端 socket->recv() Vs <> 当服务器套接字调用多次发送时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14444539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com