Internet相關開發(VC)

來源:互聯網
上載者:User

1.1 如何編寫CGI程式


CGI的工作原理介紹:CGI(Common Gateway Interface)是一個WEB伺服器提供資訊服務的標準介面,通過這樣一個介面,WEB伺服器能夠執行程式,並將程式輸出的資訊返回給瀏覽器。因為在WEB網上的資料都是靜態,通過CGI程式能夠動態處理瀏覽者的請求,如儲存使用者輸入的資訊,根據使用者資訊返回相關的資料等等。當用戶端發送一個CGI請求給WEB伺服器後,WEB伺服器將根據CGI程式的類型決定資料向CGI程式的傳送方式,一般來講是通過標準輸入/輸出流和環境變數來與CGI程式間傳遞資料。


CGI輸入輸出原理

CGI的輸入/輸出方法:CGI程式通過標準輸入(STDIN)和標準輸出(STDOUT)來進行輸入輸出,STDIN和STDOUT是兩個預先定義好的檔案指標。你可以利用檔案讀寫函數來對其進行操縱。

此外CGI程式還通過環境變數來得到輸入,只不過環境變數中提供的是一些常用的資訊,並且通常不包括使用者在WEB頁面中輸入的資訊(除使用下面講的GET方法時,通過檢查環境變數QUERY_STRING來得到輸入資料),而STDIN通常用來傳遞使用者輸入的資訊。在普通CGI程式開發中我們需要關心的環境變數有以下這些:

一部分是與WEB伺服器有關的環境變數:

  • SERVER_NAME WEB伺服器名稱
  • SERVER_PORT WEB伺服器監聽地址
  • SERVER_PROTOCOL 用於發送請求的協議名稱和版本
  • SERVER_SOFTWARE WEB伺服器名稱和版本

一部分是與運行CGI有關的:

  • REQUEST_METHOD 資料傳送(資訊傳遞)方法
  • CONTENT_LENGTH 資料長度
  • QUERY_STRING 所傳送的資料
  • REMOTE_ADDR 客戶方IP地址
  • REMOTE_HOST 客戶方主機名稱程

一部分是與客戶方有關的:

  • HTTP_USER_AGENT 客戶瀏覽器名稱
  • HTTP_ACCEPT 客戶機所能支援的MIME類型列表
  • HTTP_REFERER 客戶機中前一文檔的URL

 

在輸入時所使用的POST/GET方法:在WEB頁面向CGI發送資料時通常採用兩種方法:GET/POST,GET方法將資料附加在URL後發送,如:/cgi/a_cgi_test.exe?your_data,CGI程式通過檢查環境變數QUERY_STRING來得到輸入資料。而POST方法則會將資料送入CGI程式的STDIN輸入資料流。在表單(FORM)中的各個變數都會成為name=value的形式向WEB伺服器發送,多個資料間用&分隔,如:name=value&name2=value2。其中名字(name,name2)是Form中定義的INPUT、SELECT或TEXTAREA等標置(Tag)名字,值是使用者輸入或選擇的標置值。

有了上面的知識我們就可以馬上寫一個簡單的CGI程式了。代碼如下:

