2012-12-08 91 views
0

我寫了一個非常非常簡單的HTTP服務器調用哪個我寫的, 一個簡單的CGI程序,但我的HTTP服務器無法顯示在我的瀏覽器CGI程序的結果。 我的HTTP服務器的部分代碼如下。http服務器調用CGI PROGRM

while(1) 
{ 
    struct sockaddr_in client_addr; 
    int addrlen = sizeof(client_addr); 

    /*Accept*/ 
    if((clientfd = accept(sockfd, (struct sockaddr *)&client_addr, (socklen_t*)&addrlen)) < 0) 
    { 
     perror("Accpet Error"); 
     close(sockfd); 
     exit(-1); 
    } 
    else 
    { 
     /*Fork process*/ 
     if((child = fork()) < 0) 
     { 
      perror("Fork Error"); 
      close(sockfd); 
      exit(-1); 
     } 
     else if(child == 0) 
     {  
      int fd[2]; //pipe a fd 
      close(sockfd); 
      setvbuf(stdin, NULL, _IONBF, 0); 
      setvbuf(stdout, NULL, _IONBF, 0); 
      setvbuf(stderr, NULL, _IONBF, 0); 
      buffer1.clear(); 
      buffer1.resize(VECTOR_SIZE); 
      while(1) 
      { 
       if((res = recv(clientfd, buffer1.data(), buffer1.size(), 0)) > 0) 
       { 

        string token = "QUERY_STRING=" + buffer1.data(); 
        pipe(fd); 
        dup2(fd[1], STDOUT_FILENO); 
        close(fd[0]); 
        execlp("cgi", "cgi", NULL); 
        //if the bug fixed, will use `execvpe` here 
        cout << "fail" << endl; 
       } 


      } 
     } 
     else  
     { 
      //exit(0); 
      close(clientfd); 
     } 
    } 

} 

而且,我的CGI程序只是 string reply = "HTTP/1.1 200 OK\nTEST"; cout << reply;
但瀏覽器不能顯示的結果和超時。

回答

0

您的HTTP響應和內容之間需要2個CRLF。此外,大多數瀏覽器可能不會在沒有至少設置Content-Type標頭的情況下顯示內容。出於您的目的,您應該設置Content-Type:文本/純文本測試目的。如果您打算提供其他MIME類型,則需要在CGI中進行說明。

正如你可能會聽到別人的,他們會好奇,爲什麼你正在嘗試這個...我會記在一個學術活動或只是好學......但有一點你要do負責將響應代碼和狀態返回給HTTP服務器本身,而不是CGI。

+1

Tkank你了,這是我的學術活動,問題是內容類型就像你說的,我的'DUP2()',我應該DUP標準輸出到'clientfd'。 – Andy