Mtumiaji anapojaza fomu ya html na kubofya kuwasilisha, data hutumwa kwa seva ya wavuti. Seva ya wavuti, iwe Apache, IIS au nyingine, huendesha programu iliyoainishwa kama thamani sifa ya kitendo. Kwa upande wetu hii ni test.cgi. Seva ya wavuti huendesha test.cgi na kuipitisha vigezo katika mfumo wa mfuatano wa maandishi wenye maudhui yafuatayo: name1=value1&name2=value2&....nameN=valueN, i.e. parameter_name=thamani. Mfuatano huu hupitishwa kwa ingizo la kawaida (STDIN) au kama thamani ya kigezo cha QUERY_STRING cha mazingira. Ipasavyo, mstari huu unaweza kusomwa katika programu kwa moja ya njia mbili:
Katika kesi ya kwanza, vigezo vinapitishwa Mbinu ya POST, na ya pili kwa kutumia njia ya GET. Katika kesi ya kwanza, tunasoma kamba kutoka STDIN. Tunapata urefu wa mstari kutoka kwa thamani ya kigezo cha mazingira CONTENT_LENGTH. Katika pili, huhifadhiwa katika kigeugeu cha mazingira cha QUERY_STRING. Thamani ya utofauti wa mazingira inaweza kupatikana kwa kupiga kazi ya getenv. Njia ambayo mfuatano wa vigezo hupitishwa kwa programu ya CGI inaweza kufafanuliwa kama ifuatavyo: strcmp(getenv("REQUEST_METHOD"),"POST"). Ifuatayo utalazimika kuchanganua kamba na kupata maadili ya parameta inayohitajika. Ili sio lazima kufanya hivi kila wakati, tuliandika maktaba ndogo lakini rahisi sana ya ITCGI kwa kuandika hati za CGI. Maktaba hii hukuruhusu kujiondoa kabisa kutoka kwa njia ambayo vigezo hupitishwa, kutoka kwa usimbaji, kutoka kwa kuchanganua kamba. Unaita tu kazi ya GetParamByName, ambayo unapitisha jina la parameta unayopenda na anwani ya mstari ambapo kuokoa thamani. Maktaba pia hukupa idadi ya vitendaji vya kuandika hati za CGI zenye ufanisi na zisizoweza kuguswa.Katika hali rahisi, wakati programu yako haihitaji vigezo, hutahitaji kuchanganua na kusimbua kamba mwenyewe, wala kutumia maktaba yetu kwa hili. Mpango rahisi zaidi wa CGI utakuwa: Kichwa ni sehemu inayohitajika. Inapitishwa kwa seva ya wavuti na huamua kinachofuata. Katika hali nyingi, hii ndio kichwa chako kitakuwa. Inaambia seva ya wavuti ni nambari gani ya HTML inakuja ijayo. Tutafahamu aina nyingine za vichwa baadaye. Kichwa kinaweza kuwa na mistari kadhaa. Mwisho wa kichwa unaonyeshwa na mabadiliko mawili kwa mstari mpya- \n\n. Kusanya programu hii na kuweka faili inayoweza kutekelezwa katika saraka ya /cgi-bin ya tovuti yako. Ipe jina upya ili test.cgi. Hati hii inaweza kupatikana moja kwa moja kupitia kivinjari kwa kuandika kwa mstari wa amri URL, kwa mfano, kwangu inaonekana kama hii http://site/cgi-bin/test.cgi Kwa hivyo, kwenye kivinjari chako utaona mstari: "Hujambo, Ulimwengu!"
Ifuatayo tutaangalia programu ya CGI ya aina moja. Haikubali vigezo vyovyote, lakini inazalisha zaidi habari muhimu- orodha na maadili ya anuwai zote za mazingira. Hati hii itakusaidia unapotatua programu zako za CGI kwenye seva mbalimbali za wavuti. Ukweli ni kwamba vigezo vya mazingira hutofautiana kwenye seva tofauti za wavuti. Kwa hivyo, kwa mfano, kwa Seva ya wavuti ya Apache, njia ya saraka ya tovuti imehifadhiwa katika mabadiliko ya mazingira ya DOCUMENT_ROOT. Kwa seva ya wavuti Mtandao wa Microsoft Seva ya Taarifa thamani hii imehifadhiwa katika PATH_TRANSLATED tofauti. KATIKA mfumo wa uendeshaji Hati ya UNIX ya kuonyesha anuwai zote inaonekana kama hii.
#!/bin/sh echo "aina ya maudhui: maandishi/wazi\n\n" mwangwi env |
GATEWAY_INTERFACE=CGI/1.1 REMOTE_USER=itsoft REMOTE_ADDR=192.168.34.134 QUERY_STRING= REMOTE_PORT=1781 HTTP_USER_AGENT=Mozilla/4.0 (inayotangamana; MSIE 5.0; Windows 98; DigusDOcal=WWWWWWT_tsoloft) SERVER_SIGNATURE= Apache/1.3.12 Seva katika itsoft..3.12 (Unix) PHP/3.0.17 HTTP_CONNECTION=Keep-Alive HTTP_COOKIE=/cgi-bin/authenticate.cgi_LAST=956345778 PATH=/sbin:/usr/sbin:/bin:/ usr/bin:/usr/local/sbin: /usr/local/bin:/usr/X11R6/bin HTTP_ACCEPT_LANGUAGE=ru SERVER_PROTOCOL=HTTP/1..226.32.34 SERVER_PORT=80 SCRIPT_NAME=/cgi-bin/web/env SERVER_NAME=tovuti |
#pamoja na |
Chini ni matokeo ya hati hii kwenye WindowsNT, unaweza kuona ni vigezo ngapi vinavyopatikana kupitia anuwai ya mazingira. Hati kama hiyo ya cgi itakuwa muhimu kwako wakati wa kusanidi hati zako kwenye seva ya mtu mwingine, ambapo anuwai za mazingira zinaweza kutofautiana na zile za karibu nawe. COMSPEC=C:\WINNT\SYSTEM32\COMMAND.COM COMPUTERNAME=JUPITER CONTENT_LENGTH=0 GATEWAY_INTERFACE=CGI/1.1 HTTP_ACCEPT=image/gif, image/x-xbitmap, picha/jpeg, picha/pjpeg, application/vnd.ms-power , application/vnd.ms-excel, applic HTTP_ACCEPT_LANGUAGE=ru HTTP_CONNECTION=Keep-Alive HTTP_HOST=www.oxygensoftware.com HTTP_USER_AGENT=Mozilla/4.0 (inapatana; MSIE 5.01; Windows NT 5.0) HTTP_ACCEPTzipNCSDEVING=off C:\Program Files\Mts\Include INSTANCE_ID=1410 LIB=C:\Program Files\Mts\Lib LOCAL_ADDR=168.144.29.178 NUMBER_OF_PROCESSORS=2 OS2LIBPATH=C:\WINNT\system32\os2\dll; OS=Windows_NT PATH=C:\WINNT\system32;C:\WINNT;C:\Program Files\Mts PATH_TRANSLATED=e:\InetPub\Clients\oxygensoftware.com PATHEXT=.COM;.EXE;.BAT;.CMD; TE_HOST = 194.226.32.34 REQUEST_METHOD=PATA SCRIPT_NAME=/cgi-bin/env.exe SERVER_NAME=www.oxygensoftware.com SERVER_PORT=80 SERVER_PORT_SECURE=0 SERVER_PROTOCOL=HTTP/1.1 SERVER_IOTSYS/EMSTIVE =Microsoft-SOFTWARE=DREMSTIVE=Microsoft. \ WINNT TEMP=C:\temp TMP=C:\temp USERPROFILE=C:\WINNT\Profiles\Mtumiaji Chaguomsingi Ifuatayo, kabla ya kuendelea na uzingatiaji wa hati za cgi zinazokubali na kuchakata vigezo vya kuunda, tutaandika programu rahisi ambayo hutoa vigezo vya fomu ya html ya mstari. Soma hapo juu juu ya jinsi vigezo vya fomu vinasomwa; hapa ninatoa nambari ya chanzo ya programu na matokeo yake kwa fomu ya html iliyoelezewa katika sura ya nne.
#pamoja na |
text=zero&text=zero&list=0&list2=0&textarea=%C7%E4%E5%F1%FC+%F2%E5%EA%F1%F2+%EF%EE+%F3%EC%EE%EB%F7%E0%ED%E8 %FE
Huu ni mfuatano ambao una orodha ya vigezo vyote. Kisha, unaweza kutumia maktaba yetu ya ITCGI au uchanganue mfuatano huu wa vigezo mwenyewe. Soma kuhusu maktaba na matumizi yake ya vitendo katika aya inayofuata.
Utangulizi.
Katika makala hii nataka kuzungumza juu ya interface ya CGI kwa ujumla, utekelezaji wake kwa Windows na matumizi ya lugha ya mkutano hasa wakati wa kuandika programu za CGI. Upeo wa kifungu hiki haujumuishi maelezo kamili ya CGI, kwani kuna bahari ya nyenzo kwenye suala hili kwenye mtandao na sioni sababu ya kuelezea tena yote hapa.
NadhariaCGI.
CGI - (Kiolesura cha Kawaida cha Lango) - Kiolesura cha Kawaida cha Lango. Kama unavyoweza kudhani, kiolesura hiki hutumika kama lango kati ya seva (hapa ninamaanisha programu ya seva) na programu fulani ya nje iliyoandikwa kwa OS ambayo seva hii hii inafanya kazi. Kwa hivyo, CGI inawajibika kwa jinsi data itahamishwa kutoka kwa programu ya seva hadi programu ya CGI na kurudi. Kiolesura haitoi vizuizi vyovyote juu ya kile ambacho programu ya CGI inapaswa kuandikwa ndani; inaweza kuwa faili ya kawaida ya kutekelezwa au faili nyingine yoyote - jambo kuu ni kwamba seva inaweza kuiendesha (katika mazingira ya Windows, kwa mfano, inaweza kuwa faili iliyo na kiendelezi kilichofungwa kwa programu yoyote).
Kuanzia wakati ulipopiga simu (kwa mfano, ulibofya kitufe cha fomu ambacho simu ya programu ya CGI imeambatishwa) mpango wa CGI hadi upokee matokeo kwenye dirisha la kivinjari chako, yafuatayo hufanyika:
Mteja wa wavuti (kama vile kivinjari) huunda muunganisho kwa seva iliyobainishwa kwenye URL;
Mteja wa wavuti hutuma ombi kwa seva, ombi hili kawaida hufanywa kwa kutumia njia mbili za GET au POST;
Data kutoka kwa ombi la mteja (kwa mfano, maadili ya uwanja wa fomu) hupitishwa na seva, kwa kutumia interface ya CGI, kwa programu ya CGI iliyotajwa kwenye URL;
Mpango wa CGI huchakata data ya mteja iliyopokelewa kutoka kwa seva na, kwa kuzingatia usindikaji huu, hutoa majibu kwa mteja, ambayo husambaza kupitia interface sawa ya CGI kwa seva, na, kwa upande wake, huipeleka moja kwa moja kwa mteja;
Seva hufunga muunganisho na mteja.
Vipimo vya kawaida vya CGI huchukulia kuwa seva inaweza kuwasiliana na programu kwa njia zifuatazo:
Vigezo vya mazingira - vinaweza kuwekwa na seva wakati programu inapoanza;
Mkondo wa pembejeo wa kawaida (STDIN) - kwa msaada wake, seva inaweza kuhamisha data kwenye programu;
Mkondo wa pato la kawaida (STDOUT) - programu inaweza kuandika matokeo yake ndani yake, ambayo hupitishwa kwa seva;
Mstari wa amri - ndani yake seva inaweza kupitisha baadhi ya vigezo kwenye programu.
Mito ya kawaida ya pembejeo / pato ni rahisi sana na hutumiwa sana kwenye mifumo ya UNIX, ambayo haiwezi kusema kuhusu Windows, kwa hiyo kuna vipimo vya CGI vilivyotengenezwa mahsusi kwa mifumo ya Windows, inayoitwa "Windows CGI". Lakini, bila shaka, mitiririko ya kawaida ya pembejeo / pato inaweza pia kutumika katika programu ya CGI ya windows. Hapa sitagusa kiwango cha "Windows CGI", na kuna angalau sababu mbili za hii - ya kwanza, na muhimu zaidi, ni kwamba kwa sasa sio seva zote za http za Windows zinazounga mkono uainishaji huu (haswa, ninayopenda zaidi. Apache 1.3.19) . Unaweza kuona sababu ya pili kwa kuandika "Windows CGI" katika injini yoyote ya utafutaji. Nitazingatia maelezo ya jumla tu kuhusu kiolesura hiki - data zote kutoka kwa seva hadi kwa mteja huhamishwa kupitia faili ambayo ni ya kawaida kwa Windows * .ini, jina ambalo hupitishwa kwa programu kwenye mstari wa amri. Katika hali hii, data yote kwenye faili tayari imegawanywa kwa uangalifu katika sehemu na seva na unachotakiwa kufanya ni kutumia vitendaji vya "GetPrivateProfile*" ili kuzitoa kutoka hapo. Jibu linatumwa kwa seva tena kupitia faili ambayo jina lake limeonyeshwa kwenye ingizo linalolingana kwenye faili ya ini.
Je, ni data gani inayoweza kuhamishwa na mteja kwenye programu ya CGI? - karibu yoyote. Kwa ujumla, programu hupitishwa maadili ya uwanja wa fomu ambao mteja hujaza, lakini pia inaweza kuwa aina fulani ya data ya binary, kwa mfano, faili iliyo na picha au muziki. Data inaweza kuhamishwa kwa seva kwa njia mbili tofauti - njia ya GET na njia ya POST. Tunapounda fomu ya kujaza kwenye ukurasa wetu, tunaonyesha kwa uwazi ni ipi kati ya mbinu zilizotolewa tunataka kutuma data iliyoingizwa na mtumiaji, hii inafanywa katika lebo kuu ya fomu kitu kama hiki:
Wakati wa kutuma data kwa kutumia mbinu ya GET, kivinjari husoma data kutoka kwa fomu na kuiweka baada ya URL ya hati, ikifuatiwa na alama ya swali; ikiwa kuna sehemu kadhaa muhimu katika fomu, basi zote hupitishwa kupitia "&" saini, jina la uwanja na thamani yake imeandikwa kwenye URL kupitia ishara "="" Kwa mfano, ombi linalotolewa na kivinjari kutoka kwa fomu unapobofya kitufe ambacho hati "/cgi-bin/test.exe" imeambatishwa, kwa kuzingatia kwamba sehemu ya kwanza ya fomu inaitwa "your_name" , ya pili - "umri_wako", inaweza kuonekana kama hii:
PATA /cgi-bin/test.exe?your_name=Pupkin&your_age=90 HTTP/1.0
Kutumia njia ya GET ina udhaifu kadhaa - ya kwanza na muhimu zaidi ni kwa sababu Data hupitishwa katika URL, basi ina kikomo kwa kiasi cha data hii iliyopitishwa. Udhaifu wa pili unafuata tena kutoka kwa URL - hii ni usiri, na uhamishaji kama huo data inabaki wazi kabisa. Kwa hiyo, ni vizuri ikiwa tuna mashamba madogo 2-3 katika fomu ... swali linatokea, nini cha kufanya ikiwa kuna data zaidi? Jibu ni kutumia njia ya POST!
Wakati wa kutumia njia ya POST, data hupitishwa kwa seva kama kizuizi cha data, na sio katika URL, ambayo kwa kiasi fulani huweka mikono yetu ili kuongeza kiwango cha habari inayopitishwa; kwa mfano hapo juu wa fomu ya POST, kizuizi kilitumwa. kwa seva itakuwa kitu kama hiki:
POST /cgi-bin/test.exe HTTP/1.0
Kubali: maandishi/wazi
Kubali: maandishi/html
Kubali: */*
Aina ya maudhui: application/x-www-form-urlencoded
Urefu wa yaliyomo: 36
jina_lako=Pupu&umri_wako=90
Kama ilivyoelezwa hapo juu, baada ya kupokea data, seva lazima ibadilishe na kuipitisha kwa programu ya CGI. Katika vipimo vya kawaida vya CGI, ingizo la mteja kwa ombi la GET linawekwa na seva katika muundo wa mazingira wa programu "QUERY_STRING". Ombi la POST linapofanywa, data huwekwa kwenye mkondo wa kawaida wa uingizaji wa programu, ambapo inaweza kusomwa nayo. Kwa kuongeza, kwa ombi kama hilo, seva huweka vigezo viwili zaidi vya mazingira - CONTENT_LENGTH na CONTENT_TYPE, ambayo mtu anaweza kuhukumu urefu wa ombi kwa byte na maudhui yake.
Kwa kuongezea data yenyewe, seva pia huweka anuwai za mazingira ya programu inayoitwa; hapa kuna baadhi yao:
REQUEST_METHOD
Inaeleza hasa jinsi data ilipatikana
Mfano:REQUEST_METHOD=GET
QUERY_STRING
Mfuatano wa hoja ikiwa mbinu ya GET ilitumika
Mfano:QUERY_STRING= your_name=Pupkin&your_age=90&hobby=asm
CONTENT_LENGTH
Urefu katika baiti za mwili wa ombi
Mfano:CONTENT_LENGTH=31
CONTENT_TYPE
Omba aina ya mwili
GATEWAY_INTERFACE
Toleo la itifaki ya CGI
Mfano:GATEWAY_ INTERFACE= CGI/1.1
REMOTE_ADDR
Anwani ya IP ya seva pangishi ya mbali, yaani, mteja aliyebofya kitufe katika fomu
Mfano:REMOTE_ADDR=10.21.23.10
REMOTE_HOST
Jina la mwenyeji wa mbali, hili linaweza kuwa jina la kikoa chake au, kwa mfano, jina la kompyuta katika mazingira ya Windows; ikiwa haya hayawezi kupatikana, basi uwanja una IP yake.
Mfano:REMOTE_HOST=wasm.ru
SCRIPT_NAME
Jina la hati iliyotumiwa katika ombi.
Mfano:SCRIPT_NAME=/cgi-bin/gols.pl
SCRIPT_FILENAME
Jina la faili ya hati kwenye seva.
Mfano:SCRIPT_FILENAME=c:/page/cgi-bin/gols.pl
MTUMISHI _ SOFTWARE
Programu ya seva
Mfano: Apache/1.3.19 (SHINDA32)
Kwa ujumla, hii yote ni kwa kifupi, kwa maelezo zaidi kuhusu Kiolesura cha Kawaida cha Lango, angalia nyaraka maalum, nilifanya maelezo haya ili kukukumbusha, na ikiwa hujui, basi kukuletea hadi sasa. Hebu jaribu kufanya kitu kwa vitendo.
Sehemu ya vitendo.
Kwa mazoezi, tutahitaji angalau vitu 3 - aina fulani ya seva ya http kwa Windows, nilijaribu mifano yote kwenye Apache 1.3.19 kwa Windows, seva ni bure, unaweza kuipakua kutoka http://httpd.apache. org/download.cgi . Ndio, na tutahitaji seva, sio seva yoyote tu, lakini iliyosanidiwa kuendesha hati za CGI! Tazama hati za jinsi ya kufanya hivi kwa seva unayotumia. Jambo la pili tunalohitaji ni, kwa kweli, mkusanyaji; inahitajika pia kwamba mkusanyaji aunge mkono uundaji wa programu za koni za WIN32, ninatumia Tasm, lakini Fasm na Masm na *asms zingine nyingi ni kamili. Na hatimaye, jambo muhimu zaidi ni kwamba tamaa hii inahitajika.
Kwa hivyo, nadhani seva iliwekwa kwa ufanisi na kusanidiwa na wewe, ili katika saraka ya mizizi ya nyaraka za seva kuna index.html faili, ambayo inaonyeshwa kikamilifu kwenye kivinjari unapoandika anwani http://127.0. .0.1. Pia nitazingatia kwamba mahali fulani katika jungle la folda za seva kuna folda ya "cgi-bin" ambayo maandiko yanaruhusiwa kukimbia.
Hebu tuangalie mipangilio ya seva, na wakati huo huo kuandika script ndogo. Hati yetu itakuwa faili ya kawaida ya *.bat. Ninaona maswali - vipi? kweli? Ndio, hii ni faili ya batch ya kawaida, kama ilivyotajwa hapo juu, uainishaji wa CGI hautofautishi kati ya aina za faili, jambo kuu ni kwamba seva inaweza kuiendesha, na, kwa upande wake, ina ufikiaji wa stdin/stdout na anuwai za mazingira, faili ya bat, hata sio kikamilifu, lakini kwa mfano itatufaa vizuri. Wacha tuunde faili iliyo na takriban maudhui yafuatayo:
@echo off rem Ombi la kichwa echo aina ya Maudhui: maandishi/html mwangwi. omba mwangwi wa mwili"
Habari!mwangwi "Ombi la GET lilituma data ifuatayo: %QUERY_STRING%
Wacha tuite faili test.bat na kuiweka kwenye saraka ya hati zinazoendesha, uwezekano mkubwa itakuwa saraka ya "cgi-bin". Jambo linalofuata tunalohitaji kufanya ni kuita hati hii kwa njia fulani, kimsingi, hii inaweza kufanywa moja kwa moja kwa kuandika kitu kama kifuatacho "http://127.0.0.1/cgi-bin/test.bat" kwenye anwani ya kivinjari. dirisha, lakini hebu tuiite kutoka kwa ukurasa wetu kuu, na wakati huo huo angalia uendeshaji wa njia ya GET. Wacha tuunde index.html ya faili kwenye mzizi wa seva na yaliyomo yafuatayo:
Sasa, unapoingia seva (http://127.0.0.1 kwenye upau wa anwani ya kivinjari), fomu inapaswa kuonekana, andika kitu ndani yake na ubofye kitufe cha "tuma", ikiwa kila kitu kilifanyika kwa usahihi, utaona majibu. kutoka kwa bat- kwenye hati ya dirisha la kivinjari. Sasa hebu tuone kile tulichofikia hapo.
Kama unavyoweza kukisia, amri ya "echo" hutoa matokeo kwa stdout; kwanza kabisa, tunapitisha kichwa cha majibu yetu kwa seva - "aina ya Yaliyomo mwangwi: maandishi/html". Hiki ni kichwa cha kawaida cha vipimo vya CGI, kikionyesha kwamba tunataka kuhamisha maandishi au hati ya html; kuna vichwa vingine. Jambo muhimu sana ni kichwa. lazima ikitenganishwa na kikundi cha majibu kwa laini tupu, ambayo ndiyo tunafanya kwa amri ifuatayo ya "echo". Ifuatayo, sehemu ya majibu yenyewe hupitishwa - hii ni hati ya kawaida ya html. Katika mwili wa hati, kwa uwazi, ninaonyesha mojawapo ya vigeu vya mazingira vilivyopitishwa kwetu na seva - "QUERY_STRING", kama ilivyotajwa tayari. njia ya GET (na hii ndio kesi yetu), kila kitu hupitishwa katika data hii iliyoingizwa na mtumiaji, ambayo tunaweza kuona katika majibu ya hati. Labda umegundua "alama za nukuu hazipo mahali" katika mistari 2 ya mwisho ya faili, mara tu baada ya "echo", ziko hapo kwa sababu ya upendeleo wa faili za popo, kwani unaweza kuona lebo za html zimezungukwa na wahusika "<» и «>", wakati huo huo, alama hizi hutumika kama uelekezaji wa pembejeo/pato katika faili za popo, na kwa hivyo hatuwezi kuzitumia kwa uhuru hapa.
Ninapendekeza kucheza kidogo na maandishi kama hayo ya popo, inaweza kuwa muhimu sana, jaribu kuangalia anuwai za mazingira. Nitasema kidogo, nikitoka kwenye mada, kwenye mifumo ya UNIX, lugha za mkalimani wa amri zimekuzwa sana na mstari kati ya programu katika lugha ya mkalimani wa amri na programu katika lugha ya "halisi" ya programu ni wazi sana. baadhi ya matukio, hivyo hati rahisi mara nyingi huandikwa kwenye mifumo ya UNIX hasa katika lugha za mkalimani wa amri, lakini mkalimani wa Windows cmd.exe au, mapema, command.com ni wazi dhaifu kwa madhumuni haya.
Sasa hebu tuendelee kwenye kazi muhimu zaidi ya makala hii, kwa kweli kuandika programu ya CGI katika mkusanyiko. Kimsingi, ikiwa tutazingatia yote hapo juu kuhusu CGI, tunaweza kupata hitimisho kuhusu kile kiolesura cha CGI kinahitaji kutoka kwa programu yetu:
2. Programu lazima iweze kuandika kwa mkondo wa pato la kawaida (stdout) ili kusambaza matokeo ya kazi yake kwa seva;
3. Kutoka kwa pointi mbili za kwanza inafuata kwamba ili seva itume kitu kwa programu yetu katika stdin, na ili kuijibu katika stdout, programu ya CGI lazima iwe maombi ya console;
Hii inatosha kuunda programu kamili ya CGI.
Hebu tuanze na hatua ya mwisho. Ili kupata ufikiaji wa anuwai ya mazingira ya programu ya Windows, kazi ya API "GetEnvironmentStrings" inatumiwa, chaguo la kukokotoa halina hoja na inarudisha kiashiria kwenye safu ya anuwai ya mazingira (NAME=VALUE) iliyotenganishwa na sifuri, safu imefungwa na. sifuri mara mbili, wakati programu inapozinduliwa na seva katika mazingira ya programu kwa kuongeza vijiti vya kawaida, anuwai maalum za CGI zilizoelezewa hapo juu huongezwa; unapoendesha programu kutoka kwa safu ya amri, hautaziona, kwa asili.
Ili kuandika kitu kwa stdout au kusoma kutoka stdin, tunahitaji kwanza kupata vipini vya mitiririko hii, hii inafanywa kwa kutumia kazi ya API "GetStdHandle", moja ya maadili yafuatayo hupitishwa kama parameta ya kazi:
STD_INPUT_HANDLE - kwa stdin (pembejeo ya kawaida);
STD_OUTPUT_HANDLE - kwa stdout (matokeo ya kawaida);
STD_ERROR_HANDLE - kwa stderr.
Chaguo la kukokotoa litarudisha kishiko tunachohitaji kwa shughuli za kusoma/kuandika. Kitu kinachofuata tunachohitaji kufanya ni kuandika/kusoma mipasho hii. Hii inafanywa na shughuli za kawaida za kusoma / kuandika faili, i.e. ReadFile na AndikaFile. Kuna ujanja mmoja hapa, unaweza kufikiria kuwa AndikaConsole/ReadConsole inaweza kutumika kwa madhumuni haya, lakini hii ni kweli kwa consoles na itafanya kazi vizuri, matokeo, kama vile WriteFile, yatatolewa kwa koni, lakini hii itaendelea hadi tutakapoendesha programu yetu kama hati kwenye seva. Hii hutokea kwa sababu programu yetu inapozinduliwa na seva, vishikizo vinavyorejeshwa na chaguo la kukokotoa la "GetStdHandle" havitakuwa tena vishikizo vya kiweko, vitakuwa vipini vya bomba, ambayo ni muhimu kwa kuunganisha programu mbili.
Hapa kuna mfano mdogo wa jinsi programu ya CGI inapaswa kuonekana katika lugha ya kusanyiko; nadhani haitakuwa ngumu sana kuisuluhisha:>
386 .mfano gorofa,stdcall includelib import32.lib .const PAGE_READWRITE = 4h MEM_COMMIT = 1000h MEM_RESERVE = 2000h STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE = -11 nje ya data . hStdin dd ? hMem dd ? kichwa: db "Aina ya Maudhui: maandishi/html",13,10,13,10,0 start_html: db "
Mazingira ya programu ya CGI yanaonekana kama hii:",13,10,0 kwa_stdin: db" STDIN ya programu ina:
",13,10,0 mwisho_html: db"
",13,10,0 nwritten dd ? toscr db 10 dup (32) db " - Aina ya faili",0 .code _start: xor ebx,ebx call GetStdHandle,STD_OUTPUT_HANDLE mov hStdout,eax call GetStdHandle,STD_INPUTx call write_stdout, offset header call write_stdout, offset start_html call VirtualAlloc,ebx,1000,MEM_COMMIT+MEM_RESERVE,PAGE_READWRITE mov hMem,eax mov edi,eax call GetEnvironmentStringsA mov esi,eax next_string,al string,moal_symbol: : cmpsb jmp fupi next_symbol end_string: mov ,">rb<" add edi,3 cmp byte ptr ,0 jnz next_string inc edi stosb call write_stdout, hMem call write_stdout, offset for_stdin call GetFileSize,,ebx mov edi,hMem call ReadFile,,edi, eax,offset nwritten, ebx add edi, mov byte ptr ,0 call write_stdout, hMem call write_stdout, offset end_html call VirtualFree,hMem call ExitProcess,-1 write_stdout proc bufOffs:dword call lstrlen,bufOffs call WriteFile,,bufOffs,eax,offset nwritten,0 ret write_stdout endp extrn GetEnvironmentStringsA:near extrn GetStdHandle:near extrn ReadFile:near extrn WriteFile:near extrn GetFileSize:near extrn VirtualAlloc:near extrn VirtualFree:near extrn ExitProcess:near extrn lstrlen:near ends end _start
Faili inayoweza kutekelezwa imejengwa na amri:
tasm32.exe /ml test.asm
tlink32.exe /Tpe /ap /o test.obj
Usisahau kwamba programu lazima iwe programu ya console.
Hifadhi na programu.
Unaweza kupiga programu hii kwa kutumia fomu ya html iliyoelezwa hapo juu, unahitaji tu kubadilisha jina test.bat katika fomu ya test.exe na kuinakili kwa /cgi-bin/ ipasavyo, unaweza kuiweka POST kwa njia ya ombi. , programu huichakata.
Pia nataka kutambua kwamba unaweza kuita programu kwa njia nyingine, unaweza kuunda faili kwenye saraka ya cgi-bin, kwa mfano test.cgi, na mstari mmoja "#!c:/_path_/test.exe" na iite kwa maombi, na seva kwa upande wake, itasoma mstari wake wa kwanza na kuzindua faili ya exe; kwa hili, ni muhimu kwamba kiendelezi cha *.cgi kibainishwe katika mipangilio ya seva ya http kama kiendelezi cha hati. Kwa njia hii, seva itazindua programu yetu na safu ya amri "test.exe path_to_test.exe" hii ina faida kadhaa - ya kwanza ni kwamba mtu anayeendesha hati yetu hata hata nadhani hati imeandikwa ndani, ya pili ni. kwamba inapitishwa kwetu jina la faili na laini yetu, tunaweza, kwa mfano, kuongeza mipangilio yoyote ya hati yetu kwenye faili hii, ambayo hurahisisha utatuzi, kwa njia, hivi ndivyo wakalimani wote hufanya kazi - labda umegundua. kwamba katika programu zote za perl/php/etc kuna mstari sawa - unaoonyesha mkalimani wa amri yenyewe. Kwa hivyo, seva inapoanza programu ya cgi, ikiwa ugani wa programu umesajiliwa kama hati katika mipangilio, inasoma mstari wa kwanza wa faili, na ikiwa inageuka kuwa katika muundo ulioelezwa hapo juu, basi inazindua programu. iliyoainishwa kwenye mstari na jina la faili hii ikifuatiwa na nafasi, wacha tuseme kwamba katika Mtafsiri wa lulu ameonyeshwa kwenye mstari; baada ya kupokea zawadi kama hiyo, huanza utekelezaji wake, kwa sababu Maoni katika Perl ni ishara ya "#", kisha inaruka mstari wa kwanza na script inaendelea kutekelezwa, kwa ujumla ni jambo rahisi.
Hiyo ndiyo yote nilitaka kuandika kuhusu, sijui jinsi yote haya yatakuwa na manufaa kwako, lakini nitasema kuwa nina seva ya intranet inayoendesha kwa kutumia maandishi ya mkusanyiko. Ninakiri, hakukuwa na sababu kubwa ya kufanya hivi, lakini hata hivyo, nilifanya mwanzoni kwa sababu za urembo na kusitasita kujifunza lulu/php au kitu kingine. LAKINI sikukatishi tamaa ya kujifunza Pearl, lakini kinyume chake, nitasema kwamba ni muhimu kufanya hivyo, na hata ni lazima sana, nilitambua hili baadaye, lakini bado nadhani kwamba kwenye seva zilizojaa sana, ambapo kasi ya utekelezaji, upakiaji na kiasi cha kumbukumbu ulichukua na maombi ina jukumu scripts cgi iliyoandikwa katika assembler itachukua nafasi yao halali.