目次
TCP/IP と UDP とは何ですか?
ソケットとは何ですか?
ソケット関連関数:
ケース: ソケット通信のデモンストレーション
サーバー側:
コードの詳細な説明

PHPソケット通信の略称

Jun 20, 2016 pm 12:33 PM

TCP/IP と UDP とは何ですか?

TCP/IP (伝送制御プロトコル/インターネット プロトコル) は、ワイド エリア ネットワーク (WAN) 用に設計された業界標準のプロトコル セットです。

UDP (User Data Protocol) は、TCP に相当するプロトコルです。これは、TCP/IP プロトコル スイートのメンバーです。

これらのプロトコルの関係を示す図は次のとおりです。

TCP/IP プロトコル スイートには、トランスポート層、ネットワーク層、およびリンク層が含まれます。これで、TCP/IP と UDP の関係がわかりました。

ソケットはどこですか?

図 1 では、Socket の影が見えませんが、それはどこにあるのでしょうか?写真を使ってわかりやすく話しましょう。

ソケットとは何ですか?

ソケットは、アプリケーション層と TCP/IP プロトコル スイートの間の通信のための中間ソフトウェア抽象化層であり、インターフェイスのセットです。設計モードでは、Socket は実際にはファサード モードであり、複雑な TCP/IP プロトコル ファミリを Socket インターフェイスの背後に隠し、ユーザーにとっては一連の単純なインターフェイスだけで、指定されたプロトコルを満たすように Socket がデータを編成できます。

仕組み

サーバー側から始めましょう。サーバーはまずソケットを初期化し、次にポートにバインドし、ポートをリッスンし、accept を呼び出してブロックし、クライアントが接続するのを待ちます。このとき、クライアントがSocketを初期化してからサーバーに接続すると、接続に成功するとクライアントとサーバー間の接続が確立されます。クライアントがデータ要求を送信し、サーバーが要求を受信して​​処理し、次に応答データをクライアントに送信し、クライアントがデータを読み取り、最後に接続を閉じて対話が終了します。

ソケット関連関数:

socket_accept() はソケット接続を受け入れます

socket_bind() はソケットを IP アドレスとポートにバインドします

socket_clear_error() ソケットエラーまたは最後のエラーコードをクリアします

socket_close() ソケットリソースを閉じる

socket_connect() ソケット接続を開始します

socket_create_listen () 開く指定されたポートでリッスンするソケット

socket_create_pair() 区別できないソケットのペアを配列に生成します

socket_create() ソケットを生成します。これはソケット データ構造を生成するのと同等です

socket_get_option() ソケット オプションを取得します

socket_getpeername() リモートの同様のホストの IP アドレスを取得します

socket_getsockname() ローカル ソケットの IP アドレスを取得します

socket_iovec_add () 新しいベクトルを分散/集合配列に追加します

socket_iovec_alloc() この関数は、送信、受信、読み取り、書き込みが可能な iovec データ構造を作成します

socket_iovec_delete()すでに割り当てられています iovec

socket_iovec_fetch() は、指定された iovec リソースのデータを返します

socket_iovec_free() は、iovec リソースを解放します

socket_iovec_set() は、iovec データの新しい値を設定します

socket_last_error() 現在のソケットの最後のエラー コードを取得します

socket_listen() 指定されたソケットからのすべての接続をリッスンします

socket_read() 指定された長さのデータを読み取ります

socket_readv() 分散/集約配列からデータを読み取ります。

socket_recv() ソケットからキャッシュへのデータを終了します。

socket_recvfrom() からデータを受け取ります。指定されたソケット。指定されていない場合、現在のソケットがデフォルトになります。

socket_recvmsg() iovec からメッセージを受信します

socket_select() 複数選択

socket_send() この関数はデータを送信します接続されたソケットに

socket_sendmsg() メッセージをソケットに送信します

socket_sendto() 指定されたアドレスのソケットにメッセージを送信します

socket_set_block() ソケットを次のように設定しますブロック モード

socket_set_nonblock() ソケット 非ブロック モードに設定します

socket_set_option() ソケット オプションを設定します

socket_shutdown() この関数を使用すると、読み取り、書き込み、または指定されたソケット

socket_strerror() 指定されたエラー番号の詳細エラーを返します

socket_write() データをソケット キャッシュに書き込みます

socket_writev() データを分散/集約配列に書き込みます

ケース: ソケット通信のデモンストレーション

サーバー側:

<?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);?>
ログイン後にコピー

このファイルを保存して実行します。 netstat -ano を実行してポートのステータスを確認します。私のポートは 1935

ポートは LISTENING、つまりリッスン中です。次に、クライアント プログラムを実行して接続するだけです。

