- PR -

C言語でHEAD情報の取得

1
投稿者投稿内容
サハラ
会議室デビュー日: 2005/07/05
投稿数: 4
投稿日時: 2005-07-05 12:55
初めて投稿させていただきます、サハラと申します

現在C言語にてHEADの情報(Last-Modify)を取得しようとしています
色々調べてみたのですが、上手く情報がみつからず困っております
(情報収集が下手なだけかもしれませんが)
こういうのはphpとかの方が楽なのかもしれませんが
今回はC言語でやってみたいと思っております

こういった場合どういう風にプログラムを組めばいいのか
よくわかっておりません、申し訳ないです
自分の知識不足なのですが
皆様のお知恵を拝借できれば幸いかと思います
よろしくお願いします

がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-07-05 13:41
どもです。がると申します。
んっと…とりあえず状況が見えないので、もうちょっと詳細な
状況説明が必要なのではないかなぁと。
まず
引用:

現在C言語にてHEADの情報(Last-Modify)を取得しようとしています


と在りますが。
可能性としてはHTTPであろうと推測はできるのですが、その場合
C言語のプログラムは「どこからのリクエストを受けて何を返す」
プログラムなんでしょうか?
Last-Modified ( Last-Modify ではないです )を受け取ると仮定した
場合、それは高い確立でクライアントサイド(ブラウザとかそーゆー位置)
になります。
一方で「PHPがどうの」というお話を基準に考えると、つぎは
「If-Modified-Since」関連のお話の可能性が出てきます。

とりあえず、プログラム以前の設計の部分が非常に不明なので、
もう少し、他プログラムとのやり取りの部分とかも含めて詳細に
書いてもらえると回答の使用もあるかとおもうのですがどうでしょうか?
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2005-07-05 13:43
Windowsでしたら「Winsock」、UNIX系でしたら「ソケット」をキーワードにしてgoogleなどで情報を漁ってみてください。あと、「RFC 2616」です。
サハラ
会議室デビュー日: 2005/07/05
投稿数: 4
投稿日時: 2005-07-05 14:17
>がるがるさま
すいません、説明不足でした、申し訳ありません
HTTPです
現在の状況をご説明いたしますと、簡素な、いわゆるアンテナと呼ばれる
ものを作ろうとしています。まずは対象のサイトとその時の日時を登録して、プログラム起動時に登録時の日時とそのときの対象サイトの更新日時を比較して、もし変更があれば更新日時を登録時の日時と入れ替えて、変更のあった旨を伝えるメッセージを表示するという
プログラムを作りたいと思っています。
HEADの更新日時の情報で、比較してあげればいいのかと思い調べて
いたのですが、中々よい方法がわからなくて、こちらに投稿させて
いただきました。
(思いつく限り詳しく書いたつもりですが、もし足らなければすいません


>スフレさま
ありがとうございます、それをキーワードにして調べて見ます
ちなみにUNIX系です
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-07-05 15:07
どもです。がるです。

引用:

現在の状況をご説明いたしますと、簡素な、いわゆるアンテナと呼ばれる
ものを作ろうとしています。


なるほど。それでおおむねは状況を理解しました。
ちぃと長くなりますがご容赦を。

まず設計を大まかなところから細かいところに落とし込んで
行きたいと思います。
アンテナですので、プログラムへのキック(起動の条件)はcronあたりを
想定してみましょう。
大雑把には、こんなソースコードになるかと思われます。
コード:
/* 現在時間の取得 */

/* 各「アンテナ対象」に対するloop */
while() {
  /* ターゲットHTTPサーバへリクエストを発行 */

  /* Last-Modifiedの取り出しと比較 */

  if ( 更新されている ) {
    /* 更新処理 */
  }
}


で、ポイントは「Last-Modifiedの取り出しと比較」かと。
基本的には「TCPでソケット通信をしてそのやり取りを分析」と
なります。

まずソケットをつないで先方の80番port(とは限らないけどまぁ大抵は)
と接続をします。
Last-Modifiedを取り出すためには、最低で

HEAD ファイルPath HTTP/1.0 [CRLF]
[CRLF]

というリクエストが必要です。
このリクエストの戻りとして、例えば

Date: Tue, 05 Jul 2005 04:32:50 GMT
Server: Apache/x.xx.xx (Unix)
Last-Modified: Thu, 18 Dec 2003 11:25:51 GMT
ETag: "a3b5e-ebb-3fe18ebf"
Accept-Ranges: bytes
Content-Length: 3771
Connection: close
Content-Type: text/html

Connection closed by foreign host.

といったレスポンスが返ってきます。
後は
「Last-Modified: Thu, 18 Dec 2003 11:25:51 GMT」
の行を取り出して、時間を比較できるように"18 Dec 2003 11:25:51 GMT"
の部分をtime_tで現されるエポックタイムに変換すればOKです。

以降は文字列の検索と変換になるので…わからなければ回答しますが、
まずは一度試してみてくださいませ。
個人的には
・strstrあたりで「先頭のポインタを取得」(大文字小文字を「意識しない」点に注意)
・charポインタをぶん回して \r\n(CRLF)を探す
・memcpyあたりで上述から得られる「Last-Modifiedのデータ部分」を切り取る
・文字解析をしてそれぞれを「数字」にする
・mktime関数あたりでエポックタイムに変換する
って感じですかねぇ?
# 最近C++使うことが多いので微妙に記憶からlost気味(苦笑

それではがんばってください ^^
サハラ
会議室デビュー日: 2005/07/05
投稿数: 4
投稿日時: 2005-07-05 15:25
>がるがるさま
返信ありがとうございます
自分も大まかな流れが把握できました

リクエストの仕方等、わからない点はもっと色々調べてみます
如何せん、自分の実力不足で申し訳ありません
とりあえず、調べて組んでみます
また、質問させていただくこともあると思います
よろしくお願いします

どうも、ありがとうございます
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-07-06 09:30
C でやるなら libgHTTP が便利。
サハラ
会議室デビュー日: 2005/07/05
投稿数: 4
投稿日時: 2005-07-06 13:32
>未記入さま
情報提供ありがとうございます
一度目を通しておきます
1

スキルアップ/キャリアアップ(JOB@IT)