【问题标题】:Posting data with fsockopen, no data received on receiving side使用 fsockopen 发布数据,接收端没有收到数据
【发布时间】:2012-04-03 19:03:36
【问题描述】:

我正在使用 fsockopen 连接并将数据发送到脚本。问题是接收端没有收到任何数据,正如您在下面的输出中看到的那样,只打印了空数组。我的解决方案基于 Tamlyns 的答案:PHP Post data with 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
(
)

有什么问题,我该如何解决?

【问题讨论】:

    标签: php post fsockopen


    【解决方案1】:

    您的代码中有错字:

    $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。双引号更正了这一点。

    【讨论】:

    • 感谢您的回答。这真的有必要吗?检查 fsockopen 的示例,他们不会做这样的事情(php.net),对于我发现的所有其他示例,这在任何地方都没有使用。我只想发布数据然后断开连接(应该是异步方式)。
    • 如果您希望能够无阻塞地处理多个客户端,这是必要的。如果您“知道”您只需要一个,这通常意味着您现在需要但将来需要更多,那么有一种更简单的方法。但我建议您以这种方式实施解决方案,以免将来让自己头疼。此外,当你弄清楚它是如何工作的时,你不会失去任何东西,但会获得更好的知识。 ;)
    • 现在学习曲线非常陡峭;)也许这有助于处理多个客户,但这是否有助于我在接收端获得我要求的发布数据?
    • 哦,抱歉,今天早上过得很慢(这里是星期一早些时候)。这可能是因为你的错别字。查看我的答案编辑!
    • 谢谢,实际上,我已经更新了它,但没有帮助。根据我自己的回答解决后,也许它也会成为问题......
    【解决方案2】:

    这一行

     $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);    
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      相关资源
      最近更新 更多