PCで常時動かしているC言語のプログラムがあります。

例えば「冷蔵庫のドアが開いた」とか「雨が降ってきた」とか「お
風呂の水が満水になった」とか「その風呂の温度は今何度。」とか
「部屋の温度が今何度。」などという家の中の情報をそのプログラ
ムで収集しているとします。

その情報を元にPCからサーバーに自働でHTTPコマンドを送りたい
のですが、どうしたら良いか具体的な方法がわかりません。
ことが起こってから、長くて1秒以内の対処を考えてます。
(↑理想的にはHTTPコマンドを送るのはことが起きてから、数ms
  オーダにしたい。)

HTTPコマンドを送るにはCGIを使えば良いと聞きました。
(↑私はこの程度のレベルです。)
こういった案件にPerlは使えますか?
(↑ファイル管理や大量のテキストデータをPerlで扱ったことがあ
  るので、Perlは初心者レベルでは使えます。)

C言語とのデータのやり取りは一般的にはどうすれば良いですか?
参考図書なども示して頂けると助かります。
よろしくお願い致します。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2011/06/01 14:39:10
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Banias No.1

回答回数237ベストアンサー獲得回数19

ポイント90pt

OSやCコンパイラの種類がわからないのですが、たとえばgccであればSocket間通信によってhttpパケットを送信することができます。

id:gorok1

CコンパイラはVC6です。

このC言語のプログラムも前任者が作ったものを改造しているので、根本は良くわかってませんが。

PCのOSはWinXPです。

C言語でもsocket間通信と言うのができるのですね。

ありがとうございます。

2011/05/26 17:55:20

その他の回答3件)

id:Banias No.1

回答回数237ベストアンサー獲得回数19ここでベストアンサー

ポイント90pt

OSやCコンパイラの種類がわからないのですが、たとえばgccであればSocket間通信によってhttpパケットを送信することができます。

id:gorok1

CコンパイラはVC6です。

このC言語のプログラムも前任者が作ったものを改造しているので、根本は良くわかってませんが。

PCのOSはWinXPです。

C言語でもsocket間通信と言うのができるのですね。

ありがとうございます。

2011/05/26 17:55:20
id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154

ポイント70pt

二つのことをやらなくちゃいけません。

  1. C言語のプログラムから、socket を使って HTTP なリクエストを投げる

  2. あるリクエストを受け取って、期待の処理をする Webサーバ側のプログラムを作る


HTTPコマンドを送るにはCGIを使えば良いと聞きました。

  ...

こういった案件にPerlは使えますか?

これは、後者の方だけですね。

perl だけじゃなく、ruby や、C言語でも書くことができます。


前者の方については、テキストを socket で通信するだけなので、やったことがあれば、たいして難しくありません。

↓とか見て理解できますか?

http://x68000.q-e-d.net/~68user/net/c-http-1.html


このページだと、データを取得する方に傾いて書いてありますが、送るデータがちょっと多くて、

受け取るデータがちょっと少ない、という違いだけです。

id:gorok1

ありがとうございます。

「テキストをsocketで通信するだけ」が現時点ですでに理解できておりません。

でも1の方のご回答でもCでsocketの話が出ているので、そちらが一般的なのでしょうね。

元々の仕事が機械屋でものの設計するのは得意なのですが...。

リストラ先の部署がソフト屋で、教育も無しにこんな仕事が降ってきて...。

という状況です。

愚痴ってもしょうがないので、とりあえずCの教科書を読んでみます。

ご回答ありがとうございました。

大変助かります。

2011/05/26 18:04:02
id:windofjuly No.3

回答回数2625ベストアンサー獲得回数1149

ポイント90pt

【1】HTTPコマンドを送るにはCGIを使えば良いと聞きました

 

インターネット経由でサーバープログラムを起動する方法はいろいろあります(下記一例)

