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

search for in the

socket_bind> <Soket İşlevleri
[edit] Last updated: Fri, 23 Mar 2012

view this page in

socket_accept

(PHP 4 >= 4.1.0, PHP 5)

socket_acceptSoket üzerinden bağlantı kabul eder

Açıklama

resource socket_accept ( resource $soket )

soket soketi socket_create() ile oluşturulup, socket_bind() kullanarak bir isimle ilişkilendirildikten sonra socket_listen() ile gelen bağlantılar dinlenmeye başlanır. Bu işlev böyle bir soket üzerinden gelen bağlantıları kabul etmek için kullanılır. Başarılı bir bağlantı, iletişim için kullanılacak yeni bir soket özkaynağının dönmesini sağlar. Soket kuyruğunda bekleyen çok sayıda bağlantı varsa socket_accept() bunlardan birinde veri hazır olana dek bekler. Soket socket_set_blocking() veya socket_set_nonblock() ile engellenmeyen kipe sokulmuşsa bu işlev FALSE döndürür.

socket_accept() tarafından döndürülen soket özkaynağı yeni bağlantılar kabul etmek için kullanılamaz. Bununla birlikte, soket ile belirtilen dinleme soketi açık olarak kalır ve defalarca kullanılabilir.

Değiştirgeler

soket

socket_create() ile oluşturulmuş geçerli bir soket özkaynağı.

Dönen Değerler

Bir hata durumunda FALSE yoksa yeni bir soket özkaynağı döner. Hata kodu socket_last_error() işlevi ile alınabilir. Bu hata kodunu socket_strerror() işlevine aktararak hatayı açıklayan dizgeyi alabilirsiniz.

Ayrıca Bakınız



socket_bind> <Soket İşlevleri
[edit] Last updated: Fri, 23 Mar 2012
 
add a note add a note User Contributed Notes socket_accept
Anonymous 09-May-2008 10:32
If you want to know the remote address ( ip address ) and the port of an incoming connection that has been accepted with socket_accept(), you can use socket_getpeername()
Boylett 18-Apr-2008 03:01
If you want to have multiple clients on a server you will have to use non blocking.

<?php

$clients
= array();
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_bind($socket,'127.0.0.1',$port);
socket_listen($socket);
socket_set_nonblock($socket);

while(
true)
{
    if((
$newc = socket_accept($socket)) !== false)
    {
        echo
"Client $newc has connected\n";
       
$clients[] = $newc;
    }
}

?>
lars at opdenkamp dot eu 28-Jan-2008 09:35
If you want to make a daemon process that forks on each client connection, you'll find out that there's a bug in PHP. The child processes send SIGCHLD to their parent when they exit but the parent can't handle signals while it's waiting for socket_accept (blocking).

Here is a piece of code that makes a non-blocking forking server.

#!/usr/bin/php -q
<?php
/**
  * Listens for requests and forks on each connection
  */

$__server_listening = true;

error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();
declare(
ticks = 1);

become_daemon();

/* nobody/nogroup, change to your host's uid/gid of the non-priv user */
change_identity(65534, 65534);

/* handle signals */
pcntl_signal(SIGTERM, 'sig_handler');
pcntl_signal(SIGINT, 'sig_handler');
pcntl_signal(SIGCHLD, 'sig_handler');

/* change this to your own host / port */
server_loop("127.0.0.1", 1234);

/**
  * Change the identity to a non-priv user
  */
function change_identity( $uid, $gid )
{
    if( !
posix_setgid( $gid ) )
    {
        print
"Unable to setgid to " . $gid . "!\n";
        exit;
    }

    if( !
posix_setuid( $uid ) )
    {
        print
"Unable to setuid to " . $uid . "!\n";
        exit;
    }
}

/**
  * Creates a server socket and listens for incoming client connections
  * @param string $address The address to listen on
  * @param int $port The port to listen on
  */
