2024 PHP Conference Japan

stream_socket_accept

(PHP 5, PHP 7, PHP 8)

stream_socket_accept接受由 stream_socket_server() 建立的通訊端上的連線

說明

stream_socket_accept(資源 $socket, ?浮點數 $timeout = null, 字串 &$peer_name = null): 資源|false

接受一個由 stream_socket_server() 建立的 socket 連線。

參數

socket

用於接受連線的伺服器 socket。

timeout

覆寫預設的 socket 接受逾時時間。時間單位為秒。預設情況下,使用 default_socket_timeout 的值。

peer_name

如果包含且可從所選傳輸中取得,將設定為連線客戶端的地址。

注意事項:

也可以稍後使用 stream_socket_get_name() 函式來決定。

返回值

成功時返回已接受 socket 連線的串流,失敗時返回 false

版本異動

版本 說明
8.0.0 timeout 現在可以為 null。

備註

警告

此函式不應與 UDP 伺服器 socket 一起使用。請改用 stream_socket_recvfrom()stream_socket_sendto()

參見

新增備註

使用者貢獻的備註 2 則備註

leleu256NOSPAM at hotmail dot com
20 年前
這段程式碼可能很有幫助...

以下程式碼適用於「伺服器」。它會持續監聽訊息,直到按下 CTRL-C

<?php
while (true)
{
// 每 5 秒斷線一次...
receive_message('127.0.0.1','85',5);
}

function
receive_message($ipServer,$portNumber,$nbSecondsIdle)
{
// 建立 socket...
$socket = stream_socket_server('tcp://'.$ipServer.':'.$portNumber, $errno, $errstr);
if (!
$socket)
{
echo
"$errstr ($errno)<br />\n";
}
else
{
// 只要有連線,就會接收它... 如果在 $nbSecondsIdle 秒內沒有收到訊息,以下函式將會停止。
while ($conn = @stream_socket_accept($socket,$nbSecondsIdle))
{
$message= fread($conn, 1024);
echo
'我已收到:'.$message;
fputs ($conn, "OK\n");
fclose ($conn);
}
fclose($socket);
}
}
?>

以下程式碼適用於「客戶端」。它會發送訊息並讀取回應...

<?php

send_message
('127.0.0.1','85','要發送的訊息...');

function
send_message($ipServer,$portServer,$message)
{
$fp = stream_socket_client("tcp://$ipServer:$portServer", $errno, $errstr);
if (!
$fp)
{
echo
"錯誤: $errno - $errstr<br />\n";
}
else
{
fwrite($fp,"$message\n");
$response = fread($fp, 4);
if (
$response != "OK\n")
{echo
'無法執行指令...\n原因:'.$response;}
else
{echo
'執行成功...';}
fclose($fp);
}
}
?>
Andy at txtNation dot com
13 年前
要檢查是否有新的連線在等待,而不阻塞,或(使用非阻塞模式時)沒有通知,您可以使用 stream_accept(而不是 socket_select)。

<?php

類別 GenericClass {

protected
$resSocket=null;

函式
acceptConnections() {

# 檢查我們是否還有資源

if(is_resource($this->resSocket)) {

$arrRead=array($this->resSocket);

$arrWrite=array();

/** @warning 以傳址方式傳遞 $arrRead,$arrWrite */
if(stream_select($arrRead,$arrWrite,$arrWrite,0)) {

$resConnection=stream_socket_accept($this->resSocket,0);

# ... 其他程式碼寫在此處
}
}
}
}
?>
To Top