我正在使用IO :: Socket :: INET与客户端程序(TCP Socket)进行通信 (Infosys)服务器。
my $ 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个请求都在等待服务器的响应。我杀死了巫女的过程 用'\ n'发送请求。之后,收到其他2个进程的响应。
相同的客户端代码将请求发送到我的本地服务器而没有'\ n'。
服务器未收到请求。 (缓冲区未刷新)。
我怀疑发送请求与'\ n'和out之间的区别是什么 '\ n'?
为什么其他2个进程没有立即收到响应。 (发送请求 没有'\ n')?
我发现问题是请求在行尾用'\ n'发送。
问题出在服务器端还是客户端?
答案 0 :(得分:1)
我看到两个可能的原因。
您应该为该长度发送一个32位整数,但是您要发送一个四位十进制字符串。
你有一个bugger 接收器,一个读取直到收到换行符。这在这里是完全不合适的,因为它可能会提前结束或等待太久(如果不是永远)。
这不是缓冲问题;自从1.18(1997年发布)以来,IO :: Socket :: INET一直禁止其句柄缓冲。