2013-03-19 47 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年發佈)以來一直禁用緩衝區。

相關問題