首頁 > 後端開發 > php教程 > php中主要的socket函數語法與使用實例詳解

php中主要的socket函數語法與使用實例詳解

伊谢尔伦
發布: 2023-03-07 20:26:01
原創
4252 人瀏覽過

在實際開發中,如果想要創建基於socket的應用程序,就需要詳細了解socket的操作方法,要是像了解並熟練使用這些操作方法,就需要先了解php中的各種socket函數。在上一章我們詳細介紹了php中的socket是什麼?這裡就介紹一下php中的socket函數。 socket函數在php中有幾十個之多,這裡列舉一些主要的socket函數來介紹一下。

它們的語法格式參數如下:

1. socket_create

socket_create ( int $domain , int $type , int $protocol )
登入後複製

此函數用於建立一個socket,它有三個參數,回傳值是一個句柄(資源)。

$domain 指定在建立socket時使用的通訊協定族,其可選的值為:

AF_INET: 基於IPv4的Internet協定

#AF_INET6:基於IPv6的Internet協定

AF_UNIX:UNIX本地通訊協定

##$type 指定socket通訊的互動類型,其可選的值為:


##SOCK_STREAM:提供序列化的、可靠的、全雙工的、基於連接的字節流傳輸,支援TCP

SOCK_DGRAM:提供資料報式的、無連接的、固定最大長度的、自動尋址功能的傳輸,支援UDP

SOCK_SEQPACKET:提供序列化的、可靠的、雙通道的、基於連接的資料封包傳輸

SOCK_RAW:提供原始的網路存取協議,可手動建構特殊協議類型的套接字,支援ICMP請求(如ping)

SOCK_RDM:提供可靠的資料封包傳輸,無法保證順序

$protocol 指定socket使用哪種具體的傳輸協議,包括ICMP、UDP、TCP,常數SOL_UDP對應UDP,常數SOL_TCP對應常數TCP。

2. 

socket_bind

socket_bind ( resource $socket , string $address [, int $port = 0 ] )
登入後複製
此函數用於將IP位址和連接埠綁定到socket_create所建立的句柄中,有三個參數,傳回布林值。

$socket 是必選參數,代表socket_create函數所建立的句柄


$address 是必選參數,代表要綁定的IP位址


#$port 是選用參數,代表要綁定的埠號,指定哪個埠用來監聽socket連接,當socket_create函數的第一個參數為AF_INET時,需要指定這個參數。

3. 

socket_listen 

socket_listen ( resource $socket [, int $backlog = 0 ] )
登入後複製
此函數用於監聽即將接入的socket連接,僅當socket的交互類型為SOCK_STREAM或SOCK_SEQPACKET時可




##########################################################1 ##用,它有兩個參數,傳回布林值。 ######$socket  是必選參數,代表socket_create函數所建立的句柄(且已綁定了主機)######$backlog 是選用參數,表示佇列中等候處理的(允許積壓的)最大連接數。 ######4. ###socket_set_block######
socket_set_block ( resource $socket )
登入後複製
###此函數用於將socket句柄設定為阻塞模式,只有一個必選參數,傳回布林值。它可以將非阻塞模式的socket轉換為阻塞模式。 ######當在一個阻塞模式的socket中執行某種操作(receive、send、connect、accept等)時,腳本將暫停執行,直到它收到一個訊號或它完成了該操作。 ######$socket 是必選參數,代表一個有效的socket句柄(被socket_create或socket_accept建立的)。 ######說明一下###阻塞模式###和###非阻塞模式###的差異:######非阻塞是指函數運算在無法立刻得到結果之前,不會阻塞當前的線程,而會立即返回。而阻塞是指乾不完就不准回來,必須得到對方的回應後才能繼續下一步。特別是當使用者比較多時,設定成非阻塞是必要的。如果是阻塞模式,若兩個客戶端同時連線上,伺服器端在處理一個客戶端請求時,另外一個客戶端的請求就會被阻塞,只有等到前一個客戶端的事情處理完了之後,後一個客戶端的請求才會被響應。 ######5. ###socket_write######
socket_write ( resource $socket , string $buffer [, int $length = 0 ] )
登入後複製
###此函數用於寫入在socket中指定大小的緩衝數據,有三個參數,傳回寫入的資料的位元組數。 ######$socket 是必選參數,代表一個有效的socket句柄。 #########$buffer 是必選參數,指定要寫入的字串資料。 #########$length 是可選參數,指定輪流寫入socket中的資料的位元組數,如果它的值大於$buffer的位元組數,它會靜默地截取至$buffer的位元組數長度。 ######6. ###socket_read######
socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] )
登入後複製
###此函數用於從socket讀取指定位元組長度的數據,有三個參數,傳回讀取的字串資料。 ######$socket 是必選參數,代表一個有效的socket句柄。 ###$length 是必選參數,指定讀取的位元組長度。 ######$type 是可選參數,預設值為PHP_BINARY_READ,即安全讀取二進位資料;另一個可選的值為PHP_NORMAL_READ,表示當遇到 \r 或 \n 時,停止讀取。 ######7. ###pfsockopen #######
pfsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )
登入後複製

