downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

socket_create_pair> <socket_connect
[edit] Last updated: Fri, 25 May 2012

view this page in

socket_create_listen

(PHP 4 >= 4.1.0, PHP 5)

socket_create_listen接続を受けつけるためにポートにソケットをオープンする

説明

resource socket_create_listen ( int $port [, int $backlog = 128 ] )

socket_create_listen() は、 AF_INET 型で すべての ローカルインターフェイスの指定したポート上で新規接続を待ち受ける 新規ソケットリソースを作成します。

この関数は、新規接続のみを受け入れるソケットを作成しやすくするためのものです。

パラメータ

port

すべてのインターフェイスで待ち受けるポート。

backlog

backlog パラメータは、 接続の順番待ちのキューをどれだけの長さまで保持するかを定義します。 SOMAXCONNbacklog パラメータに渡します。詳細な情報は socket_listen() を参照ください。

返り値

socket_create_listen() は、 成功した場合に新規ソケットリソースを、エラー時に FALSE を返します。エラーコードは socket_last_error() で取得可能です。このコードを socket_strerror() に渡すと、エラーの詳細が文字列で取得可能です。

注意

注意:

特定のインターフェイスのみを listen するソケットを作成したい場合は socket_create()socket_bind() および socket_listen() を使用します。

参考



socket_create_pair> <socket_connect
[edit] Last updated: Fri, 25 May 2012
 
add a note add a note User Contributed Notes socket_create_listen
danf at speet dot com 06-Aug-2010 02:50
A simple Class for Socket Server.

<?php

/**
 * Description of socketclass
 *
 * @author daniell
 */
class Socket {
   
// Sockets
   
private $sock;
    private
$lister;
   
// Wait, Porta, Ack
   
private $wait;
    private
$porta;
    private
$ack;
   
// Usuario
   
private $user;
   
    function
__construct($wait, $porta, $ack) {
       
$this->wait  = $wait;
       
$this->porta = $porta;
       
$this->ack   = $ack;
       
$this->user['ip'] = $this->user['port'] = NULL;
       
// Cria o servidor
       
$this->socketListen();
    }

    function 
__destruct() {
       
$this->close();
    }
   
   
// Cria o Servidor
   
public function socketListen(){
        while( !(
$this->lister = @socket_create_listen($this->porta) ) ){
            echo
'Aguarde..';
           
sleep($this->wait);
        }
    }

   
// Aguarda um Cliente conectar.
   
public function waitClient(){
       
$r = array($this->lister);
        if(
socket_select($r,$w = NULL,$e = NULL, $this->wait) ){
           
// Conectado
           
$this->sock = socket_accept($this->lister);
           
socket_getpeername($this->sock, $raddr, $rport);
           
$this->user = array('ip'=>$raddr,'port'=>$rport);           
            return
true;
        } else {
           
// [Time out] - Não conectado a tempo.
           
return false;
        }
       
    }
   
   
// Fecha a conexão
   
public function close(){
        if(
is_resource($this->lister) )
           
socket_close($this->lister);
    }
   
   
// Obtem as informações do usuário
   
public function getUserInfo(){
        return
$this->user;
    }
   
   
// Le todo o sock a cada 1 Byte.
   
public function write($message){
       
$num = 0;
       
$length = strlen($message);
        do{
           
$buff = substr($message, $num);
           
$num += socket_write($this->sock,$buff);
        }while(
$num != $length );
    }

   
// Envia o ACK
   
public function sendAck(){
        do{
           
$num = socket_write($this->sock,$this->ack);
        }while(
$num == 0 );
    }

   
// Recebe o ACK
   
public function waitAck(){
        do {
           
$buff = socket_read($this->sock,1,PHP_BINARY_READ);
        }while(
$buff != $this->ack );
    }

   
// Le todo o sock a cada 1 Byte.
   
public function read(){
       
$message = '';
        do {
           
$buff     = socket_read($this->sock,1,PHP_BINARY_READ);
           
$message .= $buff;
        }while(
$buff != "\n" );
        return
$message;
    }
}
?>
vicente dot lopez at caixadesoft dot es 27-Jul-2009 11:29
I use this script to listen on 3 ports, but with 'netstat -a' in other console reports only the last one is 'LISTEN'.

#!/usr/bin/php -q
<?php
    $services
= array(
                               
56700    =>    'daemon1',
                               
56701    =>    'daemon2',
                               
56703    =>    'daemon3',
                            );
   
   
// --- Marca el Tiempo Ilimitado para pararse ---
   
set_time_limit (0);
   
   
$sockets = array();
   
    foreach(
$services as $port => $daemon)
    {
       
// --- Abre el socket ---
       
if ($sock = @socket_create_listen($port))
        {
           
$sockets[$sock] = $daemon;
        }
        else
        {
            echo(
"error\n");
        }
    }
   
   
print_r($sockets);
   
    while (
1)
    {
        echo
"";
    }   
?>
aeolianmeson at ifacfchi dot blitzeclipse dot com 27-Jun-2008 12:34
I believe that on some systems this may not bind to some or all public interfaces.

On my Windows system, I could not connect on the public interface using this, but could when I made the individual calls to create, bind, and listen.

Dustin Oprea
sysspoof at ng-lab dot org 06-Mar-2008 08:03
Please note that port 1 to and with 1024 on linux and bsd system require root privileges. So it is recommended to choose a higher port for your own application.
jdittmer at ppp0 dot net 17-Jul-2004 01:42
If you specify no port number, or 0, a random free port will be chosen.
To use ports for ipc between client/server on the same machine you can use (minus error checking)

server.php:
<?php
$sock
= socket_create_listen(0);
socket_getsockname($sock, $addr, $port);
print
"Server Listening on $addr:$port\n";
$fp = fopen($port_file, 'w');
fwrite($fp, $port);
fclose($fp);
while(
$c = socket_accept($sock)) {
  
/* do something useful */
  
socket_getpeername($c, $raddr, $rport);
   print
"Received Connection from $raddr:$rport\n";
}
socket_close($sock);
?>

client.php:
<?php
$fp
= fopen($port_file, 'r');
$port = fgets($fp, 1024);
fclose($fp);
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($sock, '127.0.0.1', $port);
socket_close($sock);
?>
basim at baassiri dot com 06-Feb-2004 11:50
Remember that ports are only valid from 1 - 65536

 
show source | credits | stats | sitemap | contact | advertising | mirror sites