
fsockopenのソケットについて教えてください
▽PHP: fsockopen - Manual
http://php.net/manual/ja/function.fsockopen.php
>fsockopen("www.example.com", 80, $errno, $errstr, 30);
■質問
・ソケットて何ですか?
・この1行にどういう意味があるのでしょうか?
・事前に通信エラーを確認?
・GETとかPOSTとかでエラー判定してはいけないのでしょうか?
・「fsockopenを利用するメリット」と、「どういう時に利用するものなのか」教えてください
■質問背景
・APIコード見てたら、この処理が書かれていたので、調べてみたけど意味が理解できず、質問しました
No.1ベストアンサー
- 回答日時:
【Q1】
ソケットて何ですか?
【A1】
ソケットの定義
http://e-words.jp/w/E382BDE382B1E38383E38388.html
「ソケットには、通信を行うアプリケーションソフトがTCP/IPを扱うための仮想的なインターフェースという意味もある。」
こっちの意味です。
【Q2】
この1行にどういう意味があるのでしょうか?
【A2】
fsockopen関数を用いて、www.example.com に ポート80 で接続要求。
通常、HTTPで接続する場合はほとんどのサーバーがポート80を要求する。
接続を最大30秒まで待つ。
それより長引いたら接続失敗とし、FALSEを返す。
それに伴い、$errnoにエラーコード、$errstrにエラーメッセージが代入される。
接続成功したとき、リソース(ファイルポインタ)を返す。
リソースはそのPHPスクリプトが終了するか、fclose関数で意図的に解放するまで使い続けられる。
リソース型について
http://www.sakc.jp/blog/archives/8698
【Q3】
事前に通信エラーを確認?
GETとかPOSTとかでエラー判定してはいけないのでしょうか?
【A3】
意味を取り違えています。
A4参照。
【Q4】
「fsockopenを利用するメリット」と、「どういう時に利用するものなのか」教えてください
【A4】
そもそも$_GETや$_POSTで取得できるものは、「ブラウザ」(閲覧者)から送信された情報だけです。
[リクエスト]
ブラウザ → 自サーバー
<ブラウザ側>
アドレス入力欄にURLを入れて、Enterを押すこと。
そこからの実際のリクエスト処理(リクエストヘッダー送信)は全部ブラウザがやってくれる。
このときはパラメータはGETで送られる。
フォームを用いて、ユーザーを押させて送信させることもでき、そのときはform要素のmethod属性で指定した方法(GETやPOST)が使われる。
<自サーバー>
$_GETや$_POSTなどでクエリを受け取ることも出来る。
[レスポンス]
ブラウザ ← 自サーバー
<自サーバー>
普通にHTMLとして記述したものや、<?php?>内でechoするなどして出力したものをブラウザ側にHTMLとして返す。
<ブラウザ側>
HTMLを解析し、Webページとして表示することは全部ブラウザがやってくれる。
一方、fsockopen関数は、「接続先サーバー」との通信に使います。
[リクエスト]
自サーバー → 接続先サーバー
<自サーバー>
fsockopen関数を使う場合、実際のリクエスト処理(リクエストヘッダー)を全て自分で記述しなければならない。
リクエストヘッダーはfwrite関数で送信する(書き込む)。
<接続先サーバー>
$_GETや$_POSTなどでクエリを受け取ることも出来る。
[レスポンス]
自サーバー ← 接続先サーバー
<接続先サーバー>
普通にHTMLとして記述したものや、<?php?>内でechoするなどして出力したものをブラウザ側にHTMLとして返す。
<自サーバー>
fsockopen関数を使う場合、レスポンスはfgets関数を繰り返して取得する。
通常、feof関数がTrueを返すまで(ファイルポインタが末尾に達するまで)ループさせる。
ループが終わって、fgets関数で取得していった文字列を全て繋げると、レスポンスヘッダー(通信状態を記したもの)とレスポンスボディ(HTMLソース)が連続する2つの改行によって区切られていることが分かる。通常、これをexplode関数を使うなりして分割して使う。
【まとめ】
分かりやすく言えば、「ソケット通信をPHPスクリプトに記述する」ということは、「PHPスクリプトをあたかもブラウザのように動かす」、という言い方も出来るかもしれません。
【サンプルコード】
例: Yahoo!JAPANのトップページをfsockopen関数を用いて取得し、HTML特殊文字をエスケープして表示
http://ideone.com/kMxEIH
詳しい説明ありがとうございました。
>そもそも$_GETや$_POSTで取得できるものは、「ブラウザ」(閲覧者)から送信された情報だけです
・ものすごく勘違いしていました
・大変参考になりましたー
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
VC++でのソケット通信について
-
Socket通信の0バイト受信について
-
ソケットプログラミングについて
-
ftpクライアントでの接続後の、...
-
ポート番号0について
-
UDP通信する時に、相手にどうや...
-
ソケット通信
-
Macターミナルで実行中のプログ...
-
タスクマネージャーのプロセス...
-
取ってこれないメモリのはずのm...
-
家電製品の電力周波数を変える機械
-
非同期プログラミングは必ずマ...
-
パソコンの演算速度について
-
win10で、正確な待ち時間の作り方
-
COMポートの同時オープン同時読...
-
エクセルが勝手に立ち上がる
-
sleep()関数について
-
VBAの配列サイズとメモリに関して
-
OSPFでプロセスを分ける意義に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信におけるbind関数について
-
ソケットのクローズについて
-
エクセル VBA でのCOMポート...
-
Winsockで接続待ちタイムアウト...
-
Socket通信の0バイト受信について
-
ソケットのrecvの戻り値が0
-
UDP通信する時に、相手にどうや...
-
VB6のwinsockでconnectできない
-
ソケットでクライアントのipア...
-
Connectエラーが出てしまう・・...
-
UdpClient 送信元のIPアドレ...
-
ソケット通信 同じポート番号...
-
recv関数でフリーズしてしまう
-
ソケットを用いた1対多通信につ...
-
VB6‥ソケットについて
-
closeされたsocketへの動作につ...
-
ソケット通信
-
ネットワークプログラミングに...
-
vbでの232c接続プログラムについて
おすすめ情報