2013-10-10 29 views
1

使用的recv()如何接收關於服務器1,服務器數據,服務器3這是從PROXY1,Proxy2將分別發送,Proxy3將因爲它是不固定它可能會改變數據量?可變量接收在Perl

$proxy2=IO::Socket::INET->new(PeerPort=>'5431',Proto=>'UDP',PeerAddr=>'127.0.0.1'); 
$proxy3=IO::Socket::INET->new(PeerPort=>'5430',Proto=>'UDP',PeerAddr=>'127.0.0.1'); 
$proxy4=IO::Socket::INET->new(PeerPort=>'5429',Proto=>'UDP',PeerAddr=>'127.0.0.1'); 

$b=0; 
while($b<10){ 
    $ascii=ord($msg1[$b]); 

    if($ascii>48 && $ascii<59){ 
    print ("ASCII=".$ascii); 
    print ("It is an number.\n"); 
    $proxy2->send("$ascii"); 
    } 
    elsif($ascii>64 && $ascii<91 || $ascii>96 && $ascii<123){ 
    print ("ASCII=".$ascii); 
    print ("It is an alphabet.\n"); 
    $proxy3->send("$ascii"); 
    } 
    else{ 
    print ("ASCII=".$ascii); 
    print ("It is a character.\n"); 
    $proxy4->send("$ascii"); 
    } 
    $b++; 
} 
+0

您遇到了什麼問題? – fvrghl

+0

我得到的問題是,當我寫server1的使用的recv()命令收到來自Proxy2發出值的代碼,Server1的不知道有多少值從Proxy2將發送,因爲這是送可變的ASCII值可能因爲改變我正在接受投入。基本上我是新的perl編程..任何小幫助,將不勝感激 –

回答

1

問題,正如你所說的,接收套接字不知道要讀取多少數據。該解決方案是使用附加數據來告訴接收插座有多少數據讀取,有點像在HTTP消息的頭Content-length的公約。

您通常發送小分組(之間的值「0」和「255」?),所以你怎麼樣之前的每個消息與字節的報文的長度?

$proxyN->send(length($ascii) . "$ascii"); 

在接收端,你會做兩個recv調用。第一個單字節。第二個是第一個調用中指定的字節數。

$receiver->recv($count, 1); 
$receiver->recv($value, $count); 

該方案適用於長達9個字節的有效載荷。如果有效載荷可高達255個字節,則可以編碼長度爲8位整數(比如,使用chr(length($message)))在發送器和接收器上的它(例如,$len=ord($count))進行解碼。如果消息可能更長,您需要查看pack和相關函數,將較大的整數值編碼爲幾個字節的內存。

+0

非常感謝..它的工作 –