Socket 函数
在线手册:中文 英文
PHP手册

socket_create_listen

(PHP 4 >= 4.1.0, PHP 5)

socket_create_listenOpens a socket on port to accept connections

说明

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

socket_create_listen() creates a new socket resource of type AF_INET listening on all local interfaces on the given port waiting for new connections.

This function is meant to ease the task of creating a new socket which only listens to accept new connections.

参数

port

The port on which to listen on all interfaces.

backlog

The backlog parameter defines the maximum length the queue of pending connections may grow to. SOMAXCONN may be passed as backlog parameter, see socket_listen() for more information.

返回值

socket_create_listen() returns a new socket resource on success or FALSE on error. The error code can be retrieved with socket_last_error(). This code may be passed to socket_strerror() to get a textual explanation of the error.

注释

Note:

If you want to create a socket which only listens on a certain interface you need to use socket_create(), socket_bind() and socket_listen().

参见


Socket 函数
在线手册:中文 英文
PHP手册
PHP手册 - N: Opens a socket on port to accept connections

用户评论:

danf at speet dot com (06-Aug-2010 01: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 10: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 (26-Jun-2008 11: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 07: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 12: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 10:50)

Remember that ports are only valid from 1 - 65536