(1)httpプロトコルを利用する方法

 クライアント→インターネット回線→[WEBサーバ→perlなどのプログラム]

 [ ]内がサーバー側での処理

 主に一方通行的な使い方に適します(双方向も可能ですが応答性は必ずしも高くない)

 CGIを使う方法は一番簡単で、多くのサーバで利用可能でもあるのですが

 httpプロトコルは即応性に乏しく、数msどころか1秒以内の対処でも無理な場合もありけりです

(2)telnetプロトコルを利用する方法

 クライアント→インターネット回線→[perlなどのプログラム]

 双方向通信に適しますが直接プログラム起動などのシェルレベルでの操作が出来てしまうため

 共有タイプのレンタルサーバーではtelnetでの接続を許可していない場合がほとんどです

 しかしながら、即応性を求めるのであれば、これが第一の選択肢となるでしょう

(3)メールを利用する方法

 クライアント→インターネット回線→メールサーバ→perlなどのプログラム

 メールサーバの転送機能を利用してプログラムを起動する方法

 メール転送は即応性を保証しないため、今回の要求にはまったく使えないですが、知識として…

 

【2】

セキュリティと安定性

(1)安定性

 ベストエフォートタイプの回線は継続的な接続保証はありませんので

 目的を達成するためには帯域保証のあるクライアント側回線を用意して

 サーバ側でも帯域保証のあるタイプを契約しておく必要性があるでしょう

(2)セキュリティ

 VPNや専用線でクライアントとサーバを繋ぐのが理想ですが

 通常回線であってもSSH+TELNETなどにしておけば必要十分でしょう

  

【3】Perlは使えますか?

 贅沢を言えばJAVAやCで作りたいところですが

 サーバ側での高速処理を求めないのであればPerlでも良いでしょう

 

【4】C言語とのデータのやり取り

 socket通信用のクラスを使うだけですが

 開発環境に関する記述がないので、以下とりあえず判りやすそうなサイトを…

http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code...

http://msdn.microsoft.com/ja-jp/library/system.net.sockets.socke...

id:gorok1

これも良くわかっていないのですが、とりあえずのテストなので直接サーバに繋いじゃえとリバースと書かれた短いLANケーブルを渡されました。

(↑将来的にはルータを介して、ちゃんとイントラネット上で運営するようです。)

クローズで使っているので、セキュリティとか何とかは考えず、ただひたすら早い動作を目指さねばならないようです。(↑限界がどんな感じか。)

では、Perlではどうやら駄目そうで、Cに組み付けてしまうしかなさそうですね。

最初の動作確認程度はPerlでもできるかなぁ。

C言語のsocket通信は避けて通れそうにないですね。

助かります。

詳しい解説ありがとうございます。

2011/05/26 18:22:28
id:spyglass No.4

回答回数455ベストアンサー獲得回数29

ポイント15pt

httpコマンドの詳細が分かりかねますので別の角度から簡単にアプローチしてみましょうか。

要はローカル端末上のデータをwww(file)サーバ上へ転送したい、という仮定でお話ししますね。

FFFTPに代表されるFTPツールはご存知でしょうか。

http://www2.biglobe.ne.jp/~sota/ffftp.html

通常はこう言ったツールでwwwサーバへファイルを転送しますが

これを自動で転送出来れば良いという事ですよね。


これにはWindows記録ツールを使います。

代表的な物にUWSCが御座います。

UWSC

http://www.uwsc.info/


このツールはマウス操作を記録して反復動作が可能です。

簡単に言うと、マウス(ビデオ)の録画・再生の感じです。

画面上にFFFTPを立ち上げておいてUWSCで収集されたcsvファイル等をサーバ側へドロップしてやれば

半永久的にファイルをwww側へ投げてくれます。


サーバ側で別の担当者さんがデータが変わっていればその後の処理をされれば良いかと思います。

id:gorok1

まずはご回答ありがとうございました。

でも求めている内容と少し結果が違います。

一応ご教示頂いたFFFTPもマウスやキーボードマクロも存じ上げております。

