文字

stream_socket_accept

(PHP 5)

stream_socket_accept接受由 stream_socket_server() 创建的套接字连接

说明

resource stream_socket_accept ( resource $server_socket [, float $timeout = ini_get("default_socket_timeout") [, string &$peername ]] )

接受由 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 socket
  • stream_socket_get_name() - 获取本地或者远程的套接字名称
  • stream_set_blocking() - 为资源流设置阻塞或者阻塞模式
  • stream_set_timeout() - Set timeout period on a stream
  • fgets() - 从文件指针中读取一行
  • fgetss() - 从文件指针中读取一行并过滤掉 HTML 标记
  • fwrite() - 写入文件(可安全用于二进制文件)
  • fclose() - 关闭一个已打开的文件指针
  • feof() - 测试文件指针是否到了文件结束的位置
  • cURL 函数

用户评论:

[#1] Alex Nordenheim [2014-12-17 10:37:02]

Note that if you use 0 as timeout, the connection will timeout right away.

[#2] Andy at txtNation dot com [2011-10-10 09:13:36]

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();
                
                

                
if(stream_select($arrRead,$arrWrite,$arrWrite,0)) {
            
                    
$resConnection=stream_socket_accept($this->resSocket,0);

                    
# ... other stuff here
                
}
            }
        }
    }
?>

[#3] fred dot hakeem dot smith at muslimamerica dot bob dot net [2008-01-02 00:33:51]

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.

[#4] mickael dot bailly at free dot fr [2006-07-18 03:10:28]

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.

[#5] leleu256NOSPAM at hotmail dot com [2004-11-02 05:58:23]

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))
    {
     
$messagefread($conn1024);
     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($fp4);
     if (
$response != "OK\n")
        {echo 
'The command couldn\'t be executed...\ncause :'.$response;}
     else
        {echo 
'Execution successfull...';}
     
fclose($fp);
  }
}
?>

上一篇: 下一篇: