2011-11-21 85 views
1

我在發送和PHP和Perl插座之間接收數據的問題:在php和perl之間發送和接收數據的問題?

- 問題:

  • PHP不能發送的所有字節數據到perl插座
  • Perl的插座不能接收的所有數據從PHP。

下面的代碼PHP:

function save(){ 
    unset($_SESSION['info']); 
    unset($_SESSION['data']); 
    global $config,$ip; 
    $start=$_POST['config']; 
    $fp = fsockopen($_SESSION['ip'], $config['port'], $errno, $errstr, 30); 
    if(!$fp) { 
     $_SESSION['info']="Not connect "; 
     transfer("Not connect".$ip, "index.php?com=server&act=info"); 
    } else { 
     $_SESSION['info']="Save config - ".$ip; 
     fwrite($fp,$start); 
     transfer("Sending data to ".$ip, "index.php?com=server&act=info");  
    } 
} 

下面的代碼perl的插口:

#!/usr/bin/perl 
use strict; 
use warnings; 
use Carp; 
use POSIX qw(setsid); 

use IO::Socket; 

$| = 1; 

my $socket = new IO::Socket::INET ( 
           LocalHost => '192.168.150.3', 
           LocalPort => '5000', 
           Proto => 'tcp', 
           Listen => 5, 
           Reuse => 1 
          ); 
die "Coudn't open socket" unless $socket; 
print "\nTCPServer Waiting for client on port 5000"; 
my $client_socket = ""; 
while ($client_socket = $socket->accept()) { 
    my $recieved_data =" "; 
    my $send_data=" "; 
    my $peer_address = $client_socket->peerhost(); 
    my $peer_port = $client_socket->peerport(); 
    print "\n I got a connection from ($peer_address , $peer_port) "; 
    print "\n SEND(TYPE q or Q to Quit):"; 
    $client_socket->recv($recieved_data,20000); 
    #while (defined($recieved_data = <$client_socket>)) { 
     if ($recieved_data eq 'q' or $recieved_data eq 'Q') { 
      close $client_socket; 
      last; 
     } 
     elsif ($recieved_data eq 'start' or $recieved_data eq 'START') { 
      $send_data = `/etc/init.d/squid start`; 
     } 
     elsif ($recieved_data eq 'restart' or $recieved_data eq 'RESTART') { 
      $send_data = `/etc/init.d/squid restart`; 
     } 
     elsif ($recieved_data eq 'stop' or $recieved_data eq 'STOP') { 
      $send_data = `/etc/init.d/squid stop`; 
     } 
     elsif ($recieved_data eq 'hostname' or $recieved_data eq 'HOSTNAME') { 
      $send_data= `hostname`; 
     } 
     elsif ($recieved_data eq 'view-config' or $recieved_data eq 'VIEW-CONFIG') { 
      $send_data = `cat /etc/squid/squid.conf` ; 
     } 
     else { 
      #print $recieved_data; 
      open OUTPUT_FILE, '> /root/data' or die("can not open file"); 
      print OUTPUT_FILE $recieved_data; 
      close OUTPUT_FILE 
     } 
    #} 
    if ($send_data eq 'q' or $send_data eq 'Q') { 
     $client_socket->send ($send_data); 
     close $client_socket; 
     last; 
    } 
    else { 
     $client_socket->send($send_data); 
    } 
} 
+0

你能解釋一下你是如何知道它不工作的?你看到它做什麼呢?到目前爲止,你已經做了什麼來追查這個問題? – Patrick

回答

1

你忘了其實寫解析接收數據的代碼。 TCP是一種不保存應用程序消息邊界的字節流協議。除非這恰好是您需要的(而且顯然不在此處),否則您需要在TCP之上開發和實施協議,以提供應用程序所需的功能。首先,您需要一些方法來查找命令的結尾。你的代碼絕對沒有辦法讓接收器做到這一點。

無論協議多麼簡單,您真的應該投入時間編寫協議規範。協議規範應明確指定字節級別的消息格式。協議規範應明確規定客戶端在完整消息時如何識別。

然後你實際上必須編寫代碼來實現該協議。

在這種情況下,您可以簡單地寫一個零字節來標記消息的結尾。然後編碼接收器繼續接收數據,直到接收到一個零字節。然後它知道一切,然後纔是信息。