そうではなくてC言語で収集した結果をhttpコマンドで自働でサーバに投げる(GET/POST?)方法が知りたかったのです。

こちらが決まったコマンドを投げると、サーバ側の反応はそれに応じて自働で応答があるという感じです。

2011/05/27 08:34:41
  • id:gorok1
    満足がいく回答には割増しでポイントを差し上げたいと思っております。
    よろしくお願い致します。
  • id:taknt
    >その情報を元にPCからサーバーに自働でHTTPコマンドを送りたい

    HTTPコマンドって何ですか?
    具体的に送りたい HTTPコマンドのコマンドを 教えてください。

  • id:windofjuly
    うぃんど 2011/05/26 18:53:37
    >C言語のsocket通信は避けて通れそうにない
    プログラム間の受け渡しは何かと面倒ですし
    インタプリタタイプのperlスクリプトを使うとすれば、そこでも遅くなるので
    送信側がC言語で組まれている現状ではC言語から直接socket通信するという手になるでしょうね
     
    >最初の動作確認程度はPerlでもできるかなぁ。
    送信側はCとして、サーバ側の動作確認用であればperlでもpython、phpなど何でもいいですし
    それで支障が無いようであれば、そのまま継続利用してしまってもいいかもしれないです
    手っ取り早いのはperlなどでポートを常時監視させる方法になりますが
    送信側がCですから、サーバ側もCで作ることを考えたほうが結果的に楽だと思います
    (本格的な運用の際にはサーバー側は常時監視ではなく
     サービスとして登録しておくという手になりますが、それはかなり先の話になりそうなので割愛)
     
    >イントラネット上で運営
    サーバはポート80へのアクセスはWEBアクセスでポート23へのアクセスならtelnetという具合に処理を振り分けているので
    ポートxxへのアクセスは自作のプログラム(Cだけでなくperlスクリプトなどでも良い)を起動するという事もできます
     
    >C言語でもsocket間通信と言うのができる
    高速応答を目指すなら、(ソケット通信を学べば出てくるのですが)TCP/IPの仕組みについてしっかり学んで、
    クライアント側が何をするのか(しなければならないのか)、サーバー側が何をするのか(しなければならないのか)を
    身に付けることをまずは目指しましょう
  • id:gorok1
    サーバ側は私の仕事ではありません。
    何とかしてくれる筈です。(^^)

    既にあるサーバのプログラムにHTTPコマンドを送信し、反応を受け取ります。
    HTTP://ホニャララで始まるコマンドをPCから自働でサーバに投げる(GET/POST?)と何らかの反応が返ってくるのをPC側で受け取って私の仕事は終わりとなります。
    仕事の都合上、HTTPコマンドは書けません。

    正直何もわからない状態からのスタートです。
    コメントを下さった方も皆様ありがとうございました。
    助かります。
  • id:windofjuly
    うぃんど 2011/05/26 20:41:40
    >HTTP://ホニャララで始まるコマンドをPCから自働でサーバに投げる(GET/POST?)と何らかの反応が返ってくるのをPC側で受け取って私の仕事は終わり
     
    それだけであればCやperlなどでホームページを取得する方法と基本的にまったく同じです
    (Cで行うにしてもperlで行うにしてもTCP/IPでの通信はsokectを使うことになります)
     
    >サーバ側は私の仕事ではありません。
    どの回答にもクライアント側のサンプルコードが載っているサイトへのリンクがありますので、それぞれ見比べながら学ぶとよろしいでしょう
  • id:gorok1
    お勉強が進み内容も大体理解できてきたのと、回答も増える様子がないので、本日の夜6時くらいで回答を締め切ります。
    コメント欄のかたがたもありがとうございました。
    はてなはこういう場面で役に立ちますね。
    皆様ありがとうございました。
  • id:gorok1
    停滞していた仕事が流れ始めました。
    皆様のお陰です。
    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません