gpt4 book ai didi

c# - C#/Perl 连接中的套接字缓冲区溢出

转载 作者:行者123 更新时间:2023-11-30 15:40:34 24 4
gpt4 key购买 nike

我在两个程序之间有一个 TCP 套接字,一个 C# 服务器和一个 Perl 客户端。客户端应该从服务器接收 XML 流。 XML 文件(由 C# 程序生成)大约为 437KB,但无论缓冲区有多大,客户端只会收到 408KB。在客户端,我使用 IO::Socket::INET,而服务器端使用 TcpListenerTcpClient 的组合。如何在客户端正确定义缓冲区?现在我正在使用该代码:

# PERL CLIENT
my $socket = new IO::Socket::INET (
PeerHost => '192.168.*.*',
PeerPort => '*****',
Proto => 'tcp'
) or die "Error while creating Socket";
#
# OTHER STUFFS...
#
my $buffer = 500000000; # IT DOESNT SEEM TO USE THAT VALUE AT ALL
$socket->recv($xmlbody, $buffer);


// C# SERVER
// OTHER STUFFS...
byte[] result = encoding.GetBytes(xml);
clientStream.Write(result, 0, result.Length);
clientStream.Flush();
clientStream.Close();
tcpClient.Close();

最佳答案

我从不使用recv,所以我不知道它的怪癖。我使用 sysread

sub read_until_eof {
my ($fh) = @_;
my $buf = '';
for (;;) {
my $rv = sysread($fh, $buf, 64*1024, length($buf))
die $! if !defined($rv);
return $buf if !$rv;
}
}

如果这不起作用,我建议您使用 tcpdump 来确定问题是出在发送方、接收方还是两者之间。


sysreadread 的“怪癖”:

sysread 总是在 bytes 字节可用时立即返回,无论请求了多少字节。这意味着如果在调用时字节已经可用,它会立即返回。否则它将阻塞直到数据包进来。这意味着如果需要特定数量的字符,就需要循环。

相比之下,read 等待直到请求的字节数可用。它只会在 EOF 或错误时返回。

readsysread 实际上在字符级别工作,这意味着您实际上指定了所需的字符数,而不是字节数。这些字符可以是字节、Unicode 代码点或其他任何内容,具体取决于您添加到句柄的 IO 层。

关于c# - C#/Perl 连接中的套接字缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9078039/

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