function server_loop($address, $port)
{
    GLOBAL
$__server_listening;

    if((
$sock = socket_create(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        echo
"failed to create socket: ".socket_strerror($sock)."\n";
        exit();
    }

    if((
$ret = socket_bind($sock, $address, $port)) < 0)
    {
        echo
"failed to bind socket: ".socket_strerror($ret)."\n";
        exit();
    }

    if( (
$ret = socket_listen( $sock, 0 ) ) < 0 )
    {
        echo
"failed to listen to socket: ".socket_strerror($ret)."\n";
        exit();
    }

   
socket_set_nonblock($sock);
   
    echo
"waiting for clients to connect\n";

    while (
$__server_listening)
    {
       
$connection = @socket_accept($sock);
        if (
$connection === false)
        {
           
usleep(100);
        }elseif (
$connection > 0)
        {
           
handle_client($sock, $connection);
        }else
        {
            echo
"error: ".socket_strerror($connection);
            die;
        }
    }
}

/**
  * Signal handler
  */
function sig_handler($sig)
{
    switch(
$sig)
    {
        case
SIGTERM:
        case
SIGINT:
            exit();
        break;

        case
SIGCHLD:
           
pcntl_waitpid(-1, $status);
        break;
    }
}

/**
  * Handle a new client connection
  */
function handle_client($ssock, $csock)
{
    GLOBAL
$__server_listening;

   
$pid = pcntl_fork();

    if (
$pid == -1)
    {
       
/* fork failed */
       
echo "fork failure!\n";
        die;
    }elseif (
$pid == 0)
    {
       
/* child process */
       
$__server_listening = false;
       
socket_close($ssock);
       
interact($csock);
       
socket_close($csock);
    }else
    {
       
socket_close($csock);
    }
}

function
interact($socket)
{
   
/* TALK TO YOUR CLIENT */
}

/**
  * Become a daemon by forking and closing the parent
  */
function become_daemon()
{
   
$pid = pcntl_fork();
   
    if (
$pid == -1)
    {
       
/* fork failed */
       
echo "fork failure!\n";
        exit();
    }elseif (
$pid)
    {
       
/* close the parent */
       
exit();
    }else
    {
       
/* child becomes our daemon */
       
posix_setsid();
       
chdir('/');
       
umask(0);
        return
posix_getpid();

    }
}

?>
galantonp at yahoo dot com 13-Jun-2007 04:20
socket_accept with timeout, seems to work for me on Apache/1.3.37 (FreeBSD 6.0) PHP/4.4.7.

Adapted from ScriptBlue at nyc dot rr dot com's post under socket_connect.

<?php
$socket
= socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_bind($socket,$address,$port);
socket_listen($socket);

echo
"Waiting for a connection\n";
$conn = false;
switch(@
socket_select($r = array($socket), $w = array($socket), $e = array($socket), 60)) {
    case
2:
        echo
"Connection refused\n";
        break;
    case
1:
        echo
"Connection accepted\n";
       
$conn = @socket_accept($socket);
        break;
    case
0:
        echo
"Connection timed out\n";
        break;
}
   
   
if (
$conn !== false) {
   
// communicate over $conn
}

 
?>
gmkarl at gmail dot com 22-May-2007 03:15
Be aware signal handler functions set with pcntl_signal are not called while a socket is blocking waiting for a connection; the signal is absorbed silently and the handler called when a connection is made.
simon at 180solutions dot com 16-May-2005 02:11
>Accepting a connection using php-sockets:
>
>$fd = socket_create(AF_INET, SOCK_STREAM, 6 /* OR >getprotobyname("TCP")*/);
>
>$PORT = 5000;
>
>socket_bind($fd, "0.0.0.0", $PORT);
>
>while(true)
>{
>$remote_fd = socket_accept($fd);
>
>remote_socket_client_handle($remote_fd);
>
>}
>
>It is simple!

This example doesn't work. You have to call socket_listen($fd) after your bind in order to accept incoming connections.

Simon
Greg MacLellan 11-Dec-2003 05:49
The socket returned by this resource will be non-blocking, regardless of what the listening socket is set to. This is actually true for all FCNTL modifiers.
diogo at transoft dot com dot br 18-Aug-2003 07:32
Accepting a connection using php-sockets:

$fd = socket_create(AF_INET, SOCK_STREAM, 6 /* OR getprotobyname("TCP")*/);

$PORT = 5000;

socket_bind($fd, "0.0.0.0", $PORT);

while(true)
{
$remote_fd = socket_accept($fd);

remote_socket_client_handle($remote_fd);

}

It is simple!

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