Отправка данных с помощью fsockopen, данные не получены на принимающей стороне - PullRequest
0 голосов
/ 19 марта 2012

Я использую fsockopen для подключения и отправки данных в скрипт.Проблема в том, что на принимающей стороне не получено никаких данных, как вы можете видеть в моем выводе ниже, только пустой массив печатается.Я основал свое решение на ответе Тамлинса: PHP Post данных с помощью Fsockopen .Я попробовал его способ создания пост-параметров, без разницы в выводе.

Мой основной сценарий:

<?php
session_start();  

    $fp = fsockopen("192.168.1.107",    
          80,
          $errno, $errstr, 10);    

    $params = "smtp=posteddata\r\n";
    $params = urlencode($params);

    $auth = base64_encode("kaand:kaand123");

     if (!$fp) {
          return false;
      } else {
          error_log("4");
          $out = "POST /smic/testarea/fsockopen_print_post.php HTTP/1.1\r\n";      
          $out.= "Host: 192.168.1.107\r\n";      
          $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
          $out.= "Authorization: Basic ".$auth;
          $out.= 'Content-Length: '.strlen($params).'\r\n';
          $out.= "Connection: Close\r\n\r\n";
          $out .= $params;

          fwrite($fp, $out);
          fflush($fp);

          header('Content-type: text/plain');
          while (!feof($fp)) {
                echo fgets($fp, 1024);
            }

          fclose($fp);
      }        
?>

fsockopen_print_post.php:

<?php
session_start();

print_r($_POST);

$raw_data = $GLOBALS['HTTP_RAW_POST_DATA'];  
parse_str( $raw_data, $_POST );
print_r($_POST);
?>

Вывод:

HTTP/1.1 200 OK
Date: Mon, 19 Mar 2012 09:21:06 GMT
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.3.10
Set-Cookie: PHPSESSID=i4lcj5mn1ablqgekb1g24ckbg5; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 20
Connection: close
Content-Type: text/html; charset=UTF-8

Array
(
)
Array
(
)

В чем проблема и как ее исправить?

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

В вашем коде есть опечатка:

$out.= 'Content-Length: '.strlen($params).'\r\n';
$out.= "Connection: Close\r\n\r\n";

Должно быть:

$out .= "Content-Length: ".strlen($params)."\r\n";
$out .= "Connection: close\r\n\r\n";

Посмотрите, как вы использовали одинарные кавычки вокруг \r\n?Это означает буквально отправлять '\r\n', а не интерпретировать их как Windows crlf.Двойные кавычки исправляют это.

0 голосов
/ 19 марта 2012

Эта строка

 $out.= "Authorization: Basic ".$auth;

должна была быть

 $out.= "Authorization: Basic ".$auth."\r\n";

Было что-то еще, что я не определил, но этот код работает (возможно, просто некоторое смешивание переменных, когдатестирование вокруг):

<?php
$fp = fsockopen('192.168.1.107', 80);
$vars = array(
'hello' => 'world'
);
$content = http_build_query($vars);
$auth = base64_encode("kaand:kaand123");
$out = "POST /smic/testarea/fsockopen_print_post.php HTTP/1.1\r\n";      
$out .= "Host: 192.168.1.107\r\n";      
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Authorization: Basic ".$auth."\r\n";
$out .= "Content-Length: ".strlen($content)."\r\n";
$out .= "Connection: close\r\n\r\n";
$out .= $content;

fwrite($fp,$out);

header("Content-type: text/plain");
while (!feof($fp)) {
echo fgets($fp, 1024);
}
fclose($fp);    
?>
...