0

我正在使用 IO::Socket::INET 客户端程序(TCP Socket)与(Infosys)服务器进行通信。

我的 $SOCK = new IO::Socket::INET ( PeerAddr => 'xxx.xxx.xxx.xxx' , PeerPort => '5000', Proto => 'tcp', );

$Sent_Message = $MAIN::REQUEST_NO . $Bitmap .$main::Req_String ; 
$Total_Len = sprintf("%04d",length( $Sent_Message ) ) ; 

#my $FinalMessage = $Total_Len . $Sent_Message."\n" ; 
my $FinalMessage = $Total_Len . $Sent_Message ; 

print $SOCK $FinalMessage; 

我在行尾发送带有“\n”的请求。我没有收到回复。在服务器端,日志说响应已发送到客户端。

使用 wireshark 和 tcpdump 我正在检查数据包,我的系统没有收到任何数据包。

我发送了没有'\n'的请求,我收到了响应(立即)成功。

然后我又发送了 3 个请求,第一个带有 '\n' 第二个和第三个没有 '\n'。

所有 3 个请求都在等待服务器的响应。我已经杀死了进程 1 女巫发送带有“\n”的请求。之后,其他 2 个进程收到响应。

相同的客户端代码正在将请求发送到我的本地服务器,但没有“\n”。

服务器没有收到请求。(缓冲区未刷新)。

我的疑问是使用 '\n' 和没有 '\n' 发送请求有什么区别?

为什么其他 2 个进程没有立即收到响应。(发送的请求没有'\n')?

我发现问题是在行尾使用 '\n' 发送请求。

问题出在服务器端还是客户端?

4

1 回答 1

1

我看到两个可能的原因。

  1. 您应该发送一个 32 位整数作为长度,但您发送的是一个四位十进制字符串。

  2. 你有一个臭虫接收器,它会一直读取直到收到换行符。这在这里完全不合适,因为它可能会提前结束或等待太久(如果不是永远)。

这不是缓冲问题;IO::Socket::INET 自 1.18(1997 年发布)以来一直在其句柄上禁用缓冲。

于 2013-03-19T09:31:11.223 回答