stream_socket_accept()
(PHP 5, PHP 7)
接受由stream_socket_server()创建的套接字连接
说明
stream_socket_accept(resource $server_socket[,float $timeout= ini_get("default_socket_timeout")[,string &$peername]]): resource
接受由stream_socket_server()创建的套接字连接。
参数
- $server_socket
需要接受的服务器创建的套接字连接。
- $timeout
覆盖默认的套接字接受的超时时限。输入的时间需以秒为单位。
- $peername
如果包含该参数并且是可以从选中的传输数据中获取到,则将被设置给连接中的客户端主机的名称(地址)(怕出入很大,附带上原文:Will be set to the name (address) of the client which connected, if included and available from the selected transport.)
Note:
也可以之后通过stream_socket_get_name()来确定。
返回值
返回接受套接之后的资源流或者在失败时返回FALSE
。
注释
Warning该函数不能被用于 UDP 套接字。可以使用stream_socket_recvfrom()和stream_socket_sendto()来取而代之。
参见
stream_socket_server()
Create an Internet or Unix domain server socketstream_socket_get_name()
获取本地或者远程的套接字名称stream_set_blocking()
为资源流设置阻塞或者阻塞模式stream_set_timeout()
Set timeout period on a streamfgets()
从文件指针中读取一行fgetss()
从文件指针中读取一行并过滤掉 HTML 标记fwrite()
写入文件(可安全用于二进制文件)fclose()
关闭一个已打开的文件指针feof()
测试文件指针是否到了文件结束的位置- cURL 函数
This code could be very helpfull... The following code is for the "server". It listen for a message until CTRL-C <?php while (true) { // disconnected every 5 seconds... receive_message('127.0.0.1','85',5); } function receive_message($ipServer,$portNumber,$nbSecondsIdle) { // creating the socket... $socket = stream_socket_server('tcp://'.$ipServer.':'.$portNumber, $errno, $errstr); if (!$socket) { echo "$errstr ($errno)<br />\n"; } else { // while there is connection, i'll receive it... if I didn't receive a message within $nbSecondsIdle seconds, the following function will stop. while ($conn = @stream_socket_accept($socket,$nbSecondsIdle)) { $message= fread($conn, 1024); echo 'I have received that : '.$message; fputs ($conn, "OK\n"); fclose ($conn); } fclose($socket); } } ?> The following code is for the "client". It send a message, and read the respons... <?php send_message('127.0.0.1','85','Message to send...'); function send_message($ipServer,$portServer,$message) { $fp = stream_socket_client("tcp://$ipServer:$portServer", $errno, $errstr); if (!$fp) { echo "ERREUR : $errno - $errstr<br />\n"; } else { fwrite($fp,"$message\n"); $response = fread($fp, 4); if ($response != "OK\n") {echo 'The command couldn\'t be executed...\ncause :'.$response;} else {echo 'Execution successfull...';} fclose($fp); } } ?>
To check if there's a new connection waiting, without blocking, or (when using non-blocking mode) without notices), you can use stream_accept (as opposed to socket_select). <?php class GenericClass { protected $resSocket=null; function acceptConnections() { # check that we still have a resource if(is_resource($this->resSocket)) { $arrRead=array($this->resSocket); $arrWrite=array(); /** @warning Passing $arrRead,$arrWrite by reference */ if(stream_select($arrRead,$arrWrite,$arrWrite,0)) { $resConnection=stream_socket_accept($this->resSocket,0); # ... other stuff here } } } } ?>
this function, compared to the function socket_accept, got an extra argument "timeout". To make this function wait indefinitelly to incoming connections, just as in socket_accept, set timeout to -1. It works for me with PHP 5.0.4.
Note that if you use 0 as timeout, the connection will timeout right away.
To whom it may concern, and it may concern you greatly, stream_set_blocking has no effect on stream_socket_accept. If you want it to return right away, connection or not, use 0 for the timeout parameter.