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

search for in the

stream_socket_recvfrom> <stream_socket_get_name
Last updated: Sun, 25 Nov 2007

view this page in

stream_socket_pair

(PHP 5 >= 5.1.0)

stream_socket_pair — Creates a pair of connected, indistinguishable socket streams

Popis

array stream_socket_pair ( int $domain , int $type , int $protocol )

stream_socket_pair() creates a pair of connected, indistinguishable socket streams. This function is commonly used in IPC (Inter-Process Communication).

Parametre

domain

The protocol family to be used: STREAM_PF_INET, STREAM_PF_INET6 or STREAM_PF_UNIX

type

The type of communication to be used: STREAM_SOCK_DGRAM, STREAM_SOCK_RAW, STREAM_SOCK_RDM, STREAM_SOCK_SEQPACKET or STREAM_SOCK_STREAM

protocol

The protocol to be used: STREAM_IPPROTO_ICMP, STREAM_IPPROTO_IP, STREAM_IPPROTO_RAW, STREAM_IPPROTO_TCP or STREAM_IPPROTO_UDP

Note: Please consult the Streams constant list for further details on each constant.

Vrátené hodnoty

Returns an array with the two socket resources on success, or FALSE on failure.

Príklady

Example#1 A stream_socket_pair() example

This example shows the basic usage of stream_socket_pair() in Inter-Process Comunication.

<?php

$sockets 
stream_socket_pair(STREAM_PF_UNIXSTREAM_SOCK_STREAMSTREAM_IPPROTO_IP);
$pid     pcntl_fork();

if (
$pid == -1) {
     die(
'could not fork');

} else if (
$pid) {
     
/* parent */
    
fclose($sockets[0]);

    
fwrite($sockets[1], "child PID: $pid\n");
    echo 
fgets($sockets[1]);

    
fclose($sockets[1]);

} else {
    
/* child */
    
fclose($sockets[1]);

    
fwrite($sockets[0], "message from child\n");
    echo 
fgets($sockets[0]);

    
fclose($sockets[0]);
}

?>

Výstup horeuvedeného príkladu bude niečo podobné tomuto:

child PID: 1378
message from child



add a note add a note User Contributed Notes
stream_socket_pair
Till
02-Aug-2007 08:47
This is some freak-example how to use this feature to fork to a
bc-command on a Solaris-Server:

<?
$sockets=stream_socket_pair(STREAM_PF_UNIX,STREAM_SOCK_STREAM,
                                                STREAM_IPPROTO_IP);
passthru('
    perl -e \'
        use strict; my ($x,@x);
        open(STDIN,"-|","/bin/pfiles $$");
        while (<>) { $x=$1 if(/^ +([0-9]+):/); push(@x,$x) if(/AF_UNIX/); }
        print "Starting bc -l 0<&$x[1] 1>&$x[1] $x[0]<&- $x[0]>&- ...\n\n";
        exec("bash","-c","bc -l 0<&$x[1] 1>&$x[1] $x[0]<&- $x[0]>&- &");\'');

fclose($sockets[0]);

fwrite($sockets[1],"666*999\n");
print "666*999 = ".fgets($sockets[1])."\n";

fwrite($sockets[1],"./696\n");
print "./696 = ".fgets($sockets[1])."\n";

fwrite($sockets[1],"quit\n");
fclose($sockets[1]);
?>

The big problem is, that there seems to be no way to obtain the real
filedescriptors of the two sockets, but you need them, if you want to
redirect some program's STDOUT and STDIN to one of these sockets.

I misused the /bin/pfiles command on a Solaris UNIX to find them.
Another (non-php-) problem is, that, if you use php in Apache, there
will be already a lot of open filedescriptors and the filedescriptors
of the sockets will be greater than 9. That's why I had to use the bash.

I think it is awful, but it works. Would be great, if someone
would come up with a better idea.

stream_socket_recvfrom> <stream_socket_get_name
Last updated: Sun, 25 Nov 2007
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites