PHP はリモートまたはローカルホストでソケットポートを開くことができます。この記事は、Socket を使用する小さな例です。Usenet ニュース グループ サーバーに接続し、サーバーと通信し、ニュース グループからいくつかの記事をダウンロードします。
phpでソケットを開く
ソケットを開くにはfsockopen()を使用します。この関数はphp3とphp4の両方で使用できます。関数の宣言は次のようになります:
int fsockopen (string hostname, int port _
[, int errno [, string errstr [, double timeout]]])
この関数は、ホスト hostname に接続されているポートを開きます。 TCP接続。 hostname には、有効なドメイン名または IP アドレスを指定できます。 udp 接続の場合は、プロトコルを指定する必要があります: udp://hostname。UNIX ドメインの場合、ホスト名はソケットへのパスを使用します。この場合、ポートは 0 に設定する必要があります。オプションの timeout パラメータは、ソケットを開くまでの待機時間を秒単位で設定するために使用されます。
ネットワーク ニュース転送プロトコル
ニュースグループ サーバーにアクセスするには、NNTP (Network News Transfer Protocol) と呼ばれるプロトコルが必要です。このドキュメントでは、NNTP サーバーへの接続方法、サーバーとの通信方法、およびこれらのタスクを実行するためのさまざまなコマンドについて説明します。
接続
NNTP サーバーに接続するには、そのホスト名 (または IP アドレス) とリッスンしているポートを知っている必要があります。接続試行の失敗によるプログラムのハングを回避するには、タイムアウト パラメータを使用する必要があります。
$cfgServer $cfg
// タイムアウトなし usenet_handle = fsockopen($cfgServer, $cfgPort)
' usenet_handle) {O oo "接続に失敗しました。n"
exit ();
"接続されました。 n";
$ TMP = FGETS ($ Usenet_handle, 1024);
}
& gt;
とサーバーダイアログ
サーバーに接続したので、前に開いたソケットを介してサーバーと通信できます。たとえば、特定のニュース グループから最新の 10 件の記事を取得したいとします。 RFC977 は、最初のステップは、GROUP コマンドを使用して正しいニュース グループを選択することであると指摘しています:
GROUP ggg
パラメータ ggg は、選択されるニュース グループの名前 (たとえば、「net.news」) です。必須。利用可能なニュースグループのリストは、LIST コマンドを使用して取得できます。ニュースグループを選択するコマンドが成功すると、グループ内の最初と最後の記事の記事番号と、グループ内の記事の数が返されます。
例を示します:
chrome:~$ telnet my.news.host 119
aa.bb.cc.dd を試行しています...
エスケープ文字は '^]' です。
200 my.news.host InterNetNews NNRP サーバー INN 2.2.2 13-Dec-1999 準備完了 (投稿OK)
GROUP alt.test
211 232 222996 223235 alt.test
quit
205 .
注意すべき点として、サーバーによっては、パブリック サーバーかプライベート サーバーかに応じて、ニュース グループを選択する前に認証が必要になる場合があります。また、サーバーは誰でも記事を読むことを許可していますが、記事を公開するには認証が必要である可能性があります。
//$cfgUser = "xxxxxx";
//$cfgPasswd = "yyyyyy";
$cfgNewsGroup = "alt.php";
//プライベートサーバーでは識別が必要です
if($cfgUser) {
fputs($usenet_handle, "AUTHINFO USER ".$cfgUser."n");
$tmp = fgets($usenet_handle, 1024);
fputs($usenet_handle, "AUTHINFO PASS ".$cfgPasswd."n");
$tmp = fgets($usenet_handle, 1024);
// エラーを確認する
if($tmp != "281 Okrn") {
echo "502 認証エラー";
exit();
}
}
//ニュースグループを選択
fput($usenet_handle, "GROUP ".$cfgNewsGroup."n");
$tmp = fgets($usenet_handle, 1024);
if($tmp == "commandrn には 480 認証が必要です") {
echo $tmp;
exit();
}
$info = split(" ", $tmp);
$first= $info[2];
$last = $info[3];
printf("最初 : %sn", $first);
printf("Last : %lastn", $last);
?>