クライアント:

<?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";?>
ログイン後にコピー

クライアントがサーバーに接続しているところまで、サーバーとクライアントを実行して情報を返します

コードの詳細な説明

// 设置一些基本的变量$host = "192.168.1.99";$port = 1234;// 设置超时时间set_time_limit(0);// 创建一个Socket$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not createsocket\n");//绑定Socket到端口$result = socket_bind($socket, $host, $port) or die("Could not bind tosocket\n");// 开始监听链接$result = socket_listen($socket, 3) or die("Could not set up socketlistener\n");// accept incoming connections// 另一个Socket来处理通信$spawn = socket_accept($socket) or die("Could not accept incomingconnection\n");// 获得客户端的输入$input = socket_read($spawn, 1024) or die("Could not read input\n");// 清空输入字符串$input = trim($input);//处理客户端输入并返回结果$output = strrev($input) . "\n";socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");// 关闭socketssocket_close($spawn);socket_close($socket);
ログイン後にコピー

以下は各ステップの詳細な説明です: 1. 最初のステップは、Socket が実行されているサーバーの IP アドレスとポートを保存するための 2 つの変数を確立することです。これは独自の値に設定できます。サーバーとポート (このポートは 1 ~ 65535 の数値にすることができます)。このポートが使用されていない場合は、サーバー側で set_time_out() 関数を使用できます。 PHP がクライアントの接続を待たないようにしてください。

// 超时时间set_time_limit(0);
ログイン後にコピー

3.在前面的基础上,现在该使用socket_creat()函数创建一个Socket了—这个函数返回一个Socket句柄,这个句柄将用在以后所有的函数中.

// 创建Socket$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
ログイン後にコピー

第一个参数”AF_INET”用来指定域名;第二个参数”SOCK_STREM”告诉函数将创建一个什么类型的Socket(在这个例子中是TCP类型)

因此,如果你想创建一个UDP Socket的话,你可以使用如下的代码:

// 创建 socket$socket = socket_create(AF_INET, SOCK_DGRAM, 0) or die("Could not create socket\n");
ログイン後にコピー

4.一旦创建了一个Socket句柄,下一步就是指定或者绑定它到指定的地址和端口.这可以通过socket_bind()函数来完成.

// 绑定 socket to 指定地址和端口$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
ログイン後にコピー

5.当Socket被创建好并绑定到一个端口后,就可以开始监听外部的连接了.PHP允许你由socket_listen()函数来开始一个监听,同时你可以指定一个数字(在这个例子中就是第二个参数:3)

// 开始监听连接$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");
ログイン後にコピー

6.到现在,你的服务器除了等待来自客户端的连接请求外基本上什么也没有做.一旦一个客户端的连接被收到,socket_accept()函数便开始起作用了,它接收连接请求并调用另一个子Socket来处理客户端–服务器间的信息.

//接受请求链接// 调用子socket 处理信息$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
ログイン後にコピー

这个子socket现在就可以被随后的客户端–服务器通信所用了.7.当一个连接被建立后,服务器就会等待客户端发送一些输入信息,这写信息可以由socket_read()函数来获得,并把它赋值给PHP的$input变量.

// 读取客户端输入$input = socket_read($spawn, 1024) or die("Could not read input\n");
ログイン後にコピー

socker_read的第而个参数用以指定读入的字节数,你可以通过它来限制从客户端获取数据的大小.

注意:socket_read函数会一直读取壳户端数据,直到遇见\n,\t或者\0字符.PHP脚本把这写字符看做是输入的结束符.

8.现在服务器必须处理这些由客户端发来是数据(在这个例子中的处理仅仅包含数据的输入和回传到客户端).这部分可以由socket_write()函数来完成(使得由通信socket发回一个数据流到客户端成为可能)

// 处理客户端输入并返回数据$output = strrev($input) . "\n";socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");
ログイン後にコピー

9.一旦输出被返回到客户端,父/子socket都应通过socket_close()函数来终止

// 关闭 socketssocket_close($spawn);socket_close($socket);
ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Laravelでフラッシュセッションデータを使用します Laravelでフラッシュセッションデータを使用します Mar 12, 2025 pm 05:08 PM

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelテストでの簡略化されたHTTP応答のモッキング Laravelテストでの簡略化されたHTTP応答のモッキング Mar 12, 2025 pm 05:09 PM

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 Mar 28, 2025 pm 05:12 PM

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

フレームワークセキュリティ機能:脆弱性から保護します。 フレームワークセキュリティ機能:脆弱性から保護します。 Mar 28, 2025 pm 05:11 PM

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

See all articles