喜悦国际村 » 喜悦原创 » 非常实用的socket套接字编程

页: [1]
qh6632006-6-28 02:47 AM
非常实用的socket套接字编程

[php]
   /**
     * 功能:        套接字
     * 作者:        qh663
         * 参数:   string  $url               网址,如:[url]http://qh8.net/php/index.php?abc=123[/url]
         * 参数:   bool    $get_header        是否返回header标头
         * 参数:   bool    $real_url   用于测试网址是否正确
     * 返回:   bool/string
     */
        function socket($url, $get_header = false,$real_url = false){
                $arr = explode('/',$url);
                $host = $arr[2];
                unset($arr[0], $arr[1], $arr[2]);
                $path = '/'.implode('/', $arr);
                unset($arr);
                $service_port = getservbyname('www', 'tcp');
                $address = gethostbyname($host);
                $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
                if ($socket >= 0) {
                        $result = socket_connect($socket, $address, $service_port);
                        if ($result >= 0) {
                                $in = "HEAD $path HTTP/1.1\r\n";
                                $in .= "Host: $host\r\n";
                                $in .= "Connection: Close\r\n\r\n";
                                socket_write($socket, $in, strlen($in));
                                if($real_url){
                                        if(socket_read($socket, 15) == 'HTTP/1.1 200 OK') return true;
                                }elseif($get_header){
                                        while ( $out = socket_read($socket, 512)){
                                                $re .= $out;
                                        }
                                        return $re;
                                }
                                socket_close($socket);
                        }
                }
                return false;
        }
[/php]

//test1 发送一个socket,多线程
//(此例在当前目录新建5个文件 1_tmp.txt、2_tmp.txt、3_tmp.txt、4_tmp.txt、5_tmp.txt)
if(empty($_GET['str'])){
        $url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'];
        while ($a++ < 5){
                socket("$url?str={$a}_tmp.txt");
        }
} else {
        fopen($_GET['str'], "w");;
        die();
}

$u = 'http://down1.sz1001.net/up/小型软件2_0810/TomatoGhostXP.rar';
echo "<pre>";

//test2 返回一个地址的header,实验证明运行速度比get_headers更快
echo socket($u,true);

//test3 测试页面是否存在,实验证明运行速度比get_headers更快
echo socket($u,true,true) ? "\n网址正确": "\n网址错误";

wuminghuo2006-7-9 05:59 AM
不明白,先学习下

fcicqbbs2006-7-9 09:37 AM
偶明白怎么回事了...
可惜暂时用不着.

fcicqbbs2006-7-9 09:47 AM
请修改个地方
if(socket_read($socket, 15) == 'HTTP/1.1 200 OK') return true;
改为:
$readheader=socket_read($socket, 15);
if(($readheader == 'HTTP/1.1 200 OK') ||($readheader == 'HTTP/1.0 200 OK')) return true;
unset $readheader;

qh6632006-7-9 11:05 AM
[quote]原帖由 [i]fcicqbbs[/i] 于 2006-7-9 17:47 发表
请修改个地方
if(socket_read($socket, 15) == 'HTTP/1.1 200 OK') return true;
改为:
$readheader=socket_read($socket, 15);
if(($readheader == 'HTTP/1.1 200 OK') ||($readheader == 'HTTP/1.0 200 OK' ... [/quote]
谢谢指正,将那句改为下面的可能会更好:
if(strpos(socket_read($socket, 15), '200')) return true;

fcicqbbs2006-7-10 04:51 AM
$in .= "Connection: Closernrn";
可惜\又被吃了

hanyang2006-7-11 02:28 AM
帮顶努力学习
[img]http://bbs.chinaz.com/UploadFace/61121_200511261344964651.gif[/img]

戴红领巾小学生2006-7-14 02:57 AM
有什么用的??看不懂

吴广2006-7-15 04:21 PM
问个 PHP的socket能实现持续连接吗? 论坛用socket连接163的SMTP发信效率低的吓人!

fcicqbbs2006-7-17 04:20 AM
用pfsockopen.
(前提:apache,静态编译.)


查看完整版本: 非常实用的socket套接字编程


Powered by Discuz! Archiver 6.1.0  © 2001-2006 Comsenz Inc.
Processed in 0.006364 second(s), 2 queries