函数说明:fsockopen — 打开一个网络连接或者一个Unix套接字连接

语法:

resource fsockopen  ( string $hostname  [, int $port  = -1  [, int &$errno  [, string &$errstr  [, float $timeout  = ini_get("default_socket_timeout")  ]]]] )

参数:

  1. hostname 如果安装了OpenSSL,那么你也许应该在你的主机名地址前面添加访问协议ssl://或者是tls://,从而可以使用基于TCP/IP协议的SSL或者TLS的客户端连接到远程主机。
  2. port 端口号。如果对该参数传一个-1,则表示不使用端口,例如unix://。
  3. errno 如果errno的返回值为0,而且这个函数的返回值为 FALSE ,那么这表明该错误发生在套接字连接(connect())调用之前,导致连接失败的原因最大的可能是初始化套接字的时候发生了错误。
  4. errstr 错误信息将以字符串的信息返回。
  5. timeout 设置连接的时限,单位为秒。

返回值:

  fsockopen() 将返回一个文件句柄,之后可以被其他文件类函数调用(例如: fgets() , fgetss() , fwrite() , fclose() 还有 feof() )。如果调用失败,将返回 FALSE 。

1、简单连接一个http请求

<?php
$fp = fsockopen("www.baidu.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>

2、fsockopen 来模拟生成 HTTP 连接

<?php
    $url="http://www.manongjc.com";
    $port=80;
    $t=30;
    $info=parse_url($url);
    $fp = fsockopen($info['host'],$port,$errno,$errstr,$t);
    if (!$fp)
    {
    echo "$errstr ($errno)<br />\n";
    }
    else
    {
    $out = "GET ".$info['path']." HTTP/1.1".PHP_EOL;
    $out .= "Host: ".$info['host'].PHP_EOL;
    $out .= "Connection: Close".PHP_EOL.PHP_EOL;
    fwrite($fp, $out);
    $content = '';
    while (!feof($fp))
    {
        $content .= fgets($fp);
    }
    echo $content;
    fclose($fp);
    }

3、PHP fsockopen模拟POST/GET方法

fsockopen除了像上面实例模拟生成 HTTP 连接之外,还能实现很多功能,比如模拟post 和 get 传送数据的方法。 

<?php
$url = "http://localhost/ctf.php"; #url 地址必须 http://xxxxx
$port=80;
$t=30;
$data = array(
    'foo'=>'bar',
    'baz'=>'boom',
    'site'=>'www.manongjc.com',
    'name'=>'nowa magic');
function sock_data($url,$port=80,$t=30,$method='get',$data=null)
{
    $info=parse_url($url);
    $fp = fsockopen($info["host"],$port, $errno, $errstr,$t);

    // 判断是否有数据
    if(isset($data) && !empty($data))
    {
        $query = http_build_query($data); // 数组转url 字符串形式
    }else
    {
        $query=null;
    }
    // 如果用户的$url "http://www.manongjc.com/";  缺少 最后的反斜杠
    if(!isset($info['path']) || empty($info['path']))
    {
        $info['path']="/index.html";
    }
    // 判断 请求方式
    if($method=='post')
    {
        $head = "POST ".$info['path']." HTTP/1.0".PHP_EOL;
    }else
    {
        $head = "GET ".$info['path']."?".$query." HTTP/1.0".PHP_EOL;
    }

    $head .= "Host: ".$info['host'].PHP_EOL; // 请求主机地址
    $head .= "Referer: http://".$info['host'].$info['path'].PHP_EOL;
    if(isset($data) && !empty($data) && ($method=='post'))
    {
        $head .= "Content-type: application/x-www-form-urlencoded".PHP_EOL;
        $head .= "Content-Length: ".strlen(trim($query)).PHP_EOL;
        $head .= PHP_EOL;
        $head .= trim($query);
    }else
    {
        $head .= PHP_EOL;
    }
    $write = fputs($fp, $head); //写入文件(可安全用于二进制文件)。 fputs() 函数是 fwrite() 函数的别名
    while (!feof($fp))
    {
        $line = fread($fp,4096);
        echo $line;
    }
}
// 函数调用
sock_data($url,$port,$t,'post',$data);

4、fsockopen以Socket方式模拟HTTP下载文件/

<?php
set_time_limit(0);

$url = 'http://phpapi.info/404.gif';
$port = '80';

$t=30;
function sock_down($url,$port=80,$down_name=null) { $info=parse_url($url); # 建立连接 $fp = fsockopen($info["host"],$port,$errno,$errstr,$t); stream_set_blocking($fp, 1); if(!$fp) { echo "$errno : $errstr<br/>"; } else { # 发送一个HTTP请求信息头 $request_header="GET ".$info['path']." HTTP/1.1".PHP_EOL; # 起始行 # 头域 $request_header.="Host: ".$info["host"].PHP_EOL; # 再一个回车换行表示头信息结束 $request_header.=PHP_EOL; # 发送请求到服务器 fputs($fp,$request_header); if(!isset($down_name) || empty($down_name)) { $down_name=basename($url); //默认当前文件同目录 } # 接受响应 $fp2=fopen($down_name,'w'); // 要下载的文件名 下载到指定目录 $line=''; while (!feof($fp)) { $line.= fputs($fp2,fgets($fp)); } if(feof($fp)) { echo "<script>alert('已下载到当前目录')</script>"; } # 关闭 fclose($fp2); fclose($fp); } } //函数调用 sock_down($url,$port);

php函数fsockopen的使用的更多相关文章

  1. php连接ftp的研究,自带ftp函数 | fsockopen | curl实现ftp的连接

    持续更新中..............

  2. 云虚拟主机开源 DedeCMS 安装指南

    1. 获取主机 FTP 和 数据库 信息 1.1 FTP 信息 登录主机管理后台,在 站点信息 中获取到 FTP 和 数据库 的账号密码,连接地址. 如下图所示: 如果忘记密码,可以在这里进行 重置密 ...

  3. 【PHPsocket编程专题(实战篇③)】构建基于socket的HTTP请求类

    该代码是两年前写的,现在看起来有点渣了,仅仅是提供一个思路,现在做一些Api开发的时候官方会有一些SDK,这些SDK其实原理都是通过socket来通讯的,其实我个人主张用curl更方便,当然前提是你的 ...

  4. PHP笔试题汇总

    1.抓取远程图片到本地,你会用什么函数? fsockopen, A 2.用最少的代码写一个求3值最大值的函数. function($a,$b,$c){* W0 z* u6 k+ e. L  a: }5 ...

  5. PHP面试题二

    1.抓取远程图片到本地,你会用什么函数? fsockopen, A 2.用最少的代码写一个求3值最大值的函数. function($a,$b,$c){ * W0 z* u6 k+ e. L  a: } ...

  6. [附录]Discuz X2.5程序模块source功能处理目录注释

    /source/admincp后台管理 /source/admincp/cloud云平台项目 /source/admincp/menu后台扩展菜单目录 /source/admincp/moderate ...

  7. Discuz目录结构

    /source/class/task站点任务内置包 task_avatar.php头像类任务 task_blog.php发表日志任务 task_connect_bind.phpQQ 帐号绑定任务 ta ...

  8. 【技巧总结】Penetration Test Engineer[4]-Web-Security(文件处理、会话管理、访问控制、SSRF、反序列化漏洞)

    Web安全基础2 3.8.文件处理 1)文件上传 一个正常的业务需求,问题在于控制上传合法文件. 防御文件上传 客户端javascript校验(通常校验扩展名) 检查MIME类型 检查内容是否合法 随 ...

  9. php异步学习(1)

    1.为啥PHP需要异步操作? 一般来说PHP适用的场合是web页面展示等耗时比较短的任务,如果对于比较花时间的操作如resize图片.大数据导入.批量发送EDM.SMS等,就很容易出现操作超时情况.你 ...

随机推荐

  1. GC判断哪些内存需要回收

    GC的问题,主要分为:1.哪些内存需要回收?2.什么时候回收?3.如何回收?这里主要讲第一个问题. 1.哪些内存需要回收? 垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”, ...

  2. idea取消大小写自动提示

    file-settings 取消勾选Match case

  3. Winform中将Bitmap对象通过picture显示图片

    场景 使用Zxing生成二维码时,返回的是Bitmap,现在要将其显示. Winform中显示照片的控件是pictureBox 实现 //二维码要存储的内容 string codeString = & ...

  4. 【学习笔记】第一章 python安全开发简介

    1.1为什么黑客喜欢用python? python为我们提供了非常完善的基础代码库,覆盖了网络.文件.GUI.数据库.文本等大量内容,被形象的称为“”内置电池“”,用python开发,许多功能不必从零 ...

  5. 【教程】Bluestacks0.7.9.860以上版3分钟教你摇一摇

    Bluestacks 0.7.9.860 版或以上 , 打开文件夹Win 7 用户 : C:\ProgramData\Bluestacks\UserData\InputMapperWin XP 用户 ...

  6. (七十一)c#Winform自定义控件-折现图

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  7. .NetCore 网站DELETE请求错误405.0 - Method Not Allowed 因为使用了无效方法

    .netCore网站Delete请求405错误 解决方案 1:在启用或关闭Windows功能 –> Internet Information Services 关闭WebDAV发布(这种方式可能 ...

  8. Django-中间件-csrf扩展请求伪造拦截中间件-Django Auth模块使用-效仿 django 中间件配置实现功能插拔式效果-09

    目录 昨日补充:将自己写的 login_auth 装饰装在 CBV 上 django 中间件 django 请求生命周期 ***** 默认中间件及其大概方法组成 中间件的执行顺序 自定义中间件探究不同 ...

  9. pathlib模块

    一.pathlib库官方定义 pathlib 是Python内置库,Python 文档给它的定义是 Object-oriented filesystem paths(面向对象的文件系统路径).path ...

  10. 2018年蓝桥杯ava b组第一题

    第一题.标题:第几天 2000年的1月1日,是那一年的第1天.那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容 如果问我怎么做的,我就是看日历做的,看了 ...