ホームページ  >  記事  >  バックエンド開発  >  PHP でのソケットの使用: ニュースグループから記事を取得する

PHP でのソケットの使用: ニュースグループから記事を取得する

高洛峰
高洛峰オリジナル
2016-12-01 15:10:201093ブラウズ

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 ();

eLSE {


"接続されました。 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 を試行しています...

my.news.host に接続しています

エスケープ文字は '^]' です。
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 .

コマンドを受信しました。代替.test を実行すると、サーバーは「211 232 222996 223235 alt.test」を返します。211 は RFC で定義されているリターン コードであり、コマンドが正常に実行されたことを示します。戻り情報には、現在 232 件の記事があり、最も古い記事番号が 222996、最新の記事番号が 223235 であることも指摘されています。 222996+232 は 223235 に等しくないことがわかります。欠落している 7 つの記事は、正当な著者によってキャンセルされたため (これは可能かつ簡単です)、またはスパム記事だったために、何らかの理由でサーバーから削除されました。



注意すべき点として、サーバーによっては、パブリック サーバーかプライベート サーバーかに応じて、ニュース グループを選択する前に認証が必要になる場合があります。また、サーバーは誰でも記事を読むことを許可していますが、記事を公開するには認証が必要である可能性があります。


//$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);

?>


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。