国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > PHP > 正文

php中主要的socket函數(shù)語(yǔ)法和使用實(shí)例詳解

2020-03-22 18:58:46
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
在實(shí)際開(kāi)發(fā)中,如果想要?jiǎng)?chuàng)建基于socket的html' target='_blank'>應(yīng)用程序,就需要詳細(xì)了解socket的操作方法,要是像了解并熟練使用這些操作方法,就需要先了解php中的各種socket函數(shù)。在上一章節(jié)中我們?cè)敿?xì)介紹了php中的socket是什么?這里就介紹一下php中的socket函數(shù)。socket函數(shù)在php中有幾十個(gè)之多,這里列舉一些主要的socket函數(shù)來(lái)介紹一下。

它們的語(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ù)的用法:

  1. 服務(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)系我們修改或刪除,多謝。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 龙海市| 手游| 扬州市| 康平县| 阿城市| 诸暨市| 财经| 龙井市| 旬阳县| 蒙自县| 三原县| 天长市| 黑水县| 攀枝花市| 无锡市| 武宣县| 普兰县| 宜川县| 龙里县| 怀宁县| 延川县| 崇义县| 陈巴尔虎旗| 淮阳县| 张北县| 五华县| 仁怀市| 南溪县| 太湖县| 东宁县| 依安县| 濮阳市| 张家界市| 德令哈市| 阿鲁科尔沁旗| 永平县| 孟津县| 镇巴县| 乌鲁木齐市| 天峻县| 佛教|