The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"программа FastCGI на Си (LightTPD, винда)"
Вариант для распечатки  
Пред. тема | След. тема 
Форум WEB технологии (web-разработка, CGI)
Изначальное сообщение [ Отслеживать ]

"программа FastCGI на Си (LightTPD, винда)"  +/
Сообщение от urgun (ok) on 31-Мрт-10, 19:58 
Здравствуйте. Сделал по примеру из webkit многопоточный FastCGI:
#include <iostream>
using namespace std;

#include <stdio.h>
#include <windows.h>

#include "aolexp.h"
#include "fcgi_config.h"
#include "fcgiapp.h"

const int threadscount = 10;
CRITICAL_SECTION acceptrsection;

int __stdcall ServerThread(void*){
    int acceptrresult;
    FCGX_Request request;
    FCGX_InitRequest(&request, 0, 0);
    for(;;){
        EnterCriticalSection(&acceptrsection);
            acceptrresult = FCGX_Accept_r(&request);
        LeaveCriticalSection(&acceptrsection);
        if(acceptrresult<0)
            break;
        FCGX_FPrintF(request.out,
            "Content-type: text/html\r\n"
            "\r\n"
            "<title>FastCGI Hello! (multi-threaded C, fcgiapp library)</title>"
            "<h1>FastCGI Hello! (multi-threaded C, fcgiapp library)</h1>");
        FCGX_Finish_r(&request);
    }
    return 0;
}

int main(){
    InitializeCriticalSection(&acceptrsection);
    FCGX_Init();
    DWORD tid;
    for(int i=1; i<threadscount; i++)
        CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ServerThread, NULL, 0, &tid);
    ServerThread(NULL);
    return 0;
}

Потом настроил в конфигах сервера
fastcgi.server             = ( ".e" =>
                               ( "localhost" =>
                                 (
                                    "socket" => "TMP/exe-aols.socket",
                      "bin-path" => "/cygdrive/f/aols/aols/aols.exe"
                                 )
                               )
                             )

Проблема в том, что программа вообще не "спаунится" сервером. Т.е. он что-то там делает:

2010-03-31 22:56:35: (log.c.166) server started
2010-03-31 22:56:35: (mod_fastcgi.c.1367) --- fastcgi spawning local
        proc: /cygdrive/f/aols/aols/aols.exe
        port: 0
        socket TMP/exe-aols.socket
        max-procs: 4
2010-03-31 22:56:35: (mod_fastcgi.c.1391) --- fastcgi spawning
        port: 0
        socket TMP/exe-aols.socket
        current: 0 / 4
2010-03-31 22:56:35: (mod_fastcgi.c.1391) --- fastcgi spawning
        port: 0
        socket TMP/exe-aols.socket
        current: 1 / 4
unknown listenType (0)
unknown listenType (0)
unknown listenType (0)
unknown listenType (0)
unknown listenType (0)
unknown listenType (0)
unknown listenType (0)
unknown listenType (0)
unknown listenType (0)
unknown listenType (0)
2010-03-31 22:56:35: (mod_fastcgi.c.1391) --- fastcgi spawning
        port: 0
        socket TMP/exe-aols.socket
        current: 2 / 4
unknown listenType (0)
2010-03-31 22:56:35: (mod_fastcgi.c.1391) --- fastcgi spawning
        port: 0
        socket TMP/exe-aols.socket
        current: 3 / 4
unknown listenType (0)
unknown listenType (0)

Но программы нет в списке процессов и соответственно на запросы она не отвечает... Может кто знает в чем проблема...

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "программа FastCGI на Си (LightTPD, винда)"  +/
Сообщение от urgun (ok) on 31-Мрт-10, 20:06 
Компилировал в MSVC и mingw. Но ведь компилятор по сути не имеет значения.
Еще пробовал так (такой вариант работает, но он не многопоточный - мне не подходит):
    ..........
    std::string port=":9001";    
    int listenQueueBacklog = 400;
    FCGX_Request request;
    if(FCGX_Init())exit(1);
    int listen_socket = FCGX_OpenSocket(port.c_str(), listenQueueBacklog);
    if(listen_socket < 0)exit(1);  
    if(FCGX_InitRequest(&request, listen_socket, 0))exit(1);
    while(FCGX_Accept_r(&request) == 0){        
    ..........
С таким конфигом (спаунил вручную):
fastcgi.server             = ( "/" =>
                               ( "sdfsdfsdfsdf" =>
                                 (
                                   "host" => "127.0.0.1",
                       "port" => "9001"
                                 )
                               )
                             )

Если делать так, как выше, но для нескольких потоков, видимо нужно в каждом потоке ставить разные номера портов, потом в конфиге прописывать распределение нагрузки:
fastcgi.server = ( "/" =>
                   ( "server1" =>
                     ( "host" => "10.0.0.3",
                       "port" => 1030 ),
                     "server2" =>
                     ( "host" => "10.0.0.3",
                       "port" => 1030 )
                   )
                 )
Но это слишком сложно, вопрос в том как добиться того, чтобы сервер сам спаунил программу...

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "программа FastCGI на Си (LightTPD, винда)"  +/
Сообщение от kyrysha on 29-Ноя-10, 22:54 
все конечно хорошо но ты пропустил
>     int listen_socket = FCGX_OpenSocket(port.c_str(), listenQueueBacklog);
>     if(listen_socket < 0)exit(1);

если пишеш под win32 это обязательно

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2021 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру