它們的語(yǔ)法格式參數(shù)如下:
1. socket_create
socket_create ( int $domain , int $type , int $protocol )
此函數(shù)用于創(chuàng)建一個(gè)socket,它有三個(gè)參數(shù),返回值是一個(gè)句柄(資源)。
$domain 指定創(chuàng)建socket時(shí)使用的通信協(xié)議族,其可選的值為:
AF_INET: 基于IPv4的Internet協(xié)議
AF_INET6:基于IPv6的Internet協(xié)議
AF_UNIX:UNIX本地通信協(xié)議
$type 指定socket通信的交互類(lèi)型,其可選的值為:
SOCK_STREAM:提供序列化的、可靠的、全雙工的、基于連接的字節(jié)流傳輸,支持TCP
SOCK_DGRAM:提供數(shù)據(jù)報(bào)式的、無(wú)連接的、固定最大長(zhǎng)度的、自動(dòng)尋址功能的傳輸,支持UDP
SOCK_SEQPACKET:提供序列化的、可靠的、雙通道的、基于連接的數(shù)據(jù)報(bào)傳輸
SOCK_RAW:提供原始的網(wǎng)絡(luò)訪問(wèn)協(xié)議,可手工構(gòu)建特殊協(xié)議類(lèi)型的套接字,支持ICMP請(qǐng)求(如 ping)
SOCK_RDM:提供可靠的數(shù)據(jù)報(bào)傳輸,無(wú)法保證順序
$protocol 指定socket使用哪種具體的傳輸協(xié)議,包括ICMP、UDP、TCP,常量SOL_UDP對(duì)應(yīng)UDP,常量SOL_TCP對(duì)應(yīng)常量TCP。
2. socket_bind
socket_bind ( resource $socket , string $address [, int $port = 0 ] )
此函數(shù)用于將IP地址和端口綁定到socket_create創(chuàng)建的句柄中,有三個(gè)參數(shù),返回布爾值。
$socket 是必選參數(shù),代表socket_create函數(shù)創(chuàng)建的句柄
$address 是必選參數(shù),代表要綁定的IP地址
$port 是可選參數(shù),代表要綁定的端口號(hào),指定哪個(gè)端口用來(lái)監(jiān)聽(tīng)socket連接,當(dāng)socket_create函數(shù)的第一個(gè)參數(shù)為AF_INET時(shí),需要指定這個(gè)參數(shù)。
3. socket_listen
socket_listen ( resource $socket [, int $backlog = 0 ] )
該函數(shù)用于監(jiān)聽(tīng)即將接入的socket連接,僅當(dāng)socket的交互類(lèi)型為SOCK_STREAM或SOCK_SEQPACKET時(shí)可
用,它有兩個(gè)參數(shù),返回布爾值。
$socket 是必選參數(shù),代表socket_create函數(shù)創(chuàng)建的句柄(且已綁定了主機(jī))
$backlog 是可選參數(shù),表示隊(duì)列中等候處理的(允許積壓的)最大連接數(shù)。
4. socket_set_block
socket_set_block ( resource $socket )
該函數(shù)用于將socket句柄設(shè)置為阻塞模式,只有一個(gè)必選參數(shù),返回布爾值。它可以將非阻塞模式的socket轉(zhuǎn)換為阻塞模式。
當(dāng)在一個(gè)阻塞模式的socket中執(zhí)行某種操作(receive、send、connect、accept等)時(shí),腳本將暫停執(zhí)行,直到它收到一個(gè)信號(hào)或它完成了該操作。
$socket 是必選參數(shù),代表一個(gè)有效的socket句柄(被socket_create或socket_accept創(chuàng)建的)。
說(shuō)明一下阻塞模式和非阻塞模式的區(qū)別:
非阻塞是指函數(shù)操作在不能立刻得到結(jié)果之前,不會(huì)阻塞當(dāng)前的線程,而會(huì)立即返回。而阻塞是指干不完就不準(zhǔn)回來(lái),必須得到對(duì)方的回應(yīng)后才能繼續(xù)下一步操作。特別是當(dāng)用戶(hù)比較多時(shí),設(shè)置成非阻塞是很必要的。如果是阻塞模式,若兩個(gè)客戶(hù)端同時(shí)連接上,服務(wù)器端在處理一個(gè)客戶(hù)端請(qǐng)求時(shí),另外一個(gè)客戶(hù)端的請(qǐng)求就會(huì)被阻塞,只有等到前一個(gè)客戶(hù)端的事情處理完了之后,后一個(gè)客戶(hù)端的請(qǐng)求才會(huì)被響應(yīng)。
5. socket_write
socket_write ( resource $socket , string $buffer [, int $length = 0 ] )
該函數(shù)用于向socket中寫(xiě)入指定大小的緩沖數(shù)據(jù),有三個(gè)參數(shù),返回寫(xiě)入的數(shù)據(jù)的字節(jié)數(shù)。
$socket 是必選參數(shù),代表一個(gè)有效的socket句柄。
$buffer 是必選參數(shù),指定要寫(xiě)入的字符串數(shù)據(jù)。
$length 是可選參數(shù),指定輪流寫(xiě)入socket中的數(shù)據(jù)的字節(jié)數(shù),如果它的值大于$buffer的字節(jié)數(shù),它會(huì)靜默地截取至$buffer的字節(jié)數(shù)長(zhǎng)度。
6. socket_read
socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] )
該函數(shù)用于從socket中讀取指定字節(jié)長(zhǎng)度的數(shù)據(jù),有三個(gè)參數(shù),返回讀取的字符串?dāng)?shù)據(jù)。
$socket 是必選參數(shù),代表一個(gè)有效的socket句柄。
$length 是必選參數(shù),指定讀取的字節(jié)長(zhǎng)度。
$type 是可選參數(shù),默認(rèn)值為PHP_BINARY_READ,即安全讀取二進(jìn)制數(shù)據(jù);另一個(gè)可選的值為PHP_NORMAL_READ,表示當(dāng)遇到 /r 或 /n 時(shí),停止讀取。
7. pfsockopen
pfsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )
該函數(shù)用于實(shí)現(xiàn)一個(gè)持久的socket連接,即長(zhǎng)連接,返回一個(gè)句柄。它與 fsockopen 的區(qū)別在于,pfsockopen 建立的連接,在腳本執(zhí)行完畢后,并不會(huì)斷開(kāi)。
8. socket_set_option
socket_set_option ( resource$socket , int$level , int$optname , mixed$optval )
該函數(shù)用于設(shè)置socket的控制選項(xiàng),有四個(gè)參數(shù),返回布爾值。
$socket 是必選參數(shù),代表一個(gè)有效的socket句柄。
$level 是必選參數(shù),指定option起作用的協(xié)議級(jí)別,一般取常量 SOL_SOCKET。
$optname 是必選參數(shù),指定要控制的選項(xiàng)名稱(chēng)。
$optval 是必選參數(shù),指定選項(xiàng)的值。
9. socket_last_error
socket_last_error ([ resource$socket ] )
該函數(shù)用于獲取任何socket函數(shù)產(chǎn)生的最后錯(cuò)誤代號(hào),返回值為整型。
10. socket_strerror
socket_strerror ( int $errno )
該函數(shù)用于獲取錯(cuò)誤代號(hào)代表的錯(cuò)誤描述,返回值為字符串。
以上所有的函數(shù)都是PHP中關(guān)于socket的,使用這些函數(shù),你必須把你的socket打開(kāi),如果你沒(méi)有打開(kāi),請(qǐng)編輯你的php.ini文件,去掉下面這行前面的注釋:
extension=php_sockets.dll
如果你不知道你的socket是否打開(kāi),那么你可以使用phpinfo()函數(shù)來(lái)確定socket是否打開(kāi)。
下面通過(guò)創(chuàng)建一個(gè)服務(wù)端和客戶(hù)端的例子來(lái)說(shuō)明這些函數(shù)的用法:
服務(wù)器端
<?php//確保在連接客戶(hù)端時(shí)不會(huì)超時(shí)set_time_limit(0);$ip = '127.0.0.1';$port = 1935;/* +------------------------------- * @socket通信整個(gè)過(guò)程 +------------------------------- * @socket_create * @socket_bind * @socket_listen * @socket_accept * @socket_read * @socket_write * @socket_close +-------------------------------- *//*---------------- 以下操作都是手冊(cè)上的 -------------------*/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 { //發(fā)到客戶(hù)端 $msg ="測(cè)試成功!/n"; socket_write($msgsock, $msg, strlen($msg)); echo "測(cè)試成功了啊/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. 客戶(hù)端
<?phperror_reporting(E_ALL);set_time_limit(0);echo "<h2>TCP/IP Connection</h2>/n";$port = 1935;$ip = "127.0.0.1";/* +------------------------------- * @socket連接整個(gè)過(guò)程 +------------------------------- * @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 "發(fā)送到服務(wù)器信息成功!/n"; echo "發(fā)送的內(nèi)容為:<font color='red'>$in</font> <br>";}while($out = socket_read($socket, 8192)) { echo "接收服務(wù)器回傳信息成功!/n"; echo "接受的內(nèi)容為:",$out;}echo "關(guān)閉SOCKET.../n";socket_close($socket);echo "關(guān)閉OK/n";?>
【相關(guān)教程推薦】
1. 《VeVb.com獨(dú)孤九賤(4)-php視頻教程》
2. php編程從入門(mén)到精通全套教程
以上就是php中主要的socket函數(shù)語(yǔ)法和使用實(shí)例詳解的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注 其它相關(guān)文章!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選