sThread
[ class tree: sThread ] [ index: sThread ] [ all elements ]

Source for file echo.php

Documentation is available at echo.php

  1. <?php
  2. /**
  3.  * sThread ECHO module
  4.  *
  5.  * 에코 프로코톨을 검사.
  6.  *
  7.  * UDP protocol에 대한 검사는 정확성을 보장하지 못한다.
  8.  *
  9.  *
  10.  * @category    Network
  11.  * @package     sThread
  12.  * @subpackage  sThread_Module
  13.  * @author      JoungKyun.Kim <http://oops.org>
  14.  * @copyright   (c) 2015 OOPS.ORG
  15.  * @license     BSD License
  16.  * @version     $Id$
  17.  * @link        http://pear.oops.org/package/sThread
  18.  * @filesource
  19.  */
  20.  
  21. /**
  22.  * ECHO module Class
  23.  *
  24.  * 에코 프로코톨을 검사.
  25.  *
  26.  * UDP protocol에 대한 검사는 정확성을 보장하지 못한다.
  27.  *
  28.  * @category    Network
  29.  * @package     sThread
  30.  * @subpackage  sThread_Module
  31.  * @author      JoungKyun.Kim <http://oops.org>
  32.  * @copyright   (c) 2015 OOPS.ORG
  33.  * @license     BSD License
  34.  * @link        http://pear.oops.org/package/sThread
  35.  */
  36. Class sThread_ECHO {
  37.     // {{{ Base properteis
  38.     /**#@+
  39.      * @access public
  40.      */
  41.     /**
  42.      * 이 변수의 값이 true로 셋팅이 되면, clear_session
  43.      * method를 만들어 줘야 한다. 반대로 false 상태에서는
  44.      * clear_session method가 존재하지 않아도 상관이 없다.
  45.      *
  46.      * @var bool 
  47.      */
  48.     static public $clearsession;
  49.     /**
  50.      * ECHO 모듈이 사용하는 protocol
  51.      * @var string 
  52.      */
  53.     static public $protocol;
  54.     /**
  55.      * ECHO 모듈이 사용하는 기본 포트 번호
  56.      * @var int 
  57.      */
  58.     static public $port;
  59.  
  60.     const ECHO_REQUEST  1;
  61.     const ECHO_RESPONSE 2;
  62.     const ECHO_CLOSE    3;
  63.     /**#@-*/
  64.     // }}}
  65.  
  66.     // {{{ (void) sThread_ECHO::__construct (void)
  67.     /**
  68.      * Class OOP 형식 초기화 메소드
  69.      * @access public
  70.      * @return sThread_ECHO 
  71.      */
  72.     function __construct ({
  73.         self::init ();
  74.         $this->clearsession = &self::$clearsession;
  75.         $this->port         = &self::$port;
  76.         $this->protocol     = &self::$protocol;
  77.     }
  78.     // }}}
  79.  
  80.     // {{{ (void) sThread_ECHO::init (void)
  81.     /**
  82.      * echo 모듈을 초기화 한다.
  83.      *
  84.      * @access public
  85.      * @return void 
  86.      */
  87.     function init ({
  88.         self::$clearsession false;
  89.         self::$port         7;
  90.         self::$protocol     'tcp';
  91.     }
  92.     // }}}
  93.  
  94.     // {{{ (int) sThread_ECHO::check_buf_status ($status)
  95.     /**
  96.      * 현재 상태가 event read 상태인지 event write 상태인지
  97.      * 를 판단한다.
  98.      *
  99.      * @access public
  100.      * @return int 
  101.      * @param  int    현재 status
  102.      */
  103.     function check_buf_status ($status{
  104.         switch ($status{
  105.             case :
  106.             case self::ECHO_REQUEST :
  107.                 return Vari::EVENT_READY_SEND;
  108.                 break;
  109.             case self::ECHO_RESPONSE :
  110.                 return Vari::EVENT_READY_RECV;
  111.                 break;
  112.             case self::ECHO_CLOSE :
  113.                 return Vari::EVENT_READY_CLOSE;
  114.                 break;
  115.             default :
  116.                 return Vari::EVENT_UNKNOWN;
  117.         }
  118.     }
  119.     // }}}
  120.  
  121.     // {{{ (string) sThread_ECHO::call_status ($status, $call = false)
  122.     /**
  123.      * 현재의 status(integer) 또는 현재 status의 handler 이름을
  124.      * 반환한다.
  125.      *
  126.      * @access public
  127.      * @return int|string
  128.      * @param  int        현재 status
  129.      * @param  boolean    true로 설정했을 경우 현재 status의 handler
  130.      *                     이름을 반환한다.
  131.      */
  132.     function call_status ($status$call false{
  133.         switch ($status{
  134.             case self::ECHO_REQUEST :
  135.                 $r 'ECHO_REQUEST';
  136.                 break;
  137.             case self::ECHO_RESPONSE :
  138.                 $r 'ECHO_RESPONSE';
  139.                 break;
  140.             default:
  141.                 $r Vari::EVENT_UNKNOWN;
  142.         }
  143.  
  144.         if $call !== false && $r !== Vari::EVENT_UNKNOWN )
  145.             $r strtolower ($r);
  146.  
  147.         return $r;
  148.     }
  149.     // }}}
  150.  
  151.     // {{{ (boolean) sThread_ECHO::change_status (&$sess, $key)
  152.     /**
  153.      * 세션의 상태를 단계로 변경한다.
  154.      *
  155.      * @access public
  156.      * @param  boolean  변경한 상태가 마지막 단계일 경우 false를
  157.      *                   반환한다.
  158.      * @param  stdClass sThread 세션 변수 reference
  159.      * @param  int      세션 키
  160.      */
  161.     function change_status (&$sess$key{
  162.         ++$sess->status[$key];
  163.  
  164.         if $sess->status[$key=== self::ECHO_CLOSE )
  165.             return false;
  166.  
  167.         return true;
  168.     }
  169.     // }}}
  170.  
  171.     // {{{ (void) sThread_ECHO::set_last_status (&$sess, $key)
  172.     /**
  173.      * 세션의 상태를 마지막 단계로 변경한다.
  174.      *
  175.      * @access public
  176.      * @param  stdClass sThread 세션 변수 reference
  177.      * @param  int      세션 키
  178.      */
  179.     function set_last_status (&$sess$key{
  180.         $sess->status[$keyself::ECHO_CLOSE;
  181.     }
  182.     // }}}
  183.  
  184.     // {{{ (boolean) sThread_ECHO::clear_session ($key) {
  185.     /**
  186.      * session에서 사용한 변수(self::$sess)의 값을 정리한다.
  187.      *
  188.      * self::$clearsession == false 일 경우, clear_session method
  189.      * 는 존재하지 않아도 된다.
  190.      *
  191.      * @access public
  192.      * @return void 
  193.      * @param  int    세션 키
  194.      */
  195.     function clear_session ($key{
  196.         return;
  197.     }
  198.     // }}}
  199.  
  200.     /*
  201.      * Handler 정의
  202.      *
  203.      * Handler는 call_status 메소드에 정의된 값들 중
  204.      * Vari::EVENT_UNKNOWN를 제외한 모든 status의 constant string을
  205.      * 소문자로해서 만들어야 한다.
  206.      *
  207.      * Handler 이름은 sThread_MODULE::call_status 메소드를
  208.      * 통해서 구할 수 있다.
  209.      *
  210.      * handler는 다음의 구조를 가지며, 실제로 전송을 하거나 받는
  211.      * 것은 libevent가 한다.
  212.      *
  213.      * write handler:
  214.      *       handler_name (&$ses, $key)
  215.      *
  216.      *       write handler는 실제로 전송을 하지 않고 전송할
  217.      *       데이터를 생성해서 반환만 한다.
  218.      *
  219.      * read handler:
  220.      *       handler_name (&$sess, $key, $recv) 
  221.      *
  222.      *       read handler의 반환값은 다음과 같이 지정을 해야 한다.
  223.      *
  224.      *       true  => 모든 전송이 완료
  225.      *       false => 전송 받을 것이 남아 있음
  226.      *       null  => 전송 중 에러 발생
  227.      *
  228.      *       이 의미는 sThread가 read handler에서 결과값에 따라
  229.      *       true는 다음 단계로 전환을 하고, false는 현 status를
  230.      *       유지하며, null의 경우 connection을 종료를 한다.
  231.      */
  232.  
  233.     // {{{ (string) sThread_ECHO::echo_request (&$sess, $key)
  234.     /**
  235.      * 요청할 데이터 반환
  236.      *
  237.      * @access public
  238.      * @return void 
  239.      * @param  stdClass 세션 object
  240.      * @param  int      세션 키
  241.      */
  242.     function echo_request (&$sess$key{
  243.         return "echo data\r\n";
  244.     }
  245.     // }}}
  246.  
  247.     // {{{ (boolean) sThread_ECHO::echo_response (&$sess, $key, $recv)
  248.     /**
  249.      * 서버의 응답을 확인
  250.      *
  251.      * @access public
  252.      * @return bool|null결과 값은 다음과 같다.
  253.      *      <ul>
  254.      *          <li>true:  모든 전송이 완료</li>
  255.      *          <li>false: 전송할 것이 남아 있음. readcallback에서
  256.      *                     false를 받으면 status를 유지한다.</li>
  257.      *          <li>null:  전송 중 에러 발생</li>
  258.      *      </ul>
  259.      * @param  stdClass 세션 object
  260.      * @param  int    세션 키
  261.      * @param  mixed  read callback에서 전송받은 누적 데이터
  262.      */
  263.     function echo_response (&$sess$key$recv{
  264.         if $recv )
  265.             return false;
  266.  
  267.         list ($host$port$type$sess->addr[$key];
  268.         $sess->recv[$key.= $recv;
  269.  
  270.         //if ( ! preg_match ('/data$/', $sess->recv[$key]) )
  271.         if $sess->recv[$key!= "echo data\r\n" )
  272.             return false;
  273.  
  274.         if Vari::$result === true )
  275.             $sess->data[$keybase64_encode (self::$sess->data[$key]);
  276.         unset ($sess->recv[$key]);
  277.  
  278.         return true;
  279.     }
  280.     // }}}
  281. }
  282.  
  283. ?>

Documentation generated on Fri, 30 Aug 2024 06:10:06 +0900 by phpDocumentor 1.4.4