note 108535 added to function.socket-create
| From: | ab1965 at yandex dot ru | Date: | Fri, 04 May 2012 12:43:51 +0000 |
| Subject: | note 108535 added to function.socket-create | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-187473@lists.php.net to get a copy of this message | ||
It took some time to understand how one PHP process can communicate with another by means of unix
udp sockets. Examples of 'server' and 'client' code are given below. Server is
assumed to run before client starts.
'Server' code
<?php
if (!extension_loaded('sockets')) {
die('The sockets extension is not loaded.');
}
// create unix udp socket
$socket = socket_create(AF_UNIX, SOCK_DGRAM, 0);
if (!$socket)
die('Unable to create AF_UNIX socket');
// same socket will be used in recv_from and send_to
$server_side_sock = dirname(__FILE__)."/server.sock";
if (!socket_bind($socket, $server_side_sock))
die("Unable to bind to $server_side_sock");
while(1) // server never exits
{
// receive query
if (!socket_set_block($socket))
die('Unable to set blocking mode for socket');
$buf = '';
$from = '';
echo "Ready to receive...\n";
// will block to wait client query
$bytes_received = socket_recvfrom($socket, $buf, 65536, 0, $from);
if ($bytes_received == -1)
die('An error occured while receiving from the socket');
echo "Received $buf from $from\n";
$buf .= "->Response"; // process client query here
// send response
if (!socket_set_nonblock($socket))
die('Unable to set nonblocking mode for socket');
// client side socket filename is known from client request: $from
$len = strlen($buf);
$bytes_sent = socket_sendto($socket, $buf, $len, 0, $from);
if ($bytes_sent == -1)
die('An error occured while sending to the socket');
else if ($bytes_sent != $len)
die($bytes_sent . ' bytes have been sent instead of the ' . $len . ' bytes
expected');
echo "Request processed\n";
}
?>
'Client' code
<?php
if (!extension_loaded('sockets')) {
die('The sockets extension is not loaded.');
}
// create unix udp socket
$socket = socket_create(AF_UNIX, SOCK_DGRAM, 0);
if (!$socket)
die('Unable to create AF_UNIX socket');
// same socket will be later used in recv_from
// no binding is required if you wish only send and never receive
$client_side_sock = dirname(__FILE__)."/client.sock";
if (!socket_bind($socket, $client_side_sock))
die("Unable to bind to $client_side_sock");
// use socket to send data
if (!socket_set_nonblock($socket))
die('Unable to set nonblocking mode for socket');
// server side socket filename is known apriori
$server_side_sock = dirname(__FILE__)."/server.sock";
$msg = "Message";
$len = strlen($msg);
// at this point 'server' process must be running and bound to receive from serv.sock
$bytes_sent = socket_sendto($socket, $msg, $len, 0, $server_side_sock);
if ($bytes_sent == -1)
die('An error occured while sending to the socket');
else if ($bytes_sent != $len)
die($bytes_sent . ' bytes have been sent instead of the ' . $len . ' bytes
expected');
// use socket to receive data
if (!socket_set_block($socket))
die('Unable to set blocking mode for socket');
$buf = '';
$from = '';
// will block to wait server response
$bytes_received = socket_recvfrom($socket, $buf, 65536, 0, $from);
if ($bytes_received == -1)
die('An error occured while receiving from the socket');
echo "Received $buf from $from\n";
// close socket and delete own .sock file
socket_close($socket);
unlink($client_side_sock);
echo "Client exits\n";
?>
----
Server IP: 69.147.83.197
Probable Submitter: 91.191.225.107
----
Manual Page -- http://www.php.net/manual/en/function.socket-create.php
Edit -- https://master.php.net/note/edit/108535
Del: integrated -- https://master.php.net/note/delete/108535/integrated
Del: useless -- https://master.php.net/note/delete/108535/useless
Del: bad code -- https://master.php.net/note/delete/108535/bad+code
Del: spam -- https://master.php.net/note/delete/108535/spam
Del: non-english -- https://master.php.net/note/delete/108535/non-english
Del: in docs -- https://master.php.net/note/delete/108535/in+docs
Del: other reasons-- https://master.php.net/note/delete/108535
Reject -- https://master.php.net/note/reject/108535
Search -- https://master.php.net/manage/user-notes.php