Latest web development tutorials

C ++ 웹 프로그래밍

CGI는 무엇인가?

  • 공통 게이트웨이 인터페이스 (CGI)은, 정보가 웹 서버와 클라이언트 측 스크립트간에 교환되는 방식을 정의하는 표준이다.
  • 다음과 같이 CGI 규격은 현재 정의 된 NCSA, NCSA의 CGI에 의해 유지된다 :
  • 공용 게이트웨이 인터페이스 (CGI)는 (예 : HTTP 서버) 정보 서버 도킹 인터페이스 표준 외부 프로그램에 대한 게이트웨이입니다.
  • 현재 버전은 CGI / 1.1, CGI / 1.2 버전이 진행되고있다.

웹 브라우저

더 나은 CGI의 개념을 이해하기 위해, 하이퍼 링크를 클릭하여 특정 페이지 나 URL을 검색하고, 어떻게 볼 수 있습니다.

  • 브라우저, 즉, 파일 이름을 HTTP 웹 서버에 연결하고, URL을 요청한다.
  • 웹 서버는 URL을 해석하고 파일 이름을 찾을. 당신이 요청 된 파일을 찾을 경우, 웹 서버, 그렇지 않으면 당신은 잘못된 파일을 요청하고 있음을 나타내는 오류 메시지를 보내, 다시 브라우저로 파일을 전송합니다.
  • 웹 브라우저는 웹 서버로부터 응답을 얻고, 상기 응답에 기초하여 파일 또는 오류 메시지를 표시하기 위해 수신한다.

그러나, 관계없이 파일 디렉토리를 요청할 때의, HTTP 서버를 구축 할 수있는 방법에서, HTTP 서버는 파일을 돌려주는 것이 아니라, 프로그램 실행과 생성 된 출력의 구현 형태의 브라우저 화면으로 다시 보내진다 아웃.

공용 게이트웨이 인터페이스 (CGI)는 웹 서버와 클라이언트가 표준 프로토콜 상호 작용에서 작동하는 응용 프로그램 (CGI 프로그램 또는 CGI 스크립트라고합니다)를 확인하는 것입니다. 이 CGI 프로그램을 준비하는 등 파이썬, 펄, 셸, C 또는 C ++를 사용할 수 있습니다.

CGI 차트

다음 그림은 CGI 아키텍처를 보여줍니다

CGI 아키텍처

웹 서버 구성

당신이 CGI 프로그래밍을하기 전에, 웹 서버가 CGI를 지원하고, CGI 프로그램을 처리하도록 구성되어 있는지 확인하십시오. HTTP 서버에 의해 실행되는 모든 CGI 프로그램은 디렉토리를 미리 구성 할 수있다. 의 / var / www /에서 CGI - bin에 이름 관례 CGI 디렉토리라는이 디렉토리. CGI 실행 파일의 C ++이지만, 그러나 협약에 의해, 상기 연장.cgi로한다.

기본적으로 아파치 웹 서버는 CGI 프로그램은 / var / www /에서의 cgi-bin에 실행되도록 구성 할 것입니다. 당신이 CGI 스크립트를 실행하려면 다른 디렉토리를 지정하려면 httpd.conf 파일에서 다음 부분을 수정할 수 있습니다 :

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options ExecCGI
   Order allow,deny
   Allow from all
</Directory>
 
<Directory "/var/www/cgi-bin">
Options All
</Directory>

여기에, 우리는 당신이 펄이나 쉘 등 모든 CGI 프로그램을 실행할 수 있습니다, 당신은 이미 웹 서버가 성공적으로 실행할 수 있습니다 가정합니다.

첫 번째 CGI 프로그램

다음 C ++ 프로그램을 고려 :

#include <iostream>
using namespace std;
 
