2010-05-31 15 views
0

嘗試設置腳本以將命令發送到Win32系統上的遠程客戶端。下面是代碼:fwrite()不寫。我的代碼或遠程客戶端出錯?

$command = $_POST['command']; 
$host = $_POST['host']; 
$port = $_POST['port']; 
$fp = @fsockopen($host, $port, $e, $s, 15); 
if (!$fp) { 
    echo 'Error! Here\'s your problem: ' . $e . ': ' . $s; 
}else{ 
    $fw = fwrite($fp, $command); 
     if (!$fw){ 
      echo 'Failed sending command.'; 
      fclose($fp); 
     }else{ 
      fclose($fp); 
      echo 'Successfully sent: ' . $command; 
     } 
} 

我的哥們正在遠程客戶端上,他說,這個劇本正在發送''

然而,我的劇本是呼應Successfully sent: test

難道我做錯了什麼,還是在他的最後呢?

+1

我媽媽曾經告訴過我,你總是'fflush'非常重要。 http://php.net/manual/en/function.fflush.php – 2010-05-31 14:13:35

+0

'var_dump($ _ POST)'會有所幫助。另外,寫完後你是否試過從'$ fp'讀取? – jeroen 2010-05-31 14:41:09

+0

你可能想從'@fsockopen()'中刪除'@',以防萬一它抑制了一些有用的東西。 – dnagirl 2010-05-31 14:49:40

回答

2

(沒辦法了......還)
什麼

$command = $_POST['command']; 
$host = $_POST['host']; 
$port = $_POST['port']; 

$fp = @fsockopen($host, $port, $e, $s, 15); 
if (!$fp) { 
    echo 'Error! Here\'s your problem: ' . $e . ': ' . $s; 
} 
else{ 
    $fw = fwrite($fp, $command); 

    if (false===$fw) { 
    echo 'Failed sending command. '; 
    if (function_exists('error_get_last')) { 
     var_dump(error_get_last()); 
    } 
    } 
    else if (strlen($command)!==$fw) { 
    printf('only %d of strlen(%s)=%d bytes have been sent', $fw, $command, strlen($command)); 
    } 
    else{ 
    echo 'Successfully sent ', $fw, ' bytes. command=', $command; 
    } 
    fclose($fp); 
} 

打印?

更新:當您對這個虛擬服務器腳本(通過php-cli)測試它時它工作嗎?

$srv = socket_create_listen(8082); 

for($dbgCounter=0; $dbgCounter < 60; $dbgCounter++) { 
    echo '.'; 
    $read = array($srv); $write=array(); $ex=array(); 
    if (0 < socket_select($read, $write, $ex, 1)) { 
    echo "\n"; 
    $c = socket_accept($srv); 
    echo "socket accepted\n"; 
    while(0<socket_recv($c, $buffer, 1024, 0)) { 
     var_dump($buffer); 
    } 
    echo "socket_close\n"; 
    socket_close($c); 
    $dbgCounter = PHP_INT_MAX; 
    } 
} 
echo "done.\n"; 

首先嚐試在同一臺機器上($ _ POST [「主機」] ===「localhost」的),然後在遠程機器上(如果有這樣的事情)。

+0

已成功發送4個字節。 command = test – Rob 2010-05-31 15:01:09

+0

嗯,對不起,但是......我將如何執行第二個腳本? – Rob 2010-05-31 17:55:18

+0

從shell通過'php -f foosvr.php'(如果文件名是foosvr.php) – VolkerK 2010-05-31 20:36:43

-1

您是否使用UDP連接測試它?在使用UDP時(例如,由於防火牆規則或防病毒/惡意軟件軟件),打開套接字可能會失敗,您只會在嘗試向其寫入數據時注意到這一點(請參閱關於UDP的警告http://php.net/manual/en/function.fsockopen.php)。添加error_reporting(E_ALL);可能有助於查找實際原因。

+0

使用tcp,即使我使用udp,它在寫入時也不會給我一個錯誤。 – Rob 2010-05-31 14:21:54

+0

如果你使用的是tcp,並且你沒有收到任何錯誤消息,那麼它可能是他的一個問題,儘管你可能會嘗試在fclose之前添加fflush來確保(儘管在socket上調用fclose無論如何都應該執行刷新)。 – wimvds 2010-05-31 14:58:07