2011年1月22日土曜日

PHP@x64@Windows7でfsockopenが必ずエラーとなる。

PHPのWindowsの64ビット版。
公式にはまだないようですが、なんとなくdownloadして使ってみてるんですが、、、、、
とりあえず、、
fsockopen は必ずエラーになることがわかりました。
しょうがないので、こんな感じで、ベタな関数を使ってクラスをかきました。
ローレベルの関数は問題なく実行できたので、とりあえずはこれは使ってみます。。。。
そういえば、、readfile関数も微妙に怪しい。。。。。^^;^^;

class alexsock{
 private $portn;
 private $address;
 private $sock;
 private $counter;
 //-------------------------
 /* 初期値 */
 //-------------------------
 function __construct(){
  $this->address = 'localhost';
  $this->portn = 20002;
  $this->counter = 10;
 }
 //-------------------------
 function __destruct(){
  // とりあえず特にやることなし。
 }
 //-------------------------
 function setAddress($v){
  $this->address = $v;
 }
 //-------------------------
 function setPort($v){
  $this->portn = $v;
 }
 //-------------------------
 function create(){
  $this->sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  if ($this->sock === false) return false;
  return true;
 }
 //-------------------------
 function connect(){
  $result = socket_connect($this->sock, $this->address, $this->portn);
  if($result === false) return false;
  return true;
 }
 //-------------------------
 function setNonblock(){
  socket_set_nonblock($this->sock);
 }
 //-------------------------
 function setBlock(){
  socket_set_block($this->sock);
 }
 //-------------------------
 function setWaitTime($milisec){
  $this->counter = $milisec / 100;
  if($this->counter < 1) $this->counter = 1;
 }
 //-------------------------
 function close(){
  socket_close ($this->sock);
 }
 //-------------------------
 function write($msg){
  $writelen = socket_write($this->sock, $msg, mb_strlen($msg)); 
  return $writelen;
 }
 //-------------------------
 function read($slen){
  $readlen = socket_read($this->sock, $slen);
  return $readlen;
 }
 //-------------------------
 function readEx($slen){
  for($w=0;$w<$this->counter;$w++){
   if($readstr == false){
    $readstr = socket_read($this->sock,$slen);
    if($readstr != false) return $readstr;
    usleep(100000);   // マイクロ秒単位
   }
  }
  return false;
 }
 //-------------------------
 // ありがちな準備
 //-------------------------
 function alexPrepare($add="127.0.0.1",$portn=20002,$milisec=10000){
  $this->setAddress($add);
  $this->setPort($portn);
  $this->setWaitTime($milisec);
  $b = $this->create();
  if(!$b) return false;
  $b = $this->connect();
  if(!$b) return false;
  $this->setNonblock();
  return true;
 }
 //-------------------------
}

0 件のコメント:

コメントを投稿