int main ()
{
    
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Hello World - 第一个 CGI 程序</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<h2>Hello World! 这是我的第一个 CGI 程序</h2>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

이전 코드를 컴파일, 실행 파일은 cplusplus.cgi 명명하고,이 파일은 / var / www /에서의 cgi-bin 디렉토리에 저장됩니다. CGI 프로그램을 실행하기 전에, 파일 모드를 변경하려면chmod를 755 cplusplus.cgi UNIX 명령을 사용하여 파일이 실행되어 있는지 확인하시기 바랍니다.액세스 실행 파일은 다음과 같은 출력이 표시됩니다 :

안녕하세요 세계! 이것은 내 첫 번째 CGI 프로그램입니다

상기 C ++ 프로그램은 화면에 표시되며,이 STDOUT 출력 파일에 쓰여진 간단한 프로그램이다. 여기서, 주목할만한 출력하는콘텐츠 형식의 첫 번째 줄 : text / html과 \연구 \ n 개의 \ 연구 \ n을. 이 라인은 브라우저로 다시 전송하고, 브라우저 윈도우의 컨텐츠 유형에 표시 할 예정이다. 더욱 복잡한 CGI 프로그램을 작성하는 파이썬을 사용하기 위해 당신은 CGI의 기본 개념을 이해해야합니다. C ++ CGI 프로그램은 상호 작용 (예 : RDBMS)을 임의의 다른 외부 시스템과 사용될 수있다.

HTTP 헤더 정보

광고콘텐츠 유형 : 텍스트 / HTML \ r에 \ n의 \ R \ 없음이 HTTP 헤더 정보의 일부이며, 이는 더 페이지의 내용을 이해하기 위해, 브라우저로 전송한다.다음과 같이 HTTP 헤더 정보의 형태이다 :

HTTP 字段名称: 字段内容
 
例如
Content-type: text/html\r\n\r\n

다른 중요한 HTTP 헤더 정보는 이것들은 종종 CGI 프로그램에 사용됩니다있다.

头信息 描述
Content-type: MIME 字符串,定义返回的文件格式。例如 Content-type:text/html。
Expires: Date 信息变成无效的日期。浏览器使用它来判断一个页面何时需要刷新。一个有效的日期字符串的格式应为 01 Jan 1998 12:00:00 GMT。
Location: URL 这个 URL 是指应该返回的 URL,而不是请求的 URL。你可以使用它来重定向一个请求到任意的文件。
Last-modified: Date 资源的最后修改日期。
Content-length: N 要返回的数据的长度,以字节为单位。浏览器使用这个值来表示一个文件的预计下载时间。
Set-Cookie: String 通过string设置 cookie。

CGI 환경 변수

모든 CGI 프로그램은 다음과 같은 환경 변수에 액세스 할 수 있습니다. CGI 프로그램 작성이 변수는 매우 중요한 역할을한다.

变量名 描述
CONTENT_TYPE 内容的数据类型。当客户端向服务器发送附加内容时使用。例如,文件上传等功能。
CONTENT_LENGTH 查询的信息长度。只对 POST 请求可用。
HTTP_COOKIE 以键 & 值对的形式返回设置的 cookies。
HTTP_USER_AGENT 用户代理请求标头字段,递交用户发起请求的有关信息,包含了浏览器的名称、版本和其他平台性的附加信息。
PATH_INFO CGI 脚本的路径。
QUERY_STRING 通过 GET 方法发送请求时的 URL 编码信息,包含 URL 中问号后面的参数。
REMOTE_ADDR 发出请求的远程主机的 IP 地址。这在日志记录和认证时是非常有用的。
REMOTE_HOST 发出请求的主机的完全限定名称。如果此信息不可用,则可以用 REMOTE_ADDR 来获取 IP 地址。
REQUEST_METHOD 用于发出请求的方法。最常见的方法是 GET 和 POST。
SCRIPT_FILENAME CGI 脚本的完整路径。
SCRIPT_NAME CGI 脚本的名称。
SERVER_NAME 服务器的主机名或 IP 地址。
SERVER_SOFTWARE 服务器上运行的软件的名称和版本。

다음 목록 모든 CGI 프로그램을 CGI 변수.

#include <iostream>
#include <stdlib.h>
using namespace std;

const string ENV[ 24 ] = {                 
        "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE",   
        "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING",             
        "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION",         
        "HTTP_HOST", "HTTP_USER_AGENT", "PATH",            
        "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT",      
        "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME",
        "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN",      
        "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL",     
        "SERVER_SIGNATURE","SERVER_SOFTWARE" };   

int main ()
{
    
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 环境变量</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";

   for ( int i = 0; i < 24; i++ )
   {
       cout << "<tr><td>" << ENV[ i ] << "</td><td>";
       // 尝试检索环境变量的值
       char *value = getenv( ENV[ i ].c_str() );  
       if ( value != 0 ){
         cout << value;                                 
       }else{
         cout << "环境变量不存在。";
       }
       cout << "</td></tr>\n";
   }
   cout << "</table><\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

C ++ CGI 라이브러리

실제 예제에서는 CGI 프로그램에서 많은 작업을 수행해야합니다. 우리가 할 수 C ++로 작성된 CGI 라이브러리를 위해 특별히 설계된 프로그램이 ftp://ftp.gnu.org/gnu/cgicc/~~V 다음 단계에 따라 다운로드이 CGI 라이브러리, 라이브러리를 설치는 :

$tar xzf cgicc-X.X.X.tar.gz 
$cd cgicc-X.X.X/ 
$./configure --prefix=/usr 
$make
$make install

당신은 클릭 할 수 있습니다 C ++는 CGI 리브 문서를 라이브러리 문서를 볼.

GET과 POST 방법

당신은 당신이 웹 서버에 브라우저에서 일부 정보를 전달해야 할 때, 이러한 상황이 발생하고, 마지막으로 CGI 프로그램에 전달했을 수 있습니다. 일반적으로 브라우저는 웹 서버에이 정보를 사용하는 방법은 두 가지가 GET 및 POST 방법은 있습니다.

정보를 전달하기 위해 GET 메서드를 사용하여

페이지 요청에 추가 인코딩 된 사용자 정보를 전송하는 방법을 GET. 다음 페이지 및 인코딩 된 정보는 문자로 구분?

http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2

GET 방법은 웹 서버 정보 전송에 브라우저에서 기본 방법, 그것은 문자열의 긴 문자열이 브라우저의 주소 표시 줄에 생성된다. 서버에 전달할 암호 또는 기타 민감한 정보는 GET 메소드를 사용하지 않는 경우. GET 방법은 1024 자까지의 입금 요청 스트링의 크기가 제한된다.

는 GET 방법은 정보를 전송하기 위해 QUERY_STRING HTTP 헤더를 사용하는 사용하는 경우, 액세스 CGI 프로그램에 QUERY_STRING 환경 변수를 사용한다.

당신은 간단한 연결 URL의 키를 유지할 수 있습니다, 당신은 또한 정보를 전송하는 HTML GET 메소드 <FORM> 태그를 사용할 수 있습니다.

단순 URL의 예 : 방법을 받으세요

여기에 프로그램을 hello_get.py 두 값을 전달하는 GET 메소드를 사용하여 간단한 URL입니다.

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

다음 예는 웹 브라우저에 의해 주어진 입력을 처리하기위한cpp_get.cgi의 CGI 프로그램을 생성한다.는 C ++ CGI 라이브러리를 사용함으로써 용이하게 정보 송신에 액세스 할 수

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>  

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
   
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>使用 GET 和 POST 方法</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("first_name");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "名:" << **fi << endl;  
   }else{
      cout << "No text entered for first name" << endl;  
   }
   cout << "<br/>\n";
   fi = formData.getElement("last_name");  
   if( !fi->isEmpty() &&fi != (*formData).end()) {  
      cout << "姓:" << **fi << endl;  
   }else{
      cout << "No text entered for last name" << endl;  
   }
   cout << "<br/>\n";

   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

다음과 같이 이제, 위의 프로그램을 컴파일 :

$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc

cpp_get.cgi를 생성하고, CGI 디렉토리에 넣고 다음 링크에 액세스하려고 :

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

이것은 다음과 같은 결과를

名:ZARA 
姓:ALI 

간단한 형태의 예 : 방법을 GET

여기에, 간단한 예입니다 HTML 양식을 사용하여 버튼이 두 값을 전달 제출합니다. 우리는 입력을 처리하기 위해 동일한 CGI 스크립트 cpp_get.cgi를 사용합니다.

<form action="/cgi-bin/cpp_get.cgi" method="get">
名:<input type="text" name="first_name">  <br />
 
姓:<input type="text" name="last_name" />
<input type="submit" value="提交" />
</form>

다음은 폼의 실제 출력은, 첫 번째와 마지막 이름을 입력 한 결과를 볼 제출 버튼을 클릭합니다.

정보를 전송하기 위해 POST 방법을 이용하여

CGI 프로그램에 정보를 전달보다 신뢰할 수있는 방법은 POST 방법입니다. 그 후 전달? URL에 텍스트 문자열로 메시지 아니지만 전달의 형태로 별도의 메시지에 넣어 것을 제외하고는 GET 방법과 동일한 방법으로 정보를 패키징이 방법. 이 메시지는 CGI 스크립트의 형태로 표준 입력으로 전달됩니다.

우리는 또한 POST 메서드를 처리 할 수 ​​cpp_get.cgi를 사용합니다. 다음의이 HTML 폼의 사용을 통과 버튼 두 값을 제출 이번에 우리는 GET 메소드하지만 POST 방법을 사용하지 않는 데, 동일한 예를 보자

<form action="/cgi-bin/cpp_get.cgi" method="post">
名:<input type="text" name="first_name"><br />
姓:<input type="text" name="last_name" />
 
<input type="submit" value="提交" />
</form>

CGI 프로그램은 상자에 데이터를 전달하는

여러 옵션을 선택해야하는 경우, 우리는 체크 박스를 사용하고 있습니다.

다음 HTML 코드 예제에서는 두 개의 체크 박스가있는 형태이다 :

<form action="/cgi-bin/cpp_checkbox.cgi" 
         method="POST" 
         target="_blank">
<input type="checkbox" name="maths" value="on" /> 数学
<input type="checkbox" name="physics" value="on" /> 物理
<input type="submit" value="选择学科" />
</form>

다음 C ++ 프로그램은 주어진 상자를 입력하여 웹 브라우저를 처리 할 수 ​​cpp_checkbox.cgi 스크립트를 생성합니다.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
   bool maths_flag, physics_flag;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递复选框数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   maths_flag = formData.queryCheckbox("maths");
   if( maths_flag ) {  
      cout << "Maths Flag: ON " << endl;  
   }else{
      cout << "Maths Flag: OFF " << endl;  
   }
   cout << "<br/>\n";

   physics_flag = formData.queryCheckbox("physics");
   if( physics_flag ) {  
      cout << "Physics Flag: ON " << endl;  
   }else{
      cout << "Physics Flag: OFF " << endl;  
   }
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

CGI 프로그램의 라디오 버튼에 데이터를 전송할

만 옵션을 선택해야하는 경우, 우리는 라디오 버튼을 사용합니다.

다음 HTML 코드 예제에서는 두 개의 라디오 버튼이있는 형태입니다 :

<form action="/cgi-bin/cpp_radiobutton.cgi" 
         method="post" 
         target="_blank">
<input type="radio" name="subject" value="maths" 
                                    checked="checked"/> 数学 
<input type="radio" name="subject" value="physics" /> 物理
<input type="submit" value="选择学科" />
</form>

다음의 C ++ 프로그램의 라디오 버튼을 통해 입력 된 웹 브라우저를 처리 cpp_radiobutton.cgi 스크립트를 생성한다.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递单选按钮数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("subject");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Radio box selected: " << **fi << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

CGI 프로그램의 텍스트 영역에 데이터를 전송

당신은 여러 줄의 텍스트를 전송해야 CGI 프로그램, 우리는 TEXTAREA 요소를 사용합니다.

다음 HTML 코드 예제에서는 TEXTAREA 상자 형태입니다 :

<form action="/cgi-bin/cpp_textarea.cgi" 
         method="post" 
         target="_blank">
<textarea name="textcontent" cols="40" rows="4">
请在这里输入文本...
</textarea>
<input type="submit" value="提交" />
</form>

다음의 C ++ 프로그램은 웹 브라우저, 텍스트 영역에 의해 주어진 입력을 처리 cpp_textarea.cgi 스크립트를 생성한다.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递文本区域数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("textcontent");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Text Content: " << **fi << endl;  
   }else{
      cout << "No text entered" << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

드롭 다운 상자를 CGI 프로그램에 데이터를 전달

이 가능한 여러 옵션이 있지만, 하나 또는 두 개의 옵션을 선택할 수 있습니다 때, 우리는 드롭 다운 상자를 사용합니다.

다음 HTML 코드 예제에서는 드롭 다운 상자 형태입니다 :

<form action="/cgi-bin/cpp_dropdown.cgi" 
                       method="post" target="_blank">
<select name="dropdown">
<option value="Maths" selected>数学</option>
<option value="Physics">物理</option>
</select>
<input type="submit" value="提交"/>
</form>

다음 C ++ 프로그램은 주어진 드롭 다운 상자를 통해 입력 웹 브라우저를 처리 할 수 ​​cpp_dropdown.cgi 스크립트를 생성합니다.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递下拉框数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("dropdown");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Value Selected: " << **fi << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

CGI에서 쿠키를 사용하여,

HTTP 프로토콜은 무 상태 프로토콜이다. 하지만, 비즈니스의 웹 사이트, 상이한 페이지 사이의 세션 정보를 유지해야한다. 예를 들어, 여러 단계의 완료 후, 사용자는 등록 페이지로 끝난다. 그러나, 어떻게 모든 페이지에서 사용자의 세션 정보를 유지한다.

많은 경우에, 쿠키 사용 기억하고 필요한 정보를 더 방문자 경험이나 사이트 통계의 추적을위한 사용자 선호도, 구입 의뢰 및 다른 효과적인 방법에 관한 정보를 추적하는 것이다.

작동 원리

쿠키의 형태로 서버가 방문자의 브라우저에 일부 데이터를 전송합니다. 브라우저가 쿠키를 수락하면, 쿠키가 방문자의 하드 드라이브에 기록 된 일반 텍스트로 저장됩니다. 이제, 쿠키를 사이트의 다른 페이지에 방문자를 검색 할 때. 당신이 쿠키를 발견하면, 서버는 저장되어있는 것을 알 수 있습니다.

쿠키는 순수 텍스트 데이터 기록, 다섯 가변 길이 필드이다 :

  • 만료 : 쿠키 유효 기간을.이 필드를 비워두면 방문자가 브라우저를 종료 할 때 쿠키가 만료됩니다.
  • 도메인 : 사이트의 도메인 이름입니다.
  • 경로 : 경로 쿠키 디렉터리 또는 페이지를 설정합니다.당신이 어떤 디렉토리 나 페이지에서 쿠키를 검색 할 경우,이 필드는 비워 둘 수 있습니다.
  • 보안 :이 필드는 단어가 포함 된 경우 "안전한"다음 쿠키는 보안 서버를 통해 검색 할 수 있습니다.이 필드는 제한이 없는지, 비어있는 경우.
  • 이름 = 값 : 키 - 값 쌍의 형태로 쿠키를설정하고받을 수 있습니다.

쿠키 설정

브라우저에 쿠키를 전송하는 것은 매우 간단합니다. 이 쿠키는 콘텐츠 형식 필드 전에 될 것이며, HTTP 헤더를 함께 확인할 수 있습니다. 다음과 같이 쿠키에 대한 사용자 ID 및 암호를 설정하려는 가정, 설정 쿠키 단계는 다음과 같습니다

#include <iostream>
using namespace std;

int main ()
{
 
   cout << "Set-Cookie:UserID=XYZ;\r\n";
   cout << "Set-Cookie:Password=XYZ123;\r\n";
   cout << "Set-Cookie:Domain=www.w3cschool.cc;\r\n";
   cout << "Set-Cookie:Path=/perl;\n";
   cout << "Content-type:text/html\r\n\r\n";

   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 中的 Cookies</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   cout << "设置 cookies" << endl;  
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

이 예에서, 우리는 쿠키를 설정하는 방법을 배웠습니다. 우리는 쿠키를 설정하려면Set-쿠키 HTTP 헤더를 사용합니다.

, 만료 도메인 및 경로 등 여기에 쿠키를 설정하는 몇 가지 특성은 선택 사항입니다이다. 그것은 주목할 가치가있다, 쿠키 라인에서 전송되는"콘텐츠 유형 : 텍스트 / html로 \ 연구 \ 없음 \ 연구 \ n은이전에 설정된다.

setcookies.cgi를 생성 위의 프로그램을 컴파일하고 쿠키를 설정하려면 다음 링크를 사용하려고합니다. 그것은 당신의 컴퓨터에있는 네 개의 쿠키를 설정합니다 :

/cgi-bin/setcookies.cgi

쿠키를 가져옵니다

쿠키는 모든 설정이 매우 간단 검색 할 수 있습니다. 다음과 같이 쿠키는 CGI 환경 변수 HTTP_COOKIE에 저장되고, 그들의 양식이 저장됩니다

key1=value1;key2=value2;key3=value3....

다음의 예는 쿠키를 가져 오는 방법을 보여줍니다.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc cgi;
   const_cookie_iterator cci;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 中的 Cookies</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";
   
   // 获取环境变量
   const CgiEnvironment& env = cgi.getEnvironment();

   for( cci = env.getCookieList().begin();
        cci != env.getCookieList().end(); 
        ++cci )
   {
      cout << "<tr><td>" << cci->getName() << "</td><td>";
      cout << cci->getValue();                                 
      cout << "</td></tr>\n";
   }
   cout << "</table><\n";
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

자, 위의 프로그램은 getcookies.cgi를 생성, 컴파일, 컴퓨터에서 사용 가능한 모든 쿠키를 얻기는 아래의 링크를 사용하려고 :

/cgi-bin/getcookies.cgi

이 세트와 컴퓨터의 다른 모든 사 쿠키 쿠키를 보여주는 목록을 생성합니다 :

UserID XYZ 
Password XYZ123 
Domain www.w3cschool.cc 
Path /perl 

파일 업로드의 예

파일을 업로드하려면 HTML 양식은multipart / form-data로 설정 속성을 ENCTYPE해야합니다.파일 형식으로 입력 태그는 "찾아보기"버튼을 생성합니다.

<html>
<body>
   <form enctype="multipart/form-data" 
            action="/cgi-bin/cpp_uploadfile.cgi" 
            method="post">
   <p>文件:<input type="file" name="userfile" /></p>
   <p><input type="submit" value="上传" /></p>
   </form>
</body>
</html>

이 코드의 결과는 다음과 같은 형태이다 :

서류 :

참고 : 파일을 업로드하기 위해 서버에 저장된에서 위의예는 의도적으로 중지되었습니다. 당신은 당신의 서버에 위의 코드를 시도 할 수 있습니다.

다음은 파일 업로드 스크립트cpp_uploadfile.cpp를 처리하는 데 사용은 다음과 같습니다

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc cgi;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 中的文件上传</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   // 获取要被上传的文件列表
   const_file_iterator file = cgi.getFile("userfile");
   if(file != cgi.getFiles().end()) {
      // 在 cout 中发送数据类型
      cout << HTTPContentHeader(file->getDataType());
      // 在 cout 中写入内容
      file->writeToStream(cout);
   }
   cout << "<文件上传成功>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

위의 예는스트림를 법원에 작성하는 것입니다,하지만 당신은 파일 스트림 및 대상 위치에 파일 업로드 파일의 내용을 열 수 있습니다.