void main(void){// 本程式將使用者輸入的資料列印出來fprintf(stdout,"content-type: text/plain/n/n");// 輸出一個CGI標題,這行代碼的意義後面會講解char *pszMethod;pszMethod = getenv("REQUEST_METHOD");if(strncmp(pszMethod,"GET") == 0){// GET method//讀取環境變數來擷取資料fprintf(stdout,"input data is :/n%s",getenv("QUERY_STRING"));}else{// POST method//讀取STDIN來擷取資料int iLength=atoi(getenv("CONTENT_LENGTH"));fprintf(stdout,"input data is :/n");for(int i=0;i<iLength;i++){char cGet=fgetchar(stdin);fputchar(stdout,cGet);}}}

 

如上面說講,在CGI程式輸出時必須先輸出一個CGI標題,標題共有以下三類:

  • Location: 標題,指明輸出另一個文檔的URL,例如 fprintf(stdout,"Location: http://www.vchelp.net//n/n");
  • Content-Type: 標題,指明發送的資料的MIME類型,例如 fprintf(stdout,"Content-Type: text/html/n/n");
  • Status: 標題,指明HTTP狀態代碼,例如 fprintf(stdout,"Status: 200/n/n");

注意每種標題後都必須跟一個換行和一個空行。

 

MIME類型以類型/子類型的形式來表示,下面是一些常用的類型/子類型的組合:

  • Text/plain 普通文本類型
  • Text/html HTML格式的文本類型
  • Audio/basic 八位音效檔格式,尾碼為.au
  • Video/mpeg MPEG檔案格式
  • Video/quicktime QuickTime檔案格式
  • Image/gif GIF圖形檔案
  • Image/jpeg JPEG圖形檔案
  • Image/x-xbitmap X bitmap圖形檔案,尾碼為.xbm

 

有了上面的知識我們就可以寫出一些CGI程式,首先需要對輸入資料進行分析,方法為:每當找到字元=,標誌著一個Form變數名字的結束;每當找到字元& ,標誌著一個Form變數值的結束。請注意輸入資料的最後一個變數的值不以&結束。這樣我們可以將輸入資料分解為一組一組的指。

但隨後會發現CGI的輸入並不規則,例如有時會出現類似下面格式的輸入字元號串:filename=hello&cmd=world+I%27,這是因為瀏覽器對一些上傳的特殊字元進行了編碼,所以在將資料分解開後需要進行解碼,解碼規則為:+:將+轉換成空格符;%xx:用其十六進位ASCII碼值表示的特殊字元(%做為轉意符)。根據值xx將其轉換成相應的ASCII字元。對Form變數名和變數值都要進行這種轉換。下面是一個對Form資料進行分析並將結果回送給Web伺服器的CGI程式。

  #include   #include   #include   int htoi(char *);  main()  {   int i,n;  char c;  printf (″Contenttype: text/plain/n/n″);  n=0;  if (getenv(″CONTENT-LENGTH″))   n=atoi(getenv(″CONTENT-LENGTH″));  for (i=0; i<n;i++){   int is-eq=0;  c=getchar();  switch (c){   case ′&′:    c=′/n′;    break;   case ′+′:    c=′ ′;    break;   case ′%′:{    char s[3];    s[0]=getchar();    s[1]=getchar();    s[2]=0;    c=htoi(s);    i+=2;   }   break;  case ′=′:   c=′:′;   is-eq=1;   break;  };  putchar(c);  if (is-eq) putchar(′ ′);  }  putchar (′/n′);  fflush(stdout);  }  /* convert hex string to int */  int htoi(char *s)  {   char *digits=″0123456789ABCDEF″;  if (islower (s[0])) s[0]=toupper(s[0]);  if (islower (s[1])) s[1]=toupper(s[1]);  return 16 * (strchr(digits, s[0]) -strchr (digits,′0′))  +(strchr(digits,s[1])-strchr(digits,′0′));  }

上面的程式首先輸出一個MIME頭資訊給Web伺服器,檢查輸入中的字元數,並迴圈檢查每一個字元。當發現字元為&時,意味著一個名字/值對的結束,程式輸出一個空行;當發現字元為+時,將它轉換成空格; 當發現字元為%時,意味著一個兩字元的十六進位值的開始,調用htoi()函數將隨後的兩個字元轉換為相應的ASCII字元;當發現字元為=時,意味著一個名字/值對的名字部分的結束,並將它轉換成字元:。最後將轉換後的字元輸出給Web伺服器。

 

開發CGI程式可以按照下面的步驟進行:
1、判斷資料輸入方法為GET或是POST。
2、讀取資料,根據分隔字元號&分解每個接收的表單變數,並同時對資料進行解碼。
3、處理資料。
4、輸出CGI標題,輸出HTML資料。
5、退出。

利用C語言開發CGI需要自己對輸入的資料進行分析,但字元號串處理並非C語言的強項,所以我向大家推薦一套我認為比較不錯的開發包,CGIC,(由http://www.boutell.com/boutell/免費提供)。我對開發包中所提供的檔案進行了少量的修改,並用VC6編譯成為LIB。下載後可以看看該開發包所提供的說明,該說明很詳細不但給出例子代碼而且對各個函數都有詳細的解說。

返回

著作權 聞怡洋 http://www.vchelp.net/

1.2 一種更親切的CGI開發系統WinCGI


CGI的開發在某種角度來說過於複雜,主要是體現在擷取環境變數和分解/解碼資料上面。在Windows系統中可以使用WinCGI系統來進行開發。WinCGI的優點就在於減輕了開發人員分解/解碼資料的負擔,而且提供統一的輸入輸出方式供使用。

在WinCGI程式執行時第一個參數會是一個檔案名稱,如:yourCGI.exe para.txt,在該檔案中記錄了所有的環境變數資訊和參數資訊,而且該檔案的結構與INI檔案結構相同,所以利用Windows提供的標準函數:GetPrivateProfileString就可以取出所有的參數。而且檔案中的資料全部已經經過解碼,你可以直接使用。

在參數檔案中有以下幾個區(Section)

  • [CGI]
  • [Accept]
  • [System]
  • [Extra Headers]
  • [Form Literal]
  • [Form External]
  • [Form File]
  • [Form Huge]

檔案格式如同:

[CGI]CGI Version=CGI/1.2 (Win)Query String=XXXXXX[Section]key=valuekey=value...

在這個參數檔案中對我們特別有用的是以下一些資料:

 

[CGI]區中的各個關鍵字記錄了系統的參數和對方瀏覽器和對方IP地址等等資訊。下面列出一些常用的關鍵字:

  • Request Method:傳送資料的方式,如果傳送方式為GET,你也可以通過檢查Query String關鍵字的值來取得傳送來的資料,否則就需要通過讀取[Form Literal]區來取得輸入。
  • Request Protocol:所使用的協議和版本,如HTTP/1.0。
  • From:瀏覽器使用者的郵件地址。
  • User Agent:瀏覽器名稱,如Netscape,Internet Explorer。
  • Content Type:上傳資料的類型,格式如type/subtype
  • Content Length:上傳資料的長度
  • Content File:當資料過長時通過寫如該關鍵字所指明的檔案來儲存資料。
  • Server Name:WEB伺服器的網路位址名稱。
  • Server Software:WEB伺服器的軟體名稱和版本。
  • Server Port:WEB伺服器監聽的連接埠。
  • CGI Version:伺服器上CGI系統的版本。
  • Remote Address:用戶端的IP地址。

 

[CGI]區中的各個關鍵字記錄了系統的參數和對方瀏覽器和對方IP地址等等資訊。如果傳送方式為GET,則需要檢查Query String關鍵字的值。

[ACCEPT]區中的關鍵字記錄了客戶方瀏覽器可以接受的資料類型。所以可以看出[CGI]區和[ACCEPT]區中的資訊和普通CGI中的環境變數的值沒有區別。

[SYSTEM]區是一個很重要的區,GMT Offset關鍵字表示客戶方的時區,Output File關鍵字為輸出檔案的檔案名稱,因為在WinCGI中你不需要直接向輸出資料流中寫資料,取而代之的是使用臨時檔案來儲存資料,在CGI程式退出後WinCGI系統會將該檔案的內容返回給客戶並刪除該檔案(同時也刪除調用過程中的所有臨時檔案)。

接下來的[Form Literal]區包含有經過解碼的資料。原本格式為:key=value&key=value&...的資料經過解碼後被存放於這個區,但是一些例外的情況就要使用[Form External]和[Form Huge]區。在[Form External]區中資料格式如同:key=pathname length,當上傳的字串長度大於254時,就會使用這個區,pathname指明了包含被解碼後的字元存放的檔案,length為字串長度。當上傳的資料長度大於64K時,資料會被存放入一個獨立的檔案,該檔案的檔案名稱由[System]區中的Content File關鍵字指明。[Form Huge]區中資料格式如同:key=offset length其中offset為該資料在檔案中的起始位置,length為資料的長度。

下面有一個例子:設輸入為,a_cgi_sample.exe?name=your_name&email=your@mail.com&memo=length_gt_254
則檔案中包含資料的幾個區形式如下:

[Form Literal]name=your_nameemail=your@mail.com[Form External];假設memo欄位長度為500memo=a_temp_file 500

 

最後給出一個WinCGI程式的虛擬碼輪廓:

void main(int argc,char** argv){if(argc == 1)error raise; //無法得到設定檔char szCfgFile[]=argv[1];Read [Form Literal] section for input datachar szOutFile[]=Read "Output File" key from [System] section;fopen(szOutFile){write result to outFileclose outFile}return ;//退出}

 

總的說來,WinCGI程式與普通CGI的程式的區別不大,只是在輸入輸出的方法上略有區別。

返回

著作權 聞怡洋 http://www.vchelp.net/

1.3 利用ISAPI開發CGI程式


ISAPI(Internet Server API)最初是微軟為IIS伺服器所提供的一種CGI應用開發介面,其主要的目的也是為CGI開發提供好的開發介面,如果不負責的講ISAPI也可以認為是類似WinCGI的一種開發模式,只不過ISAPI通過映射宏來取得使用者表單傳送的參數。這一點上和MFC訊息映射宏很相似。

當然ISAPI的推出同時還具備了很多其他的特性:

  • ISAPI以DLL動態串連庫的方式實現,所以載入較普通的EXE運行程式快,而且系統不會在使用完後馬上清除掉DLL在記憶體中的空間,所以再次使用時會獲得更快的速度。
  • ISAPI在調用者的內部以線程方式運行,所以和CGI進程相比較需要的Runspace也更小。
  • 在同一個DLL中可以集中多個處理函數,並且通過映射宏來指明不同的函數分別對什麼樣的請求來進行處理。
  • 由於與IIS的整合,所以可以利用ISAPI開發ISAPI過濾器。通過過濾器可以完成例如使用者權限檢測,資料加密,壓縮,日誌等功能,IIS伺服器的功能也可以通過ISAPI過濾器來得到增強。

到目前為止,很多非M$的WEB伺服器也都添加了對ISAPI的支援。

 

在同一個DLL中可以集中多個處理函數,所以執行ISAPI的請求和執行普通CGI的請求有一點區別,在URL中需要填寫如下形式http://.../cgi-bin/test.dll?function_name&name=xxx&email=yyy,function_name表示的就是功能名稱,為了能夠正確處理你必須將其映射到DLL中的一個處理函數上。對與未映射的功能都將由一個預設函數處理。

VC4.2以上版本為建立一個ISAPI程式提供了嚮導程式,在建立工程時選擇ISAPI Extension Wizard並在以後的對話方塊中選擇建立伺服器擴充和輸入相關的資訊就可以了。

一個最簡單的ISAPI程式至少包含了一個由CHttpServer類所派生的新類,並且在該類中進行了基本的映射,重載了BOOL GetExtensionVersion(HSE_VERSION_INFO* pVer)函數和提供了形式如void Default(CHttpServerContext* pCtxt)的成員函數。幸運的是嚮導程式已經為我們做好了這一切並建立了最基本的代碼。

Default函數用於處理沒有帶參數首先我們修改Default函數中的代碼,首先我們該寫其中的相關代碼成為如下:

void CTestisaExtension::Default(CHttpServerContext* pCtxt){//Print the <HTML> <BODY> tags.StartContent(pCtxt);//Print the title.WriteTitle(pCtxt);*pCtxt << _T("<p>示範</p>");*pCtxt << _T("<p>目前是Default成員函數其作用</p>");//Print </HTML> </BODY> tags.EndContent(pCtxt);}

然後用以下方式調用:http://.../cgi-bin/test.dll?Default或http://.../cgi-bin/test.dll?。你就會看到輸出的HTML頁面了。

 

 

<FORM ACTION="test.dll?Add" METHOD=POST><INPUT NAME="name"><INPUT NAME="id"><INPUT TYPE=SUBMIT></FORM>

上面表單要求使用者輸入了使用者名稱和ID號,所以傳送的資料形式形式應該如同:http://.../test.dll?Add&name=xxx&id=yyy,我們可以通過處理命令映射宏來指明處理命令的函數,然後通過參數映射宏對資料進行分解,分解後的資料將會存放入指定的變數。使用方法為:

ON_PARSE_COMMAND(Add, CTestExtension, ITS_PSTR ITS_I4)ON_PARSE_COMMAND_PARAMS("name id")

ON_PARSE_COMMAND宏中需要指明函數名,類名和參數類型列表,ON_PARSE_COMMAND_PARAMS宏中需要根據前一個宏中所列出的參數列表來指明表單中的變數名稱列表。最後一步就是定義一個名稱與請求URL中?後命令名稱相同的成員函數,參數的設定要與ON_PARSE_COMMAND宏中的參數列表定義相符合,在這個例子中為:
void CTestExtension::Add(CHttpServerContext* pCtxt,LPTSTR pszName,int iID)。參數類型列表中可以使用下面的類型後面為該類型的說明:

  • ITS_EMPTY 無資料
  • ITS_PSTR 字串LPCSTR
  • ITS_I2 short
  • ITS_I4 long
  • ITS_R4 float
  • ITS_R8 double

 

下面我們看一個更複雜的表單,表單定義如下:

<FORM ACTION="test.dll?Delete" METHOD=POST><INPUT NAME="name"><INPUT NAME="month"><SELECT NAME="mode"><OPTION VALUE=1>All<OPTION VALUE=2>Before<OPTION VALUE=3>After<INPUT TYPE=HIDDEN NAME=pwd VALUE=xxx><INPUT TYPE=SUBMIT></FORM>

定義映射和處理函數如下:

ON_PARSE_COMMAND(Add, CTestExtension, ITS_PSTR ITS_I4 ITS_I4 ITS_PSTR)ON_PARSE_COMMAND_PARAMS("name month mode pwd")void CTestExtension::Add(CHttpServerContext* pCtxt,LPTSTR pszName,int iMonth,int iMode,LPTSTR pszPwd)。

 

ISAPI程式的輸出:在所有的命令處理函數中第一個參數都是CHttpServerContext*指標,我們所有的輸出都要通過它進行,在CHttpServerContext類中定義了<<操作符,通過該操作符我們可以方便的輸出字串,數字,位元據。輸出的方法為:

*pCtxt<<"this is a string";*pCtxt<<'c';*pCtxt<<10;

可以看得出輸出是很簡單的,一個完整的輸出過程應該是如同下面的形式:

StartContent(pCtxt);//開始輸出WriteTitle(pCtxt);//輸出頭部資訊,相當於輸出<TITLE>*pCtxt << "your string";EndContent(pCtxt);//結束輸出

 

我們所使用的ISAPI擴充類是由CHttpServer所派生,可以調用CHttpServer::AddHeader來指明返回資料的類型,例如下面的代碼示範了輸出純文字:

void CTestisaExtension::Default(CHttpServerContext* pCtxt){AddHeader(pCtxt, "Content-type = text/plain/r/n");(*pCtxt) << "Hello world!/r/n"; }

我們可以重載某些函數來達到加強控制的目的,可重載的函數有以下這些:

  • virtual LPCTSTR CHttpServer::GetTitle( ) const;返回<TITLE>部分資訊
  • virtual BOOL CHttpServer::OnParseError( CHttpServerContext* pCtxt, int nCause );錯誤處理
  • virtual void CHttpServer::StartContent( CHttpServerContext* pCtxt ) const;輸出<HTML><BODY>部分資訊
  • virtual void CHttpServer::EndContent( CHttpServerContext* pCtxt ) const;輸出</BODY></HTML>部分資訊
  • virtual void CHttpServer::WriteTitle( CHttpServerContext* pCtxt ) const;輸出<TITLE></TITLE>部分資訊

 

此外我們可以在命令處理函數中利用CHttpServerContext指標來得到CGI中的相關環境變數,在CHttpServerContext中有一個成員變數m_pECB為下面的結構指標。

typedef struct _EXTENSION_CONTROL_BLOCK {    DWORD     cbSize;                              //IN 該結構長度    DWORD     dwVersion                            //IN 版本    HCONN     ConnID;                              //IN 串連上下文    DWORD     dwHttpStatusCode;                   //OUT 狀態代碼    CHAR      lpszLogData[HSE_LOG_BUFFER_LEN];    //OUT    LPSTR     lpszMethod;                          //IN 環境變數REQUEST_METHOD    LPSTR     lpszQueryString;                     //IN QUERY_STRING    LPSTR     lpszPathInfo;                        //IN PATH_INFO    LPSTR     lpszPathTranslated;                  //IN PATH_TRANSLATED    DWORD     cbTotalBytes;                        //IN CONTENT_LENGTH    DWORD     cbAvailable;                         //IN    LPBYTE    lpbData;                             //IN    LPSTR     lpszContentType;                     //IN CONTENT_TYPE...其他資訊在此忽略} EXTENSION_CONTROL_BLOCK, *LPEXTENSION_CONTROL_BLOCK;

 

返回

著作權 聞怡洋 http://www.vchelp.net/

1.4 利用WinInet開發Internet程式


M$所提供的WinInet開發包是作為ActiveX技術中的一部分,後來MS對WinInet API進行了封裝並提供了相應的MFC類。WinNet開發包的作用是提供了對HTTP FTP Gopher協議的支援,使開發人員在開發Internet程式時避免編寫底層協議相關的代碼。此外WinInet很多功能都是與IE有聯絡的,比如說可以使用IE中的設定和使用IE緩衝中的資料。本節主要將內容集中在HTTP協議的使用上。

WinInet中的CInternetSession是管理會話的類,一般來講如果要使用WinInet功能都需要建立一個會話,然後在該會話的基礎上使用資料存取功能。CInternetSession的建構函式中接收四個參數

CInternetSession( LPCTSTR pstrAgent = NULL, //應用程式名稱,可以自己定義DWORD dwContext = 1, //上下文標記,如果使用回調功能時這個值將給傳送給回呼函數DWORD dwAccessType = INTERNET_OPEN_TYPE_PRECONFIG, //LPCTSTR pstrProxyName = NULL, //CERNProxy 伺服器地址,一般設定為NULLLPCTSTR pstrProxyBypass = NULL, //Proxy 伺服器地址DWORD dwFlags = 0 );//標記,一般設定為0

 

dwAccessType可以為:

  • INTERNET_OPEN_TYPE_PRECONFIG 使用IE中的串連設定
  • INTERNET_OPEN_TYPE_DIRECT 直接連接到伺服器
  • INTERNET_OPEN_TYPE_PROXY 通過Proxy 伺服器進行串連

 

當dwAccessType為INTERNET_OPEN_TYPE_PROXY時指明Proxy 伺服器地址。

dwFlags可以為:

  • INTERNET_FLAG_DONT_CACHE 不在緩衝中儲存取得的內容
  • INTERNET_FLAG_OFFLINE 離線方式,
  •  

 

在建立會話後就可以利用CInternetSession::OpenURL開啟一個URL,並讀取資料,函數原型為:

CStdioFile* OpenURL( LPCTSTR pstrURL, //檔案URL地址DWORD dwContext = 1, //上下文IDDWORD dwFlags = INTERNET_FLAG_TRANSFER_ASCII, //標記LPCTSTR pstrHeaders = NULL, //發送到伺服器的資料頭DWORD dwHeadersLength = 0 );//發送到伺服器的資料頭長度

dwFlags可以為:

  • INTERNET_FLAG_RELOAD 強制重讀資料
  • INTERNET_FLAG_DONT_CACHE 不儲存到緩衝
  • INTERNET_FLAG_TRANSFER_ASCII 使用文本資料
  • INTERNET_FLAG_TRANSFER_BINARY 使用位元據

 

OpenURL的傳回值為CStdioFile檔案指標,函數會根據使用的協議返回不同的檔案類指標,但這些類都是CStdioFile的衍生類別。

URL type Returns
file:// CStdioFile*
http:// CHttpFile*
gopher:// CGopherFile*
ftp:// CInternetFile*

然後通過CStdioFile::ReadString來讀取檔案內容。

 

本文給出的例子就是利用WinInet通過HTTP協議讀取網上檔案。

完成這一功能的代碼非常簡單,當然代碼中少了各種錯誤偵測。

void CSp_14Dlg::GetURL(void){UpdateData();CInternetSession sess;//建立會話CHttpFile* pF=(CHttpFile*)sess.OpenURL(m_szURL);//開啟檔案CString szData,szAllData;while(pF->ReadString(szData)){//讀取檔案szAllData+="/r/n";szAllData+=szData;}pF->Close();sess.Close();m_szHTML=szAllData;UpdateData(FALSE);}

下載示範代碼

 

這裡我只講了最簡單的應用,如果你需要更強的控制性或是發送表單(FORM),則需要產生CHttpConnection對象和CHttpFile對象。

 

 

 

返回

著作權 聞怡洋 http://www.vchelp.net/

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.