fwrite () не пишет. Ошибка с моим кодом или удаленный клиент? - PullRequest
0 голосов
/ 31 мая 2010

Попытка настроить скрипт для отправки команд удаленному клиенту в системе Win32. Вот код:

$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

Я что-то не так делаю или это проблема с его стороны?

Ответы [ 2 ]

2 голосов
/ 31 мая 2010

(не решение ... пока)
Что значит

$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 ['host'] === 'localhost'), а затем на удаленном компьютере (если есть).

0 голосов
/ 31 мая 2010

Тестируете ли вы его с UDP-соединениями? Возможно, что открытие сокета происходит молча при использовании UDP (т. Е. Из-за правил межсетевого экрана или антивирусного / вредоносного программного обеспечения), и вы заметите это только при попытке записать в него данные (см. Предупреждение о UDP http://php.net/manual/en/function.fsockopen.php). Добавление error_reporting(E_ALL); может помочь найти истинную причину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...