ネットワークプログラミングでは、サーバーはクライアントからの接続要求を受け入れることができる必要があります。 PHPは、 Socket_Accept()がサーバーリスニングと受信接続を実装するための重要な関数である基礎となるネットワーク通信を処理するための一連のソケット機能を提供します。この記事では、socket_accept()を使用してクライアント接続を受信し、例を介してそれらを使用する方法を示す方法を詳細に紹介します。
socket_accept()は、ソケットリスニングキューから接続を受信するPHPの関数です。基本的な構文は次のとおりです。
socket_accept(Socket $socket): Socket|false
パラメーター:
$ socket : socket_create()およびsocket_bind()によって作成およびバインドされたリスニングソケット。
返品値:
クライアントとの通信のために、成功したときに新しいソケットインスタンスを返します。
障害時にfalsを返します。
socket_accept()を使用する前に、通常、次の手順を完了する必要があります。
ソケットの作成: socket_create()
バインドアドレスとポート: socket_bind()
リスニングを開始: socket_listen()
接続の受信: socket_accept()
クライアントとのコミュニケーション: socket_read()およびsocket_write()
接続を閉じる: socket_close()
Socket_accept()を使用してクライアント接続を受信する方法を示す完全なSocket Serverの例を次に示します。
<?php
// アドレスとポートを設定します
$address = '0.0.0.0';
$port = 12345;
// 作成する socket
$serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($serverSocket === false) {
die("socket_create() 失敗: " . socket_strerror(socket_last_error()) . "\n");
}
// アドレスとポートをバインドします
if (!socket_bind($serverSocket, $address, $port)) {
die("socket_bind() 失敗: " . socket_strerror(socket_last_error($serverSocket)) . "\n");
}
// 接続を聞き始めます
if (!socket_listen($serverSocket)) {
die("socket_listen() 失敗: " . socket_strerror(socket_last_error($serverSocket)) . "\n");
}
echo "サーバーが開始されます,リスニング {$address}:{$port} ...\n";
// クライアント接続を受信します
$clientSocket = socket_accept($serverSocket);
if ($clientSocket === false) {
echo "socket_accept() 失敗: " . socket_strerror(socket_last_error($serverSocket)) . "\n";
} else {
// クライアントにウェルカムメッセージを送信します
$welcome = "Connectへようこそ m66.net サーバ\n";
socket_write($clientSocket, $welcome, strlen($welcome));
// クライアントデータをお読みください
$input = socket_read($clientSocket, 1024);
echo "クライアントメッセージを受け取りました: " . trim($input) . "\n";
// クライアントに応答します
$response = "あなたはそれを送った: " . $input;
socket_write($clientSocket, $response, strlen($response));
// クライアント接続を閉じます
socket_close($clientSocket);
}
// 关闭サーバ socket
socket_close($serverSocket);
?>
許可の問題:低いポート(80または443など)をリッスンする場合、管理者の権限が必要になる場合があります。
タイムアウト処理: socket_accept()はブロッキング関数です。非ブロッキングモードが必要な場合は、 socket_set_nonblock()を使用できます。
セキュリティ:悪意のある接続を防ぐために、生産環境に適切なエラー処理とロギングメカニズムを追加する必要があります。
マルチクライアントサポート:この例は、1つのクライアント接続のみを処理します。複数のクライアントを同時に処理する必要がある場合は、 PCNTL_FORK()またはマルチスレッド拡張機能を組み合わせることができます。
socket_accept()は、PHPネットワーク通信に不可欠なリンクであり、サーバーがリスニングキューからクライアント接続を抽出し、その後の処理を実行できるようにします。この記事の説明と例を通じて、基本的なソケットサーバーの構築プロセスをマスターし、 socket_accept()を使用して、クライアント接続の受信と相互作用機能を実現できるはずです。