Create an Internet or Unix domain server socket (original) (raw)
stream_socket_server
(PHP 5, PHP 7)
stream_socket_server — Create an Internet or Unix domain server socket
Description
stream_socket_server ( string $local_socket
[, int &$errno
[, string &$errstr
[, int $flags
= STREAM_SERVER_BIND | STREAM_SERVER_LISTEN [, resource $context
]]]] ) : resource
This function only creates a socket, to begin accepting connections use stream_socket_accept().
Parameters
local_socket
The type of socket created is determined by the transport specified using standard URL formatting: transport://target
.
For Internet Domain sockets (AF_INET
) such as TCP and UDP, thetarget
portion of the remote_socket
parameter should consist of a hostname or IP address followed by a colon and a port number. For Unix domain sockets, the target
portion should point to the socket file on the filesystem.
Depending on the environment, Unix domain sockets may not be available. A list of available transports can be retrieved usingstream_get_transports(). SeeList of Supported Socket Transports for a list of bulitin transports.
errno
If the optional errno
and errstr
arguments are present they will be set to indicate the actual system level error that occurred in the system-level socket()
,bind()
, and listen()
calls. If the value returned in errno
is 0
and the function returned FALSE
, it is an indication that the error occurred before the bind()
call. This is most likely due to a problem initializing the socket. Note that the errno
anderrstr
arguments will always be passed by reference.
errstr
See errno
description.
flags
A bitmask field which may be set to any combination of socket creation flags.
Note:
For UDP sockets, you must use
STREAM_SERVER_BIND
as theflags
parameter.
context
Return Values
Returns the created stream, or FALSE
on error.
Examples
Example #1 Using TCP server sockets
<?php <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><mi>o</mi><mi>c</mi><mi>k</mi><mi>e</mi><mi>t</mi><mo>=</mo><mi>s</mi><mi>t</mi><mi>r</mi><mi>e</mi><mi>a</mi><msub><mi>m</mi><mi>s</mi></msub><mi>o</mi><mi>c</mi><mi>k</mi><mi>e</mi><msub><mi>t</mi><mi>s</mi></msub><mi>e</mi><mi>r</mi><mi>v</mi><mi>e</mi><mi>r</mi><mo stretchy="false">(</mo><mi mathvariant="normal">"</mi><mi>t</mi><mi>c</mi><mi>p</mi><mo>:</mo><mi mathvariant="normal">/</mi><mi mathvariant="normal">/</mi><mn>0.0.0.0</mn><mo>:</mo><mn>8000</mn><mi mathvariant="normal">"</mi><mo separator="true">,</mo></mrow><annotation encoding="application/x-tex">socket = stream_socket_server("tcp://0.0.0.0:8000", </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">soc</span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="mord mathnormal">e</span><span class="mord mathnormal">t</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">s</span><span class="mord mathnormal">t</span><span class="mord mathnormal">re</span><span class="mord mathnormal">a</span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal">oc</span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="mord mathnormal">e</span><span class="mord"><span class="mord mathnormal">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mopen">(</span><span class="mord">"</span><span class="mord mathnormal">t</span><span class="mord mathnormal">c</span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">//0.0.0.0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord">8000"</span><span class="mpunct">,</span></span></span></span>errno, $errstr); if (!$socket) { echo "$errstr ($errno)<br />\n"; } else { while ($conn = stream_socket_accept($socket)) { fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n"); fclose($conn); } fclose($socket); } ?>
The example below shows how to act as a time server which can respond to time queries as shown in an example on stream_socket_client().
Note: Most systems require root access to create a server socket on a port below 1024.
Example #2 Using UDP server sockets
`<?php socket=streamsocketserver("udp://127.0.0.1:1113",socket = stream_socket_server("udp://127.0.0.1:1113", socket=streamsocketserver("udp://127.0.0.1:1113",errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
die("$errstr ($errno)");
}
do {
pkt=streamsocketrecvfrom(pkt = stream_socket_recvfrom(pkt=streamsocketrecvfrom(socket, 1, 0, $peer);
echo "$peer\n";
stream_socket_sendto($socket, date("D M j H:i:s Y\r\n"), 0, $peer);
} while ($pkt !== false);?> `
Notes
Note: When specifying a numerical IPv6 address (e.g.
fe80::1
), you must enclose the IP in square brackets—for example,tcp://[fe80::1]:80
.
See Also
- stream_socket_client() - Open Internet or Unix domain socket connection
- stream_set_blocking() - Set blocking/non-blocking mode on a stream
- stream_set_timeout() - Set timeout period on a stream
- fgets() - Gets line from file pointer
- fgetss() - Gets line from file pointer and strip HTML tags
- fwrite() - Binary-safe file write
- fclose() - Closes an open file pointer
- feof() - Tests for end-of-file on a file pointer
- Curl extension