Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : Stream Functions : stream_socket_pair

stream_socket_pair

Creates a pair of connected, indistinguishable socket streams (PHP 5 >= 5.1.0)
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).

Parameters

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.

Return Values

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

Examples

Example 2388. 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_UNIX, STREAM_SOCK_STREAM, STREAM_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]);
}

?>

The above example will output something similar to:

child PID: 1378
message from child


Code Examples / Notes » stream_socket_pair

till

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.


Change Language


Follow Navioo On Twitter
stream_bucket_append
stream_bucket_make_writeable
stream_bucket_new
stream_bucket_prepend
stream_context_create
stream_context_get_default
stream_context_get_options
stream_context_set_option
stream_context_set_params
stream_copy_to_stream
stream_encoding
stream_filter_append
stream_filter_prepend
stream_filter_register
stream_filter_remove
stream_get_contents
stream_get_filters
stream_get_line
stream_get_meta_data
stream_get_transports
stream_get_wrappers
stream_register_wrapper
stream_resolve_include_path
stream_select
stream_set_blocking
stream_set_timeout
stream_set_write_buffer
stream_socket_accept
stream_socket_client
stream_socket_enable_crypto
stream_socket_get_name
stream_socket_pair
stream_socket_recvfrom
stream_socket_sendto
stream_socket_server
stream_socket_shutdown
stream_wrapper_register
stream_wrapper_restore
stream_wrapper_unregister
eXTReMe Tracker