現在の位置: ホーム> 最新記事一覧> PHPのsocket_accept()関数を使用してシンプルなTCPサーバーを作成する方法は?

PHPのsocket_accept()関数を使用してシンプルなTCPサーバーを作成する方法は?

M66 2025-05-23

ネットワークプログラミングでは、PHPはWebアプリケーションの開発に使用されるだけでなく、TCPサーバーなどの低レベルのネットワーク通信プログラムを作成するためにも使用できます。 socket_accept()は、クライアント接続を受け入れるためのPHPの重要な機能の1つです。この記事では、シンプルなTCPサーバーを段階的に構築し、重要なポイントを説明します。

1。socket_accept()とは何ですか?

socket_accept()は、PHPソケット拡張機能の関数であり、サーバー上にリッスンして、確立されたソケットで接続要求を受信します。クライアントが接続を要求すると、 socket_accept()は、メインのリスニングソケットではなく、クライアントとの通信に使用される新しいソケットインスタンスを返します。

2。TCPサーバーを作成する手順

ステップ1:ソケットを作成します

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create() 失敗: " . socket_strerror(socket_last_error()) . "\n");
}

このコード行は、IPv4( AF_INET )のTCPソケット( SOCK_STREAM )を作成し、プロトコルタイプはTCP( SOL_TCP )です。

ステップ2:アドレスとポートをバインドします

if (!socket_bind($socket, '0.0.0.0', 12345)) {
    die("socket_bind() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}

このステップは、ソケットを12345などのローカルIPとポートに結合します。

ステップ3:接続を聞いてください

if (!socket_listen($socket, 5)) {
    die("socket_listen() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}

着信接続の聴取を開始します。5は、最大待機接続キューの長さを示します。

ステップ4:接続を受け入れ、リクエストを処理します

while (true) {
    echo "クライアント接続を待っています...\n";
    $clientSocket = socket_accept($socket);
    if ($clientSocket === false) {
        echo "socket_accept() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    $welcomeMsg = "ようこそ m66.net の PHP TCP サーバ!\n";
    socket_write($clientSocket, $welcomeMsg, strlen($welcomeMsg));

    // クライアント情報をお読みください
    $input = socket_read($clientSocket, 1024);
    echo "クライアントメッセージを受け取りました: " . $input;

    // クライアントに応答します
    $response = "あなたはそれを送った: " . trim($input) . "\n";
    socket_write($clientSocket, $response, strlen($response));

    // クライアント接続を閉じます
    socket_close($clientSocket);
}

上記のコードでは、サーバーはクライアントが接続できるように無限にループします。接続が確立されると、ウェルカムメッセージが送信され、クライアントの入力が読み取られ、そのまま返されます。

ステップ5:メインソケットを閉じます

上記のコードは無限のループサーバーですが、実際の使用で割り込みメカニズムまたは信号処理を追加する必要があります。サーバーをシャットダウンするコードは次のとおりです。

 socket_close($socket);

3。クライアント接続テスト

Telnetを使用して、このTCPサーバーをテストできます。

 telnet m66.net 12345

接続が成功した場合、サーバーによって返された歓迎メッセージが表示されます。

4。注意すべきこと

  • PHPのソケット拡張機能はデフォルトでは有効ではありません。PHP.iniソケットが有効になっていることを確認してください。

  • コマンドラインを使用してスクリプトを実行してください。 Web環境は、このような長い間接続されたサービスを実行するのに適していません。

  • 実際の展開中に、例外処理、ロギング、マルチプロセス処理などの機能を追加する必要があります。

結論

この記事を通して、PHP socket_accept()関数を使用してシンプルなTCPサーバーを作成する方法を学びました。 PHPはWebサービスに適した言語ではありませんが、基本的なニーズを満たすために必要なツールも提供します。この小さなサーバーの例は、PHPの強力な柔軟性を示しています。