LoginSignup
0
0

More than 5 years have passed since last update.

phpソケット通信例/メモ

Posted at
exm_socket.php
<?php
//
// Example usage...
//
$server ='127.0.0.1';
$port   ='80';
$uri    ='/cgi-bin/random-cgi';
$content='Your post content...';

$post_results=httpPost($server,$port,$uri,$content);
if (!is_string($post_results)) {
    die('uh oh, something went wrong');
    } else {
    die('Here are your results: '.$post_results);
    }

//
// Post provided content to an http server and optionally
// convert chunk encoded results.  Returns false on errors,
// result of post on success.  This example only handles http,
// not https.
//
functionhttpPost($ip=null,$port=80,$uri=null,$content=null) {
    if (empty($ip))         { returnfalse; }
    if (!is_numeric($port)) { returnfalse; }
    if (empty($uri))        { returnfalse; }
    if (empty($content))    { returnfalse; }
   // generate headers in array.
   $t = array();
   $t[] ='POST '.$uri.' HTTP/1.1';
   $t[] ='Content-Type: text/html';
   $t[] ='Host: '.$ip.':'.$port;
   $t[] ='Content-Length: '.strlen($content);
   $t[] ='Connection: close';
   $t =implode("\r\n",$t) ."\r\n\r\n".$content;
   //
    // Open socket, provide error report vars and timeout of 10
    // seconds.
    //
   $fp= @fsockopen($ip,$port,$errno,$errstr,10);
   // If we don't have a stream resource, abort.
  if (!(get_resource_type($fp) =='stream')) { returnfalse; }
   //
    // Send headers and content.
    //
  if (!fwrite($fp,$t)) {
       fclose($fp);
        returnfalse;
        }
   //
    // Read all of response into $rsp and close the socket.
    //
   $rsp='';
    while(!feof($fp)) {$rsp.=fgets($fp,8192); }
   fclose($fp);
   //
    // Call parseHttpResponse() to return the results.
    //
  returnparseHttpResponse($rsp);
    }

//
// Accepts provided http content, checks for a valid http response,
// unchunks if needed, returns http content without headers on
// success, false on any errors.
//
functionparseHttpResponse($content=null) {
    if (empty($content)) { returnfalse; }
   // split into array, headers and content.
   $hunks=explode("\r\n\r\n",trim($content));
    if (!is_array($hunks) orcount($hunks) <2) {
        returnfalse;
        }
   $header=$hunks[count($hunks) -2];
   $body   =$hunks[count($hunks) -1];
   $headers=explode("\n",$header);
    unset($hunks);
    unset($header);
    if (!verifyHttpResponse($headers)) { returnfalse; }
    if (in_array('Transfer-Coding: chunked',$headers)) {
        returntrim(unchunkHttpResponse($body));
        } else {
        returntrim($body);
        }
    }

//
// Validate http responses by checking header.  Expects array of
// headers as argument.  Returns boolean.
//
functionvalidateHttpResponse($headers=null) {
    if (!is_array($headers) orcount($headers) <1) { returnfalse; }
    switch(trim(strtolower($headers[0]))) {
        case'http/1.0 100 ok':
        case'http/1.0 200 ok':
        case'http/1.1 100 ok':
        case'http/1.1 200 ok':
            returntrue;
        break;
        }
    returnfalse;
    }

//
// Unchunk http content.  Returns unchunked content on success,
// false on any errors...  Borrows from code posted above by
// jbr at ya-right dot com.
//
functionunchunkHttpResponse($str=null) {
    if (!is_string($str) orstrlen($str) <1) { returnfalse; }
   $eol="\r\n";
   $add=strlen($eol);
   $tmp=$str;
   $str='';
    do {
       $tmp=ltrim($tmp);
       $pos=strpos($tmp,$eol);
        if ($pos===false) { returnfalse; }
       $len=hexdec(substr($tmp,0,$pos));
        if (!is_numeric($len) or$len<0) { returnfalse; }
       $str.=substr($tmp, ($pos+$add),$len);
       $tmp =substr($tmp, ($len+$pos+$add));
       $check=trim($tmp);
        } while(!empty($check));
    unset($tmp);
    return$str;
    }

?>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0