WEBページを介してルータとして構成された同様のデバイスを実現

ウェブを介して他のプロセスと対話するための実装

        ルータとしてのようにするには、Webページにアクセスして、デバイス、他のプロセスと基本的にWebサーバの通信の問題を設定することができるようになります。キーは、サーバが対処する私たちのWebブラウザへの要求を受信したときに、別のプロセスに通知することができ、あります。通常、デバイスプログラムを構成するハイレベルまたはローレベルの言語を達成するために使用することができますが、我々は、Webページでの設定または構成が、唯一のユーザーとの対話を知っているかわからないときに苦しみます。限り、当社のウェブページを構成するために私たちの設定プロセスパラメータを伝えることができるよう、その問題が解決されます。

        最も単純には、Webアプリケーションがユーザの要求を受信すると、パラメータがそのようにデータベースに書き込むように構成されるように、データベースをサポートしているため、データベースを介して達成することである、とフラグを書き込み、そして私たちの設定プロセスは、タイマーによってトリガーされ、絶えずデータベースを読み取り、フラグは変更発見された場合、対応するコンフィギュレーションのためのコンフィギュレーションパラメータを読み込みます。これは構造の最も単純な種類です。

         もう一つは、他のプロセスとのソケットソケットの相互作用を介してWebアプリケーションです。ソケットソケットと広く使われているクロスプラットフォームの十分な限り、Webサーバー・コードは基本的にソケットをサポートPHPのように、C#がすべてかなり良いです、離れて得ることができるよう。残念ながら、私は少しだけCおよびC ++思います....サポートCまたはC ++のアプローチを探してみてください。案の定、私はFastCGIのを見つけました。公式サイトはwww.fastcgi.comです。これは、詳細に説明し、上のようにしています。FastCGIは白が実際に主要な機能であることを認識しています。通常は、常にブラウザからのリクエストを待っているのサイクルがあり、機能要求され、次に実行すると、main関数では、時に障害物には要求が、ありません。各要求のために、サーバとクライアントは、情報の多くは、このような要求は、GETやPOSTとのようであるなどの環境変数の要求によって得ることができる持っています。顧客は、例えばGETCHAR(にデータ(例えばPOST)上で送信される)などの標準的なSTDINによって得られます。あなたはおなじみのCで行うことができますどのように要求に対する応答として。最後に、標準出力を介してユーザに出力するように、ユーザーのHTMLコードに戻ります。例えばprintfの()、fprintfの()などが挙げられます。

        多くのネットワーク・サーバは、私はLinuxのApacheサーバプラットフォーム、クロスプラットフォームのサポートに使用されているすべてを使用しています、のFastCGIをサポートしています。ルータなどの装置を埋め込みまたはより良い軽量サーバーを取る場合はもちろん、Apacheサーバは、強すぎます。Apacheサーバは、クライアントのブラウザのブラウザからのリクエストを受信し、ターンバイのFastCGIプロセスに対処するように要求します。FastCGIのプログラムがサポートする手段を使用すると、FastCGIのソケット関数を使用するソケットを介して、彼らは、など、など、内部のやりたいことができるようなその他のperl、PHPやJava、C、C ++、など複数の言語、それはC言語で実装することができるので、他のFastCGIのにことができるようになりますプロセス通信プロセスまたは他のマシン上で。


Apacheサーバの設定、FastCGIモジュールおよびFastCGI開発キットInux

         ApacheサーバモジュールのFastCGIは数日かかった設定、私は主に構成上の問題、実行内部高速DEV-KITの例にしようとしています。HTTPD-2.2.19.tar.gz(apache_httpサーバ)、mod_fcgid- 2.3.6(apache_httpのFastCGIサーバモジュール)、FCGI-2.4.0(のFastCGI CまたはC ++開発パッケージ)を抽出し、また、readmeファイルが記載されています。HTTPD-2.2.19構成で./configureを最初のデフォルト。次に作るには、インストールApacheサーバをインストールします。インストールはUSR /ローカル/ apacheの/ binにApacheサーバを起動下は/ usr / local / apache2のディレクトリに表示されます後、。/はapachectlが開始-k。Apacheサーバが正常に起動かどうかを確認するには、ブラウザでlocalhostを入力します。その後mod_fcgid-2.3.6をインストールし、プログラムのニーズがAPXSのapache2 / binに/アンダーランAPX =は/ usr / local / apache2の/ binに/ apxsの./configure.apxsによって構成することが、そのディレクトリのファイルであっconfigure.apxs FastCGIのモジュールに構成され、その後、makeinstallインストールを行います。インストール後FastCGIモジュールが正常にインストールされた記述よりmod_fcgid.so文書の下のapache /モジュール/になります。FastCGIの開発キットには、インストールをインストール./configure,make,makeもあります。


C言語でプログラムを実装するのFastCGI:

