它們的語法格式參數如下:
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時可
用,它有兩個參數,返回布爾值。
$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是否打開。
下面通過創建一個服務端和客戶端的例子來說明這些函數的用法:
服務器端
<?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. 客戶端
<?phperror_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";?>
【相關教程推薦】
1. 《VeVb.com獨孤九賤(4)-php視頻教程》
2. php編程從入門到精通全套教程
以上就是php中主要的socket函數語法和使用實例詳解的詳細內容,更多請關注 其它相關文章!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答