2014-02-09 3 views
0

점진적으로 테스트/개발하기 위해 가능한 한 가장 간단한 방법으로 C++ FastCGI 서버를 만들고 연결해야합니다.단위 테스트를위한 FastCGI 및 boost :: asio

개념적으로나 FastCGI에 대한 API 설명서가 부족한 문제가 있습니다. 내 이해는 내가 할 때이다.

FCGX_Request request; 
FCGX_Init(); 
FCGX_InitRequest(&request, 0, 0); 
while (FCGX_Accept_r(&request) == 0) { 
} 

이것은 소켓을 열고 요청을 기다린다. 그런 다음 boost :: asio를 사용하여 다음과 같이하고 싶습니다.

boost::asio::io_service io_service; 
boost::system::error_code error; 

using boost::asio::ip::tcp; 
tcp::resolver resolver(io_service); 
tcp::resolver::query query("localhost", "" /* WTF are the params here? */); 
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 
tcp::socket socket(io_service); 
boost::asio::connect(socket, endpoint_iterator); 

while (true) 
{ 
    boost::array<char, 128> buf; 

    size_t len = socket.read_some(boost::asio::buffer(buf), error); 
    if (error) 
     break; 
} 

CPPUNIT_ASSERT_EQUAL(error, (boost::system::error_code)boost::asio::error::eof); 

FastCGI 프로세스가 작동하는지 테스트하기 위해 프로그래밍 방식으로 요청을 FastCGI 프로세스에 보냅니다.

어쨌든 tcp :: resolver :: query가 간단한 단위 테스트에서 통신을 설정하는 열쇠라고 생각합니다.

그러나

,

  • 나는 완전히 '소켓'이 경우에 이해하지 않습니다. 나는 그것이 단지 파일 (리눅스에서)이라는 것을 읽었는가?
  • 이 점을 감안할 때, 어떤 소켓 FastCGI가 수신 대기하는지 어떻게 알 수 있습니까?
  • 어떻게 boost :: asio에 소켓을 지정합니까?
  • 테스트가 완료되면 어떻게 FastCGI 프로세스가 수신을 중지합니까?

나는이 모든 잘못에 대해 갈 것이므로,이 간단한 테스트 케이스에 접근하는 적절한 방법에 대한 힌트가 감사히 받아 들여질 것입니다. 또한 누군가가 fcgi/fcgi ++/fastcgi ++에 대한 API 문서가 어디 있는지 알고 있다면 그것은 대단 할 것입니다.

답변

2

귀하의 질문은 실제로 초등 네트워킹에 관한 것입니다.

편집 체크 아웃 네트워크 프로그래밍 (고급에 기초)에이 가장 가치있는 인터넷 자료 : Beej의 네트워크 프로그래밍 가이드

소켓이 연결입니다에서

  • What is a socket?. 서버가/port/(TCP 또는 UDP로 청취 중입니다. 나머지는 CGI를 수행 중이므로 TCP라고 가정).

    클라이언트가 포트에 연결하고 서버 accept이 연결되면 소켓 (양방향 스트림)이 생깁니다. 클라이언트는 현재 (보통) send이고 서버는 receive입니다. 그런 다음 서버 send 응답. 연결은 닫혀 있거나 프로토콜/기본 설정에 따라 계속 유지 될 수 있습니다.

    구체적인 답변 :

    query("localhost", "http"); 
    

    는 대부분의 시스템에서 포트 80에 연결 끝날 것입니다.

    은 물론 당신은 또한 그냥 포트 번호를 지정할 수 있습니다

    query("localhost", "8080"); 
    

    는 서버가 청취자의 바인드 된 포트 번호를 선택합니다.

+0

아, 그건 좀 더 분명합니다. 내가 직면 한 문제는 FastCGI 서버가 어떤 포트에 바인딩되어 있는지 알 수 없다는 것입니다. 그리고 그렇지 않다면 어떻게 바인딩 할까? (spawn-fcgi를 사용하는 대신 프로그래밍 방식으로)? – Dave

+0

CGI [빠른 CGI 지원 서버 필요] (http://www.fastcgi.com/devkit/doc/fcgi-devel-kit.htm#S4)를 실행하려면 해당 서버 목록이 있어야합니다. 여기 http://www.fastcgi.com/drupal/node/3 – sehe