最近喜欢上了sockt,刚才用sockt模拟了一下post,但始终不成功,明明页面存在,返回值却说找不到,因为没经验,请各位师哥师姐指教。
function postToHost($url,$data)
{
$url = parse_url($url);
if(!$url) return "解析url错误!";
if(!isset($url["port"])) $url["port"] = "";
if(!isset($url["query"])) $url["query"] = "";
if(!isset($url["path"])) $url["path"] = "";
$encoded = "";
while(list($k,$v) = each($data))
{
$encoded .= $encoded ? "&" : "";
$encoded .= rawurlencode($k) . "=" . rawurlencode($v);
}
$port = $url["port"] ? $url["port"] : 80;
$fp = fsockopen($url["host"],$port,$errno,$errstr);
if (!$fp) return "sockt错误: {$errno} - {$errstr}";
fputs($fp, sprintf("POST %s%s%s HTTP/1.0\\n", $url["path"], $url["query"] ? "?" : "", $url["query"]));
fputs($fp, "Host: {$url['host']}\\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\\n");
fputs($fp, "Content-length: " . strlen($encoded) . "\n");
fputs($fp, "Connection: close\\n\\n");
fputs($fp, "$encoded\\n");
$line = fgets($fp,1024);
echo $line;//返回:HTTP/1.1 400 Bad Request 
}
echo postToHost("http://www.duwenzhang.com/index.html",array("name"=>"zhangShan"));

解决方案 »

  1.   

    你返回的错误400表示服务器不接受提交过去的数据,应该是你提交的数据包有错误,我下面这段代码可用。
    $fp = fsockopen("www.duwenzhang.com", 80, $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        $out = "GET / HTTP/1.1\r\n";
        $out .= "Host: www.duwenzhang.com\r\n";
        $out .= "Connection: Close\r\n\r\n";    fwrite($fp, $out);
        while (!feof($fp)) {
            echo fgets($fp, 128 ) ;
        }
        fclose($fp);
    }