Приложение CGI / FastCGI на C / C ++ (вопрос программирования сокетов) - PullRequest
0 голосов
/ 03 января 2011

Я разрабатываю свое первое приложение на C / C ++ fastCGI, используя FastCGI Developers Kit .

Я успешно создал одну из примеров программ (фрагмент приведен ниже):

int main (void)
{
    int count = 0;
    long pid = getpid();

    streambuf * cin_streambuf  = cin.rdbuf();
    streambuf * cout_streambuf = cout.rdbuf();
    streambuf * cerr_streambuf = cerr.rdbuf();

    FCGX_Request request;

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

    while (FCGX_Accept_r(&request) == 0)
    {
       /* Handle request */
    }

    return 0;
}

Однако, когда я запускаю приведенный выше пример, он просто завершается. После отладки я понял, что FCGX_Accept_r возвращает код ошибки. После дальнейшего изучения я понял, что вызов метода accept () не удался.

Фактическая строка, которая терпит неудачу:

 socket = accept(listen_sock, (struct sockaddr *)&sa, &len);

Аргументы, переданные функции:

listen_sock: 0
len: 112
sa:

{un = {sun_family = 0, sun_path = "\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\020\\"'\\000\\000\\032\\356m\\000\\000\\000\\000\\377\\377\\377\\377\\364\\277\\022\\000\\310\\366\\377\\277\\001\\000\\000\\000\\000\\000\\000\\000X\\366\\377\\277\\343\\276\\004\\b\\377\\377\\377\\377\\001\\000\\000\\000\\001\\000\\000\\000\\000\\000\\000\\000\\001\\000\\000\\000\\310\\366\\377\\277\\210\\366\\377\\277F\\277\\004\\b\\310\\366\\377\\277\\001\\000\\000\\000\\000"}, in = {sin_family = 0, sin_port = 0, sin_addr = {s_addr = 0}, sin_zero = "\\000\\000\\000\\000\\000\\000\\000"}}

Я новичок в программировании сокетов, поэтому мне нужна помощь в диагностике причины сбоя метода accept ().

Учитывая приведенную выше информацию, кто-нибудь может понять, почему вызов accept () не будет выполнен?

Я работаю на Ubuntu 10.x

1 Ответ

3 голосов
/ 03 января 2011

Не знаю много об этом SDK, однако беглый взгляд через их заголовки показывает, что вам нужно сначала создать сокет для приема входящего запроса и передать его в метод FCGX_InitRequest.

http://www.fastcgi.com/devkit/include/fcgiapp.h

раскрывает метод: int FCGX_OpenSocket(const char *path, int backlog);, который, как я предполагаю, вы вызываете для создания сокета, а затем вызываете FCGX_InitRequest с этим сокетом в качестве второго параметра ...

Следовательно, почему ваш код не работает, вы передаете 0 для сокета, что недопустимо!

...