php中主要的socket函數語法與使用實例詳解
在實際開發中,如果想要創建基於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_bindsocket_bind ( resource $socket , string $address [, int $port = 0 ] )
$socket 是必選參數,代表socket_create函數所建立的句柄
$address 是必選參數,代表要綁定的IP位址
#$port 是選用參數,代表要綁定的埠號,指定哪個埠用來監聽socket連接,當socket_create函數的第一個參數為AF_INET時,需要指定這個參數。
3.
socket_listensocket_listen ( resource $socket [, int $backlog = 0 ] )
##########################################################1 ##用,它有兩個參數,傳回布林值。 ######$socket 是必選參數,代表socket_create函數所建立的句柄(且已綁定了主機)######$backlog 是選用參數,表示佇列中等候處理的(允許積壓的)最大連接數。 ######4. ###socket_set_block######
socket_set_block ( resource $socket )
socket_write ( resource $socket , string $buffer [, int $length = 0 ] )
socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] )
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是否打开。
下面通过创建一个服务端和客户端的例子来说明这些函数的用法:
服务器端
<?php //确保在连接客户端时不会超时 set_time_limit(0); $ip = '127.0.0.1'; $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 "试图连接 '$ip' 端口 '$port'...\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 = ''; if(!socket_write($socket, $in, strlen($in))) { echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n"; }else { echo "发送到服务器信息成功!\n"; echo "发送的内容为:<font color='red'>$in</font> <br>"; } while($out = socket_read($socket, 8192)) { echo "接收服务器回传信息成功!\n"; echo "接受的内容为:",$out; } echo "关闭SOCKET...\n"; socket_close($socket); echo "关闭OK\n"; ?>
【相关教程推荐】
以上是php中主要的socket函數語法與使用實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。