程序如下:
の#include "fcgi_stdio.h"
の#include <STDLIB.H>

   int型のmain()
   {
       int型のカウント= 0;
       しばらく(FCGI_Accept()> = 0)
           のprintf( "コンテンツタイプ:text / htmlの\ rを\ n"は
                  "\ rを\ n"は
                  "!<タイトル>のFastCGIこんにちは</タイトル>"
                  !「<H1>のFastCGIこんにちは< / H1>」
                  "ホスト上で実行されているリクエスト番号%d <I>%sの</ I> \ n"は、
                   ++カウントのgetenv( "SERVER_NAME"));

    0を返します。
   }

        当用户有请求时,FCGI_Accept()就会返回。这里的printf是fcgi_stdio.h里的printf,printf的内容会返回给用户。程序的编译需要开发包下的/libfcgi/下的fcgi_stdio.c、 fcaiapp.c、和os_unix.c。用g++来编译。还要把开发包下的include文件加入路径。编译可能会报错因为socklen_t的问题。看了os_unix.c的源代码之后你就明白了,我为求方便加了个宏定义就编译通过了。生成程序tiny.fcg。
        接下来得配置apache服务器,使它可以运行我们的tiny.fcg程序。apache的服务器的配置都在/conf/下的httpd.conf文件里。
在里面添加如下信息:

LoadModule fcgid_module modules/mod_fcgid.so

<Directory "/usr/local/apache2/fcgi-bin">
    SetHandler fcgid-script
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>


          大家注意了,我之所以花了几天时间fastCGI程序都跑不起来就是因为SetHandler项,我一直写了fcgi-script!!!少了一个d。我还重装了两遍apache..最后终于让我发现了。一改为fcgid-script。。终于可以了!当访问出错的时候,apache会把错误记录在apache/logs/下的error_log和access_log,当你调试fastCGI程序的时候,这两个文件给你很大帮助。

          apache的配置文件里的语法官网都有介绍,要是你配置了还跑不起来,你就得像我那样去啃官网的英文文档了看天意了。。。。
          配置好后fcgi-bin文件夹里面的程序收到请求时都自动调用fastCGI来跑。假设我们里面有tiny.fcg文件。那么访问localhost/fcgi-bin/tiny.fcg时,请求就交由tiny.fcg处理了。正如我们c语言实现那样网页返回以下内容:
FastCGI Hello!
Request number 1 running on host localhost
刷新几次之后,number会变化。

        整个过程,我们充当一个web服务器的角色,对于用户的请求,由我们来生成html页面,然后把html源码通过printf或其他stdout返回给用户。还得熟悉下html以及javascript脚本语言这程序才好写啊。



fastCGI如何获得用户GET或者POST过来的数据

有代码有真相:先贴再解释


#include "fcgi_config.h"
#include "fcgiapp.h"
#include <sys/types.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif


int main(void)
{

    int rc;

    FCGX_Init();
    pid_t pid = getpid();
    FCGX_Request request;
    char *server_name;

    FCGX_InitRequest(&request, 0, 0);

    for (;;)
    {
        rc = FCGX_Accept_r(&request);

        if (rc < 0)
            continue;

        char buffer[1024*10];
        buffer[0] = '\0';
        char** p = request.envp;
        while(*p)
        {
            strcat(buffer,*p);
            strcat(buffer,"\r\n");
            p++;
        }

        server_name = FCGX_GetParam("SERVER_NAME", request.envp);

        FCGX_FPrintF(request.out,
            "Content-type: text/html\r\n"
            "\r\n"
            "<title>FastCGI Hello!</title>"
            "<h1>FastCGI Hello! </h1>"
             "<p>Process %ld</p>"
            "<p> host<i>%s</i></p>"
            "the environments we get is: <p>"
            "<pre>%s</pre>",
            pid, server_name ? server_name : "?",buffer);


        //
        char* method = FCGX_GetParam("REQUEST_METHOD",request.envp);
        if(strcmp(method,"POST") == 0)
        {
            char postedData[1024*10];
            int dataNum = 0;
            int ch;
            while((ch = FCGX_GetChar(request.in)) != -1)
            {
                postedData[dataNum++] = (char)ch;
            }

            postedData[dataNum] = '\0';

            FCGX_FPrintF(request.out,
                         "<p>the data posted is:</p>"
                         "<pre>%s</pre>",postedData);
        }

        FCGX_Finish_r(&request);

    }
        return 0;
}


      基本上你看到函数名字大概就能猜到了,并且可以看源代码的。首先看以下 FCGX_Request的结构。


