What is blocking fsockopen?

六眼飞鱼酱① 提交于 2019-12-01 01:44:03

问题


After struggling for half a day, I finally manage to get reCAPTCHA to work by converting this function:

function _recaptcha_http_post($host, $path, $data, $port = 80) {

 $req = _recaptcha_qsencode ($data);

 $http_request  = "POST $path HTTP/1.0\r\n";
 $http_request .= "Host: $host\r\n";
 $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
 $http_request .= "Content-Length: " . strlen($req) . "\r\n";
 $http_request .= "User-Agent: reCAPTCHA/PHP\r\n";
 $http_request .= "\r\n";
 $http_request .= $req;

 $response = "";
 if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
  die ("Could not open socket");
 }

 fwrite($fs, $http_request);

 while ( !feof($fs) )
  $response .= fgets($fs, 1160); // One TCP-IP packet
 fclose($fs);
 $response = explode("\r\n\r\n", $response, 2);
 return $response;
}

to:

function _recaptcha_http_post($host, $path, $data, $port = 80) {
 $req = _recaptcha_qsencode ($data);
 $request = curl_init("http://".$host.$path);

 curl_setopt($request, CURLOPT_USERAGENT, "reCAPTCHA/PHP");
 curl_setopt($request, CURLOPT_POST, true);
 curl_setopt($request, CURLOPT_POSTFIELDS, $req);
 curl_setopt($request, CURLOPT_RETURNTRANSFER, true);

 $response = curl_exec($request);
 return $response;
}

Basically, I am interested to find out why curl works while fsockopen fails with "Could not open socket". Thanks.

In addition: Sockets Support is enabled.


回答1:


I might be wrong, but you use $port = 80 in fsockopen() while in cURL case this variable is not used at all. I had same problem when tried to connect to SSL via port 80 instead of port 443; as far as I know, cURL checks SSL by default and connects accordingly.

Also, try running cURL with CURLOPT_VERBOSE to see what it does.




回答2:


What is in $errno and $errstr inside if(false === ...)? So, what does it output if you change to

 if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
  die ("Could not open socket, error: " . $errstr);
 }



回答3:


Googling for your error leads to wonder if your /etc/resolv.conf is readable by PHP. Do ls -lah /etc/resolv.conf in the bash to see if it is readable. You will get something like:

myserver:~ myname$ ls -lah /ets/resolv.conf
lrwxr-xr-x  1 root  wheel    20B 16 mrt  2011 /etc/resolv.conf
       ^ if there is an 'r' here it is readable. if you have '-' here, it is not.

If it is not readable, try doing in the bash: chmod 644 /etc/resolv.conf to make it readable.




回答4:


Woah,

  if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
  die ("Could not open socket");
 }

That doesn't make any sense surely. Try:

    $fs = fsockopen($host, $port, $errno, $errstr, 10); // @ ignores errors
 if(!$fs) die ("Could not open Socket");

Also Skype also blocks port 80 sometimes.



来源:https://stackoverflow.com/questions/10471942/what-is-blocking-fsockopen

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!