2017-01-11 12 views
1

Все, я строю интерфейс fastCGI для языка программирования, который работает вовремя и работает в средах Windows, Linux и UNIX.mod_fcgid windows named pipes 2-й и последующие запросы

Я реализовал протокол fastCGI в программном коде, который запускается в течение этого времени выполнения, но у меня проблема с кодом Windows, который говорит с mod_fcgid. В этом случае я не могу использовать готовые DLL, чтобы выставлять функции fastCGI, но я могу совершать вызовы для большинства функций C из этого языка времени выполнения. Я не могу изменить время выполнения, поскольку оно принадлежит другой компании ... Думайте об этом как о php или perl-подобном языке. То, что я пытаюсь сделать, похоже на создание DLL-кода (его не dll) для обработки запроса fastCGI. Хотя многие говорили бы, что я «изобретаю колесо» здесь, у меня нет выбора использовать чью-то предварительно созданную DLL, чтобы обеспечить интерфейс для fastCGI.

Я успешно реализовал все, и я могу получить первоначальный запрос и ответить на веб-страницу через мой интерфейс fastCGI. Проблема, с которой я столкнулась, связана с «следующим» запросом при работе под Windows. Мой код при работе под Linux работает потрясающе, я принимаю() сокет, read() write(), чтобы выполнить мою обработку, закрыть() сокет, а затем снова вернуться и принять(), и я получаю следующий запрос и все прекрасно работает.

В Windows mod_fcgid используются именованные каналы. В моем коде я использую GetStdHandle(), чтобы получить дескриптор stdin, затем используйте ReadFile() и WriteFile(), а данные, завернутые в протокол fastCGI, переходят на mod_fcgid, а затем в браузер, когда выполняется с запросом, я использую CloseHandle (), а затем вернемся к GetStdHandle(), чтобы дождаться следующего запроса.

Все работает отлично для первого запроса, браузер получает мой выход cgi. Тот же код под Linux, используя сокеты, получает второй и последующие запросы и работает как шарм.

Мои проблемы: при работе под Windows после обработки первого запроса я не могу получить mod_fcgid для отправки мне второго запроса. Это закончит тем, что я убил процесс окон и запустил новый. Это, конечно, не то, что я хочу.

я должен быть делать что-то неправильно между временем я посылаю Fastcgi EndRequest и когда я петля вокруг ждать следующего запроса прийти.

Чтобы получить первоначальный запрос от mod_fcgid, я использую GetStdHandle() то я использую ReadFile() и WriteFile() (все из kernel32.dll), и когда я закончил протокол с его EndRequest, я не могу получить код, чтобы иметь возможность получить второй запрос.

Я пробовал fflush() Я пробовал FileFlushBuffers(), я пробовал не закрывать дескриптор, который я получил от GetStdHandle(), я просто не могу понять, что нужно mod_fcgid из моего приложения для Windows, может получить второй и последующие запросы.

После первого запроса, закрыв мой дескриптор, получив дескриптор от GetStdHandle, а затем, сидя на ReadFile, ReadFile() возвращается с 0 байтами, а GetLastError() всегда возвращает 6 (Invalid Handle).

Я просто не могу понять функции C, которые будут использоваться для очистки после завершения первого запроса, и чтобы можно было ждать следующего запроса для запуска в Windows. Как я уже говорил, код работает отлично под Linux при использовании сокетов вместо Windows, который использует дескриптор из STDIN, который является именованным каналом.

+0

Вы имеете в виду, что он использует трубы _un_named? Это то, что я ожидаю, когда используется «STDIN/STDOUT». – Ctx

+0

Я не могу найти документацию, подтверждающую это, но исходя из того, как протокол FastCGI работает через TCP/IP, я ожидал бы, что дескриптор, который вы получили, относится к * серверному концу именованного канала. (Мой предыдущий комментарий, теперь удаленный, предположил, что это конец клиента, моя ошибка.) Поэтому вместо закрытия дескриптора вы хотите вызвать DisconnectNamedPipe, за которым следует ConnectNamedPipe (который будет блокироваться до тех пор, пока новый запрос не будет готов). –

+0

Гарри, спасибо за это. Я считаю, что мне нужно использовать эти функции NamedPipe. Я проливал источник для mod_fcgi, который включает libfcgi.dll, который люди могут использовать для включения в свои приложения. Я вижу это с помощью ConnectNamedPipe и DisconnectNamedPipe, а также использует некоторые IOCompletion, которые я действительно не понимаю, для чего он используется, но я верю, что вы правы в вызовах NamedPipe. Благодарю. – user7405204

ответ

1

Гарри, ваш комментарий к использованию функций NamedPipe сделал трюк, мне нужно было использовать FileFlushBuffers, а затем DisconnectNamedPipe в конце первого запроса, а затем ConnectNamedPipe, чтобы ждать следующего запроса. Спасибо еще раз.