typedef struct FCGX_Request {
    int requestId;            /* valid if isBeginProcessed */
    int role;
    FCGX_Stream *in;
    FCGX_Stream *out;
    FCGX_Stream *err;
    char **envp;

    /* Don't use anything below here */

    struct Params *paramsPtr;
    int ipcFd;               /* < 0 means no connection */
    int isBeginProcessed;     /* FCGI_BEGIN_REQUEST seen */
    int keepConnection;       /* don't close ipcFd at end of request */
    int appStatus;
    int nWriters;             /* number of open writers (0..2) */
    int flags;
    int listen_sock;
} FCGX_Request;


       里面的in就是stdin,可以读取由浏览器POST过来的数据。out就是输出,往out printf的内容将返回给浏览器用户。envp就是字符串数组的指针,里面保存的都是环境变量,源代码就把这些环境变量都打印出来了。把fastCGI程序(我起名为learnFCGI)放入apache服务器的fcgi-bin文件夹(已配置好)。我在浏览器访问localhost/fcgi-bin/learnCGI得到以下内容


FastCGI Hello!

Process 12660

hostlocalhost

我々が得る環境は次のとおりです。FCGI_ROLE = RESPONDER

HTTP_HOST = localhostの

HTTP_USER_AGENT =のMozilla / 5.0(X11; U; Linuxのx86_64で、EN-US; RV:1.9.2.6)のGecko / 20100626 SUSE / 3.6.6-1.2のFirefox / 3.6.6

HTTP_ACCEPT = text / htmlで、アプリケーション/ XHTML + xmlの、アプリケーション/ xmlの; Q = 0.9、* / *; Q = 0.8

HTTP_ACCEPT_LANGUAGE = EN-US、EN; Q = 0.5

HTTP_ACCEPT_ENCODING = gzipで、デフレート

HTTP_ACCEPT_CHARSET = ISO-8859-1 、UTF-8、Q = 0.7、*; Q = 0.7

HTTP_CONNECTION =近い

PATH =は/ usr / lib64に/ MPI / GCC / OpenMPIの/ binに:/ sbinにします。/ usr / sbinに:は/ usr / local / sbinに:/ルート/ビン:は/ usr / local / binにします。/ usr / binに:/ binにします。/ usr / bin / X11:は/ usr / X11R6 / binにします。/ usr /ゲーム:は/ usr / libに/ MIT / binにします。/ usr / lib / MIT / sbinに

SERVER_SIGNATURE =

SERVER_SOFTWARE = Apacheの/ 2.2.19(Unixの)mod_fcgid / 2.3.6

SERVER_NAME = localhostを

SERVER_ADDR = :: 1

SERVER_PORT = 80

REMOTE_ADDR = :: 1

DOCUMENT_ROOT =は/ usr / local / apache2の/ htdocsに

[email protected]

SCRIPT_FILENAME =は/ usr / local / apache2の/ FCGIビン/ learnFCGI

REMOTE_PORT = 45762

GATEWAY_INTERFACE = CGI / 1.1

SERVER_PROTOCOL = HTTP / 1.1

REQUEST_METHOD = GET

QUERY_STRING =

REQUEST_URI = / FCGI-binに/ learnFCGI

SCRIPT_NAME = / FCGI-binに/ learnFCGI

       私がGETとして直接アクセスできる、でもREQUEST_METHODをしておりますので、QUERY_STRINGも空で、追加のPOSTデータは、単純なHTMLテストページを書き留めたいないかもしれません。

コードは以下の通りであります:

<html>
<body>
<form action="/fcgi-bin/learnFCGI" method="get">
    name:<input type="text" name="myName" ></br>
    passwrod:<input type="text" name="myPassword"></br>
    <input type="submit" value="提交">
</form>
</body>
</html>


         把html保存为testpage.html放在apache的usr/local/apache2/htdocs目录下。就能访问了,我这里通过localhost/testpage.html得到


         往文本框里输入testname,testpassword.按提交则会转到learnFCGI程序。我们会发现,这次打印的环境变量的QUERY_STRING发生了变化:


QUERY_STRING=myName=testname&myPassword=testpassword

我们的内容提交到fastCGI程序了。


把html代码里<form> 中的method属性改为 method="post",再次运行就能看到POST数据了


REQUEST_METHOD = POST

QUERY_STRING =

REQUEST_URI = / FCGI-binに/ learnFCGI

SCRIPT_NAME = / FCGI-binに/ learnFCGI


ポストされたデータは以下のとおりです。

がmyName =テスト名&MYPASSWORD = testpassword

        利用FastCGIプロセスでは、オンライン情報のないたくさん。基本的に、私は書く方法もありません数回食べて、英語食べるの公式サイトに行ってきました。私がしようとするしかありませんでした。最も重要なことは、テストに小さなプログラムを書くことです。されている可能性がどのような内部の環境変数は、私にはわからないようFCGX_Requestは、その後、プリントアウトされたプログラムを書きます。REQUEST_METHODとQUERY_STRINGオプションがあることがわかった、私はあなたがFastCGIのにデータを提出することができることを知っています。そして、のgetchar()を使用すると、POSTデータを取得できることを確認してみてください。


      このように、FastCGIのことで、ウェブプログラムは、に対処するため、別のプロセスにデータを提出することができるようになります。

公開された15元の記事 ウォンの賞賛2 ビュー50000 +

おすすめ

転載: blog.csdn.net/imhikaru/article/details/6700631