Как приложения fastCGI можно запускать вручную в Windows? - PullRequest
3 голосов
/ 22 декабря 2009

Я настроил веб-сервер для использования «удаленного» приложения fastCGI через именованный канал (на самом деле он находится на том же хосте Windows). Сейчас я пытаюсь выяснить, как запустить приложение fastCGI, чтобы использовать этот канал, но я не уверен, как это сделать. Другие ОС, кажется, имеют утилиты spawn-fcgi для этого, но для Windows, похоже, нет ничего похожего.

Это мое приложение:

#include <stdio.h>
#include "fcgi_stdio.h"

int main(int argc, char ** argv)
{
  while (FCGI_Accept() >= 0) {
    printf("Content-type: text/html\r\n"
        "\r\n"
        "<title>Web Services Interface Module</title>"
        "<h1>Web Services Interface Module</h1>\n");
  }
  return(0);
}

Из интереса я использую Abyss Web Server, хотя надеюсь, что это никак не повлияет на ответ.

С наилучшими пожеланиями

Ответы [ 4 ]

2 голосов
/ 19 января 2010

Интерфейс FCGI не позволяет вам сделать это, вместо этого используйте интерфейс FCGX. Вызовите FCGX_Open_Socket для прослушивания определенного порта, например, 9345 или именованная труба.

FCGX_OpenSocket(":9345", 500);

Тогда вам вообще не нужно использовать утилиту типа spawn_fcgi для запуска приложения.

1 голос
/ 20 июня 2012

изменить FCGX_Init в файле fcgiapp.c

int FCGX_Init(void)
{
    char *p;

    int listen_socket;

    if (libInitialized) {
        return 0;
    }

    if (OS_LibInit(NULL) == -1) {
        return OS_Errno ? OS_Errno : -9997;
    }   

    /*sureone socket*/
        /* 9010 is your listen port*/
    listen_socket = FCGX_OpenSocket(":9010", 400); 
    if(listen_socket < 0) exit(1);
    printf("FCGX_InitRequest...\n");
    FCGX_InitRequest(&the_request, listen_socket, 0);
    /*end sureone*/

    //FCGX_InitRequest(&the_request, FCGI_LISTENSOCK_FILENO, 0);



    p = getenv("FCGI_WEB_SERVER_ADDRS");
    webServerAddressList = p ? StringCopy(p) : NULL;

    libInitialized = 1;
    return 0;
}
1 голос
/ 28 декабря 2009
 /*
 *----------------------------------------------------------------------
 *
 * FCGX_OpenSocket --
 *
 *  Create a FastCGI listen socket.
 *
 *  path is the Unix domain socket (named pipe for WinNT), or a colon
 *  followed by a port number.  e.g. "/tmp/fastcgi/mysocket", ":5000"
 *
 *  backlog is the listen queue depth used in the listen() call.
 *
 *  Returns the socket's file descriptor or -1 on error.
 *
 *----------------------------------------------------------------------
 */
 DLLAPI int FCGX_OpenSocket(const char *path, int backlog);

По умолчанию libfcgi читает из стандартного ввода. Так что откройте ручку стандартного ввода как трубу.

 dup2(FCGX_OpenSocket("pipe name", 5),0);
0 голосов
/ 24 февраля 2015

Я придумал код, который работает только для меня в Windows:

<code>int main ()
{
    char **initialEnv = environ; //Keep track of initial environment
    int count = 0;        
    int listenSocket;


    //It's ugly, but in Windows we need to initialize the 
    //socket library. We can do it by calling
    //libfcgi's OS_LibInit() function
    OS_LibInit(NULL);

    //Open a socket. Here, we use localhost:9000
    listenSocket = FCGX_OpenSocket("localhost:9000", 5);
    if (listenSocket < 0) {
      exit(1);
    }

    FCGX_Request request;
    FCGX_Init();
    FCGX_InitRequest(&request, listenSocket, 0);


    while (FCGX_Accept_r(&request) >= 0) {
        //Init I/O streams wrapper as well as set the new environment
        FCGI_stdin->stdio_stream = NULL;
        FCGI_stdin->fcgx_stream = request.in;
        FCGI_stdout->stdio_stream = NULL;
        FCGI_stdout->fcgx_stream = request.out;
        FCGI_stderr->stdio_stream = NULL;
        FCGI_stderr->fcgx_stream = request.err;
        environ = request.envp;

        //Funny stuff
        char *contentLength = getenv("CONTENT_LENGTH");
        int len;

        printf("Content-type: text/html\r\n"
               "\r\n"
               "<title>FastCGI echo</title>"
               "<h1>FastCGI echo</h1>\n"
               "Request number %d,  Process ID: %d<p>\n", ++count, getpid());

        if (contentLength != NULL) {
            len = strtol(contentLength, NULL, 10);
        } else {
            len = 0;
        }

        if (len <= 0) {
            printf("No data from standard input.<p>\n");
        }
        else {
            int i, ch;

            printf("Standard input:<br>\n<pre>\n");
            for (i = 0; i < len; i++) {
                if ((ch = getchar()) < 0) {
                    printf("Error: Not enough bytes received on standard input<p>\n");
                    break;
                }
                putchar(ch);
            }
            printf("\n

\ п "); } } /* в то время как */ вернуть 0; }

...