套接字:使用'\ n'发送请求而没有'\ n'?

时间:2013-03-19 08:00:36

标签: perl sockets buffer

我正在使用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'发送。

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

1 个答案:

答案 0 :(得分:1)

我看到两个可能的原因。

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

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

  3. 这不是缓冲问题;自从1.18(1997年发布)以来,IO :: Socket :: INET一直禁止其句柄缓冲。