ホームページ  >  記事  >  バックエンド開発  >  PHP での主なソケット関数の構文と使用例の詳細な説明

PHP での主なソケット関数の構文と使用例の詳細な説明

伊谢尔伦
伊谢尔伦オリジナル
2017-05-22 14:49:264211ブラウズ

実際の開発では、ソケットベースのアプリケーションを作成する場合、ソケットの操作方法を詳しく理解する必要があります。これらの操作方法を理解して使いこなすには、まず PHP のさまざまなソケット関数を理解する必要があります。 。前の章ではphpのソケットとは何なのかを詳しく紹介しました。 phpのsocket関数について紹介します。 PHP には多数のソケット関数があります。ここでは主なソケット関数をいくつか紹介します。

それらの構文形式のパラメータは次のとおりです:

1. socket_create

socket_create ( int $domain , int $type , int $protocol )

この関数はソケットを作成するために使用され、3 つのパラメータがあり、戻り値はハンドル (リソース) です。

$domain は、ソケットの作成時に使用される通信プロトコル ファミリを指定します。 オプションの値は次のとおりです:

AF_INET: IPv4 に基づくインターネット プロトコル

AF_INET6: IPv6 に基づくインターネット プロトコル

AF_UNIX: UNIX ローカル通信プロトコル

$type はソケット通信の対話タイプを指定します。そのオプションの値は次のとおりです:

SOCK_STREAM: シリアル化された信頼性の高い全二重の接続ベースのバイト ストリーム送信を提供し、TCP をサポートします

SOCK_DGRAM: データ パケット スタイルを提供します。 、コネクションレス、固定最大長、自動アドレス指定関数送信、UDP をサポート

SOCK_SEQPACKET: シリアル化された信頼性の高いデュアルチャネルの接続ベースのデータグラム送信を提供します

SOCK_RAW: 生のネットワーク アクセス プロトコルを提供し、特別なプロトコルのソケットを手動で構築できますタイプ、ICMP リクエスト (ping など) をサポート

SOCK_RDM: 信頼性の高いデータグラム送信を提供します。順序は保証できません

$protocol は、ソケットが使用する特定の送信プロトコル (ICMP、UDP、TCP など) を指定します。定数 SOL_UDP は対応しますUDP、定数 SOL_TCP は定数 TCP に対応します。

2. socket_bind

socket_bind ( resource $socket , string $address [, int $port = 0 ] )

この関数は、socket_create によって作成されたハンドルに IP アドレスとポートをバインドするために使用され、3 つのパラメーターを持ち、ブール値を返します。

$socket は必須パラメータであり、socket_create 関数によって作成されたハンドルを表します

$address は必須パラメータであり、バインドされる IP アドレスを表します

$port はオプションのパラメータで、バインドされるポート番号を表しますbound、ソケット接続をリッスンするために使用するポートを指定します。socket_create 関数の最初のパラメーターが AF_INET の場合、このパラメーターを指定する必要があります。

3. socket_listen

socket_listen ( resource $socket [, int $backlog = 0 ] )

この関数は、接続しようとしているソケット接続をリッスンするために使用され、ソケットの対話タイプが SOCK_STREAM または SOCK_SEQPACKET である場合にのみ使用できます。ブール値。

$socket は必須パラメータであり、socket_create 関数によって作成されたハンドルを表します (ホストにバインドされています)

$backlog はオプションのパラメータで、キュー内で処理を待機している接続の最大数を表します (許可されています)未処理になる)。

4.

socket_set_block

socket_set_block ( resource $socket )
この関数は、ソケット ハンドルをブロッキング モードに設定するために使用され、ブール値を返します。ノンブロッキング モードのソケットをブロッキング モードに変換できます。

ブロッキング モードのソケットで操作 (受信、送信、接続、受け入れなど) を実行すると、スクリプトはシグナルを受信するか操作が完了するまで実行を一時停止します。

$socket は必須パラメータであり、有効なソケット ハンドル (socket_create またはソケット_accept によって作成される) を表します。

ブロックモード

ノンブロッキングモードの違いを説明します: ノンブロッキングモードとは、関数操作が現在のスレッドをブロックせず、結果がすぐに得られなくなるまですぐに戻ることを意味します。ブロックとは、作業が完了するまで戻ることができないことを意味します。次のステップに進む前に、相手からの応答を得る必要があります。特にユーザー数が多い場合はノンブロッキングに設定する必要があります。ブロッキング モードの場合、2 つのクライアントが同時に接続されている場合、サーバーが 1 つのクライアントのリクエストを処理しているときに、他のクライアントのリクエストは前のクライアントの処理が完了した後でのみブロックされ、後のクライアントのリクエストが処理されます。に応じられます。

5.

socket_write

socket_write ( resource $socket , string $buffer [, int $length = 0 ] )
この関数は、指定されたサイズのバッファ データをソケットに書き込むために使用され、3 つのパラメーターがあり、書き込まれたデータのバイト数を返します。

$socket は必須パラメータであり、有効なソケット ハンドルを表します。

$buffer は必須パラメータであり、書き込まれる文字列データを指定します。

$length はオプションのパラメータで、ソケットに順番に書き込まれるデータのバイト数を指定します。その値が $buffer のバイト数よりも大きい場合、黙ってそのバイト数までインターセプトします。 $バッファ。

6.

socket_read

socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] )
この関数はソケットから指定されたバイト長のデータを読み取るために使用され、3 つのパラメーターを持ち、読み取った文字列データを返します。

$socket は必須パラメータであり、有効なソケット ハンドルを表します。

$length は必須パラメータであり、読み取られるバイトの長さを指定します。

$type はオプションのパラメータで、デフォルト値は PHP_BINARY_READ で、バイナリ データの安全な読み取りを意味します。もう 1 つのオプションの値は 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是否打开。

下面通过创建一个服务端和客户端的例子来说明这些函数的用法:

  1. 服务器端

<?php
//确保在连接客户端时不会超时
set_time_limit(0);
$ip = &#39;127.0.0.1&#39;;
$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 "试图连接 &#39;$ip&#39; 端口 &#39;$port&#39;...\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 = &#39;&#39;;
if(!socket_write($socket, $in, strlen($in))) {
    echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n";
}else {
    echo "发送到服务器信息成功!\n";
    echo "发送的内容为:<font color=&#39;red&#39;>$in</font> <br>";
}
while($out = socket_read($socket, 8192)) {
    echo "接收服务器回传信息成功!\n";
    echo "接受的内容为:",$out;
}
echo "关闭SOCKET...\n";
socket_close($socket);
echo "关闭OK\n";
?>

【相关教程推荐】

1. 《php.cn独孤九贱(4)-php视频教程

2.   php编程从入门到精通全套教程

以上がPHP での主なソケット関数の構文と使用例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。