2013-03-19 43 views
0

我使用IO :: Socket :: INET作为客户端程序(TCP Socket)与 (Infosys)Server进行通信。套接字:用' n'发送请求并且没有' n'?

我的$袜子=新的IO ::插座:: INET(PeerAddr => 'xxx.xxx.xxx.xxx', PeerPort => '5000', 原=> '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'发送请求。

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

+0

你能告诉你发送消息的地方吗?另外,你的平台是什么? – perreal 2013-03-19 08:09:52

+0

$ 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;打印$ SOCK $ FinalMessage; – ungalnanban 2013-03-19 08:11:55

+0

我使用Perl,操作系统是Debian 6.0.6 – ungalnanban 2013-03-19 08:13:17

回答

1

我看到两个可能的原因。

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

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

这不是缓冲问题; IO :: Socket :: INET自从1.18(1997年发布)以来一直禁用缓冲区。

相关问题