在實際開發中,如果想要創建基於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中文網其他相關文章!