現在の位置: ホーム> 最新記事一覧> socket_cmsg_spaceを使用して、socket_getsocknameと組み合わせてソケット情報を取得する

socket_cmsg_spaceを使用して、socket_getsocknameと組み合わせてソケット情報を取得する

gitbox 2025-05-28

PHPでは、 socket_getsocknamesocket_cmsg_spaceは、ソケットを使用してネットワークをプログラミングする際に、一般的に使用される2つの関数です。開発者は、特にネットワーク通信を処理するときに、ソケットに関する詳細情報を入手するのに役立ちます。この記事では、これら2つの機能を組み合わせてソケット情報を取得する方法を紹介します。

1。関数の紹介

socket_getSockName関数

Socket_GetSockName関数は、接続されたソケットに関連付けられたローカルアドレス情報を取得するために使用されます。これは、現在のホストとリモートホストの間の接続ステータスを取得するために非常に重要です。関数は次のように定義されています。

 int socket_getsockname ( int $socket , string &$address , int &$port )
  • $ socket :有効なソケットリソースです。

  • $アドレス:Socketのローカルアドレスを返します。

  • $ポート:ソケットのポート番号を返します。

socket_cmsg_space関数

Socket_CMSG_SPACE関数は、現在のメッセージ制御データ(CMSG)に必要なスペースを返すために使用されます。その目的は、制御メッセージのスペースを正しく割り当てるために、特定のプロトコルのメッセージ制御データのサイズを計算することです。

 int socket_cmsg_space ( int $level , int $type )
  • $レベル:プロトコルレイヤー、通常はsolcockedを指定します。

  • $タイプso_rcvbufなどのメッセージタイプを制御します。

2。例を使用してください

これらの2つの機能を組み合わせて使用​​する方法をよりよく理解するために、 Socket_GetSockNamesocket_cmsg_spaceを使用してソケット情報を取得する方法を示す簡単なPHPサンプルコードを以下に示します。

 <?php

// aを作成します TCP ソケット
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "ソケット创建失败: " . socket_strerror(socket_last_error()) . "\n";
    exit();
}

// 绑定ソケット
$address = '127.0.0.1';
$port = 8080;
if (socket_bind($socket, $address, $port) === false) {
    echo "ソケット绑定失败: " . socket_strerror(socket_last_error()) . "\n";
    exit();
}

// 获取ソケット的本地地址和端口
if (socket_getsockname($socket, $localAddress, $localPort) === false) {
    echo "获取ソケット信息失败: " . socket_strerror(socket_last_error()) . "\n";
} else {
    echo "ソケット本地地址: $localAddress\n";
    echo "ソケット本地端口: $localPort\n";
}

// コントロールメッセージスペースを取得します
$level = SOL_SOCKET;
$type = SO_RCVBUF;
$space = socket_cmsg_space($level, $type);
echo "メッセージスペースサイズを制御します: $space\n";

// 关闭ソケット
socket_close($socket);

?>

3。コード解析

  1. ソケットの作成:まず、 Socket_Createを介してTCPソケットを作成します。 AF_INETは、IPv4プロトコルを使用することを意味し、 Sock_StreamはStream Socketsを使用し、 SOL_TCPは輸送層プロトコルです。

  2. バウンドソケットSocket_Bindを使用して、ソケットを特定のローカルアドレスとポートにバインドします(この例では、アドレスは127.0.0.1 、ポートは8080です)。

  3. ソケット情報の取得socket_getsockname関数を介してソケットのローカルアドレスとポートを取得し、出力します。

  4. コントロールメッセージの計算スペースサイズsocket_cmsg_space必要なコントロールメッセージスペースを計算し、そのサイズを出力します。ここでは、 SO_RCVBUFを使用して、受信バッファのコントロールメッセージサイズを取得します。

  5. ソケットを閉じるsocket_close関数を使用してソケットを閉じます。

4。アプリケーションシナリオ

socket_getsocknamesocket_cmsg_spaceのこの組み合わせを使用すると、特に次のシナリオで、ネットワークプログラミングのソケットに関する詳細情報を柔軟に取得できます。

  • ネットワークデバッグ:ソケット接続のデバッグ、ローカルアドレスとポートの取得、および接続の問題のトラブルシューティングに役立つために使用できます。

  • データフロー制御:制御メッセージのスペースサイズを計算することにより、開発者はデータ送信の効率と安定性を確保するために、受信および送信バッファーを効果的に管理できます。

5。注意すべきこと

  • socket_getsocknameを使用する場合、ソケットが正常にバインドされていることを確認してください。そうしないと、関数がエラーを返します。

  • コントロールメッセージスペースを計算する場合、異なるプロトコルとコントロールメッセージタイプに応じて異なるスペースサイズが必要になる場合があるため、正しいレベルタイプのパラメーターを使用してください。