题如下:

请使用 socket 相关函数(非 curl )实现如下功 能:构造一个 post 请求,发送到指定 http server 的指定端口的指定请求路径(如 http://www.example.com:8080/test )。请求中包含以下变量:

用户名( username ):温柔一刀
密码( pwd ): &123=321&321=123&
个人简介( intro ): Hello world !

且该 http server 需要以下 cookie 来进行简 单的用户动作跟踪:

cur_query : you&me
last_tm : ... (上次请求的 unix 时间戳,定为当前请求时间前 10 分钟)
cur_tm : ... (当前请求的 unix 时间戳)

设置超时为 10 秒,发出请求后, 将 http server 的响应内容输出。

 

解析:

根据题我们所知:

1.要写一个基于 socket 的客户端
2.需要post数据 username,pwd,intro
3.需要cookie跟踪用户
4.请求服务器超时时间为10秒

思维:

socket 客户端我们使用 fsockopen ,post 和 cookie 数据我们使用 header 的方式,超时我们使用 stream_set_timeout。

 相关代码:

//这是我写的一段代码,这段代码估计对题的理解有错误
$url = 'http://127.0.0.1:80/test.php';
$query = 'username='.urlencode('温柔一刀').'&pwd='.urlencode('&123=321&321=123&').'&intro='.urlencode('Hello world!');
$urlInfo = parse_url($url);

$cur_query = urlencode("you&me");
$last_tm = time() - 10 * 60;
$cur_tm = time();

//链接
$fp = fsockopen($urlInfo['host'],$urlInfo['port'],$errno,$errstr);
if(!$fp) {
    exit(var_dump($errstr,$errno));
}
//设置post数据
$head = 'POST '.$urlInfo['path']." HTTP/1.0\r\n";
$head .= 'Host: '.$urlInfo['host']."\r\n";
$head .= 'Referer: http://'.$urlInfo['host'].$urlInfo['path']."\r\n";
$head .= "Content-type: application/x-www-form-urlencoded\r\n";
$head .= 'Content-Length: '.strlen(trim($query))."\r\n";
$head .= "Cookie:cur_query=$cur_query;last_tm=$last_tm;cur_tm=$cur_tm"."\r\n";
$head .= "\r\n";
$head .= trim($query);
//向服务器写入数据
$write = fputs($fp,$head);
//超时设置
stream_set_timeout($fp,10);
//读取服务器返回数据
$rs = fread($fp,4096);
//读取服务器的报头
$fpInfo = stream_get_meta_data($fp);
//是否超时
if($fpInfo['timed_out']) {
    var_dump('服务器链接超时!');
} else {
    var_dump($rs);
}
//关闭链接
fclose($fp);
//网上找的一段代码
if($fp = fsockopen('127.0.0.1','8080')) {
    //连接成功
    $request_data = "POST/2.php HTTP/1.1"."\r\n"; //请求行
    $request_data .= "Host:localhost"."\r\n"; //host头信息
    $request_data .= "User-Agent:Mozilla/5.0(compatible;MSIE 9.0;Windows NT 6.1;Trident/5.0)"."\r\n"; //host头信息

    $request_content = "username=".urlencode('温柔一刀')."&pwd=".urlencode('&123=321&321=123&')."&intro=".urlencode("Hello world!");

    $request_data .= "Content-Type:application/x-www-form-urlencoded"."\r\n";
    $request_data .= "Content-Length:".strlen($request_content)."\r\n";
    $cur_query = urlencode("you&me");

    $last_tm = time() - 10 * 60;
    $cur_tm = time();
    $request_data .= "Cookie:cur_query=$cur_query;last_tm=$last_tm;cur_tm=$cur_tm"."\r\n";
    $request_data .= "\r\n"; //请求头信息结束时的空行

    //请求主体数据部分
    $request_data .= $request_content;
    //利用建立好的通道,将数据发送过去
    fwrite($fp,$request_data); //写入数据(发送数据)

    //读取数据
    while(!feof($fp)) { //判断是否没有到文件末尾
        $resp_data = fgets($fp);
        echo $resp_data.'<br>';
    }
}