该函数用于实现一个持久的socket连接,即长连接,返回一个句柄。它与 fsockopen 的区别在于,pfsockopen 建立的连接,在脚本执行完毕后,并不会断开。

8. socket_set_option

socket_set_option ( resource$socket , int$level , int$optname , mixed$optval )
登入後複製

该函数用于设置socket的控制选项,有四个参数,返回布尔值。

$socket 是必选参数,代表一个有效的socket句柄。

$level 是必选参数,指定option起作用的协议级别,一般取常量 SOL_SOCKET。

$optname 是必选参数,指定要控制的选项名称。

$optval 是必选参数,指定选项的值。

9. socket_last_error

socket_last_error ([ resource$socket ] )
登入後複製

该函数用于获取任何socket函数产生的最后错误代号,返回值为整型。

10. socket_strerror

socket_strerror ( int $errno )
登入後複製

该函数用于获取错误代号代表的错误描述,返回值为字符串。

以上所有的函数都是PHP中关于socket的,使用这些函数,你必须把你的socket打开,如果你没有打开,请编辑你的php.ini文件,去掉下面这行前面的注释:

extension=php_sockets.dll
登入後複製

如果你不知道你的socket是否打开,那么你可以使用phpinfo()函数来确定socket是否打开。

下面通过创建一个服务端和客户端的例子来说明这些函数的用法:

  1. 服务器端

<?php
//确保在连接客户端时不会超时
set_time_limit(0);
$ip = &#39;127.0.0.1&#39;;
$port = 1935;
/*
 +-------------------------------
 *    @socket通信整个过程
 +-------------------------------
 *    @socket_create
 *    @socket_bind
 *    @socket_listen
 *    @socket_accept
 *    @socket_read
 *    @socket_write
 *    @socket_close
 +--------------------------------
 */
/*----------------    以下操作都是手册上的    -------------------*/
if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) {
    echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n";
}
if(($ret = socket_bind($sock,$ip,$port)) < 0) {
    echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n";
}
if(($ret = socket_listen($sock,4)) < 0) {
    echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n";
}
$count = 0;
do {
    if (($msgsock = socket_accept($sock)) < 0) {
        echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
        break;
    } else {
        
        //发到客户端
        $msg ="测试成功!\n";
        socket_write($msgsock, $msg, strlen($msg));
        
        echo "测试成功了啊\n";
        $buf = socket_read($msgsock,8192);
        
        
        $talkback = "收到的信息:$buf\n";
        echo $talkback;
        
        if(++$count >= 5){
            break;
        };
        
    
    }
    //echo $buf;
    socket_close($msgsock);
} while (true);
socket_close($sock);
?>
登入後複製

2. 客户端

<?php
error_reporting(E_ALL);
set_time_limit(0);
echo "<h2>TCP/IP Connection</h2>\n";
$port = 1935;
$ip = "127.0.0.1";
/*
 +-------------------------------
 *    @socket连接整个过程
 +-------------------------------
 *    @socket_create
 *    @socket_connect
 *    @socket_write
 *    @socket_read
 *    @socket_close
 +--------------------------------
 */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
    echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
}else {
    echo "OK.\n";
}
echo "试图连接 &#39;$ip&#39; 端口 &#39;$port&#39;...\n";
$result = socket_connect($socket, $ip, $port);
if ($result < 0) {
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
}else {
    echo "连接OK\n";
}
$in = "Ho\r\n";
$in .= "first blood\r\n";
$out = &#39;&#39;;
if(!socket_write($socket, $in, strlen($in))) {
    echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n";
}else {
    echo "发送到服务器信息成功!\n";
    echo "发送的内容为:<font color=&#39;red&#39;>$in</font> <br>";
}
while($out = socket_read($socket, 8192)) {
    echo "接收服务器回传信息成功!\n";
    echo "接受的内容为:",$out;
}
echo "关闭SOCKET...\n";
socket_close($socket);
echo "关闭OK\n";
?>
登入後複製

【相关教程推荐】

1. 《php.cn独孤九贱(4)-php视频教程

2.   php编程从入门到精通全套教程

以上是php中主要的socket函數語法與使用實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板