【问题标题】:Socket programming with PHP使用 PHP 进行套接字编程
【发布时间】:2009-10-21 15:21:05
【问题描述】:

我正在通过套接字连接到远程网站。我期待来自远程站点的特定字符串“XXX”。收到字符串后,我想将 'ACK' 200 OK 响应发送回远程服务器。

这是我目前所拥有的(假设套接字成功打开); $fp 是指向套接字的资源(指针):

 while (!feof($fp)) {
   $data = fgets ($fp, 1024);
   if (strcmp("PASS",$data)==0) {
 // Send 200 OK 'ack' response to remote server
     $response = "HTTP/1.0 200 OK\r\n";
 fputs ($fp, $response);

     // Do additional processing here ...
   }
 }
 fclose($fp)

我不确定的是,在 (!feof()) 循环中使用 fput 是否“合法”。如果上面的代码有任何问题,如果有人能指出它,我将不胜感激(即如果它可以写得更好)。

【问题讨论】:

  • 这更短,(未经测试): if (strpos(file_get_contents('php://input'), 'PASS') !== false) { header("HTTP/1.0 200 OK\ r\n"); }
  • 只是出于好奇:为什么您的脚本(似乎是客户端)“发送 HTTP/1.0 200 OK\r\n”到似乎是 http 服务器的东西?

标签: php http-headers sockets


【解决方案1】:

这看起来不错,但是如果您要查找的只是一个字符串,您最好在找到它后立即跳出读取循环。

例如

while (!feof($fp)) {
   $data = fgets ($fp, 1024);
   if (strcmp("PASS",$data)==0) 
      break;
 }

$response = "HTTP/1.0 200 OK\r\n";
fputs ($fp, $response);

fclose($fp);

【讨论】:

    【解决方案2】:

    如果您在循环中的“额外处理”意味着您将从套接字句柄中读取更多内容,那么我会说您必须在发送回某些内容之前完成所有响应的读取。

    如何在该循环中设置一个状态以指示您在处理完服务器对您的响应后将返回 200。然后在你完成循环之后,fputs 回复。

    哦,前面的答案说的差不多,只是您可能不想因为找到“PASS”而中断循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      相关资源
      最近更新 更多