Apabila pengguna mengisi borang html dan mengklik hantar, data dihantar ke pelayan web. Pelayan web, sama ada Apache, IIS atau yang lain, menjalankan program yang dinyatakan sebagai nilai atribut tindakan. Dalam kes kami ini adalah test.cgi. Pelayan web menjalankan test.cgi dan menghantar parameternya dalam bentuk rentetan teks dengan kandungan berikut: name1=value1&name2=value2&....nameN=valueN, i.e. nama_parameter=nilai. Rentetan ini dihantar ke input standard (STDIN) atau sebagai nilai pembolehubah persekitaran QUERY_STRING. Sehubungan itu, baris ini boleh dibaca dalam program dalam salah satu daripada dua cara:
Dalam kes pertama, parameter diluluskan kaedah POST, dan dalam yang kedua menggunakan kaedah GET. Dalam kes pertama, kami membaca rentetan daripada STDIN. Kami mengetahui panjang garisan daripada nilai parameter persekitaran CONTENT_LENGTH. Dalam yang kedua, ia disimpan dalam pembolehubah persekitaran QUERY_STRING. Nilai pembolehubah persekitaran boleh diperoleh dengan memanggil fungsi getenv. Kaedah yang mana rentetan parameter dihantar ke program CGI boleh ditakrifkan seperti berikut: strcmp(getenv("REQUEST_METHOD"),"POST"). Seterusnya anda perlu menghuraikan rentetan dan mendapatkan nilai parameter yang diperlukan. Untuk tidak perlu melakukan ini setiap kali, kami menulis perpustakaan ITCGI yang kecil tetapi sangat mudah untuk menulis skrip CGI. Pustaka ini membolehkan anda mengabstraksi sepenuhnya daripada kaedah yang mana parameter diluluskan, daripada pengekodan, daripada menghuraikan rentetan. Anda hanya perlu memanggil fungsi GetParamByName, yang mana anda menghantar nama parameter yang anda minati dan alamat baris untuk menyimpan nilai. Perpustakaan ini juga menyediakan anda dengan beberapa fungsi untuk menulis skrip CGI yang cekap dan kalis gangguan.Dalam kes paling mudah, apabila program anda tidak memerlukan parameter, anda tidak perlu menghuraikan dan menyahkod rentetan itu sendiri, atau menggunakan perpustakaan kami untuk ini. Program CGI yang paling mudah ialah: Tajuk adalah bahagian yang diperlukan. Ia dihantar ke pelayan web dan menentukan perkara yang mengikutinya. Dalam kebanyakan kes, ini adalah tajuk anda. Ia memberitahu pelayan web tentang kod HTML yang akan datang. Kami akan mengenali jenis pengepala lain sedikit kemudian. Tajuk mungkin mengandungi beberapa baris. Penghujung tajuk ditunjukkan oleh dua peralihan kepada baris baru- \n\n. Susun atur cara ini dan letakkan fail boleh laku dalam direktori /cgi-bin tapak web anda. Namakannya semula kepada test.cgi. Skrip ini boleh diakses terus melalui pelayar dengan menulis kepada baris arahan URL, sebagai contoh, bagi saya ia kelihatan seperti ini http://site/cgi-bin/test.cgi Akibatnya, dalam penyemak imbas anda, anda akan melihat baris: "Hello, World!"
Seterusnya kita akan melihat program CGI dari jenis yang sama. Ia tidak menerima sebarang parameter, tetapi ia menghasilkan lebih banyak informasi berguna- senarai dan nilai semua pembolehubah persekitaran. Skrip ini akan berguna apabila anda menyahpepijat program CGI anda pada pelbagai pelayan web. Hakikatnya ialah pembolehubah persekitaran berbeza-beza pada pelayan web yang berbeza. Jadi, sebagai contoh, untuk pelayan web Apache, laluan ke direktori tapak web disimpan dalam pembolehubah persekitaran DOCUMENT_ROOT. Untuk pelayan web Internet Microsoft Pelayan Maklumat nilai ini disimpan dalam pembolehubah PATH_TRANSLATED. DALAM sistem operasi Skrip UNIX untuk memaparkan semua pembolehubah kelihatan seperti ini.
#!/bin/sh echo "jenis kandungan: text/plain\n\n" echo 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 (serasi; MSIE 5.0; Windows 98; DOTHCURTO/DigTyExt)=www. Asas SERVER_SIGNATURE= Pelayan Apache/1.3.12 di 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=tapak |
#termasuk |
Di bawah ialah output skrip ini pada WindowsNT, anda boleh melihat berapa banyak parameter yang tersedia melalui pembolehubah persekitaran. Skrip cgi sedemikian akan berguna kepada anda apabila menyediakan skrip anda pada pelayan orang lain, di mana pembolehubah persekitaran mungkin berbeza daripada yang setempat anda. COMSPEC=C:\WINNT\SYSTEM32\COMMAND.COM COMPUTERNAME=JUPITER CONTENT_LENGTH=0 GATEWAY_INTERFACE=CGI/1.1 HTTP_ACCEPT=image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint , application/vnd.ms-excel, applic HTTP_ACCEPT_LANGUAGE=ru HTTP_CONNECTION=Keep-Alive HTTP_HOST=www.oxygensoftware.com HTTP_USER_AGENT=Mozilla/4.0 (serasi; MSIE 5.01; Windows NT 5.0) HTTP_ACCEPT_ENCODING= HTTP_ACCEPT_ENCODING = INCLUDE 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; .VBS;.JS. HOS = 194.226.32.34 REQUEST_METHOD=DAPATKAN SCRIPT_NAME=/cgi-bin/env.exe SERVER_NAME=www.oxygensoftware.com SERVER_PORT=80 SERVER_PORT_SECURE=0 SERVER_PROTOCOL=HTTP/1.1 SERVER_SOFTWARE-SYSTEM=Microsoftware.com C: \ WINNT TEMP=C:\temp TMP=C:\temp USERPROFILE=C:\WINNT\Profiles\Default User Seterusnya, sebelum beralih kepada pertimbangan skrip cgi yang menerima dan memproses parameter borang, kami akan menulis program ringkas yang menghasilkan parameter bentuk html baris. Baca di atas tentang cara parameter borang dibaca; di sini saya menyediakan kod sumber program dan hasilnya untuk borang html yang diterangkan dalam bab keempat.
#termasuk |
teks=sifar&teks=sifar&senarai=0&senarai2=0&kawasan teks=%C7%E4%E5%F1%FC+%F2%E5%EA%F1%F2+%EF%EE+%F3%EC%EE%EB%F7%E0%ED%E8 %FE
Ini ialah rentetan yang mengandungi senarai semua parameter. Seterusnya, anda boleh menggunakan pustaka ITCGI kami atau menghuraikan rentetan parameter ini sendiri. Baca tentang perpustakaan dan kegunaan praktikalnya dalam perenggan seterusnya.
pengenalan.
Dalam artikel ini saya ingin bercakap tentang antara muka CGI secara umum, pelaksanaannya untuk Windows dan penggunaan bahasa perhimpunan khususnya semasa menulis program CGI. Skop artikel ini tidak termasuk penerangan penuh tentang CGI, kerana terdapat banyak bahan mengenai isu ini di Internet dan saya tidak nampak gunanya menceritakan semuanya di sini.
TeoriCGI.
CGI – (Antara Muka Gerbang Biasa) – Antara Muka Gerbang Biasa. Seperti yang anda fikirkan, antara muka ini berfungsi sebagai pintu masuk antara pelayan (di sini saya maksudkan program pelayan) dan beberapa program luaran yang ditulis untuk OS di mana pelayan ini sedang berjalan. Oleh itu, CGI bertanggungjawab untuk bagaimana data akan dipindahkan dari program pelayan ke program CGI dan kembali. Antara muka tidak mengenakan sebarang sekatan pada program CGI yang harus ditulis; ia boleh sama ada fail boleh laku biasa atau mana-mana fail lain - perkara utama ialah pelayan boleh menjalankannya (dalam persekitaran Windows, contohnya, ia boleh menjadi fail dengan sambungan terikat pada mana-mana program).
Dari saat anda memanggil (contohnya, mengklik butang borang yang mana panggilan program CGI dilampirkan) program CGI sehingga anda menerima keputusan dalam tetingkap penyemak imbas anda, perkara berikut berlaku:
Pelanggan web (seperti penyemak imbas) mencipta sambungan ke pelayan yang dinyatakan dalam URL;
Pelanggan web menghantar permintaan kepada pelayan, permintaan ini biasanya dibuat menggunakan dua kaedah GET atau POST;
Data daripada permintaan pelanggan (contohnya, nilai medan borang) dihantar oleh pelayan, menggunakan antara muka CGI, kepada program CGI yang dinyatakan dalam URL;
Program CGI memproses data pelanggan yang diterima daripada pelayan dan, berdasarkan pemprosesan ini, menjana tindak balas kepada pelanggan, yang ia hantar melalui antara muka CGI yang sama kepada pelayan, dan ia, seterusnya, menghantarnya terus kepada pelanggan;
Pelayan menutup sambungan dengan klien.
Spesifikasi CGI standard menganggap bahawa pelayan boleh berkomunikasi dengan program dengan cara berikut:
Pembolehubah persekitaran – ia boleh ditetapkan oleh pelayan apabila program bermula;
Strim input standard (STDIN) - dengan bantuannya, pelayan boleh memindahkan data ke program;
Strim output standard (STDOUT) – program boleh menulis outputnya ke dalamnya, yang dihantar ke pelayan;
Baris arahan - di dalamnya pelayan boleh menghantar beberapa parameter kepada program.
Strim input/output standard sangat mudah dan digunakan secara meluas pada sistem UNIX, yang tidak boleh dikatakan tentang Windows, jadi terdapat spesifikasi CGI yang dibangunkan khusus untuk sistem Windows, dipanggil "Windows CGI". Tetapi, sudah tentu, aliran input/output standard juga boleh digunakan dalam pengaturcaraan CGI windows. Di sini saya tidak akan menyentuh standard "Windows CGI", dan terdapat sekurang-kurangnya dua sebab untuk ini - yang pertama, dan yang paling penting, ialah pada masa ini tidak semua pelayan http untuk Windows menyokong spesifikasi ini (khususnya, kegemaran saya Apache 1.3.19). Anda boleh melihat sebab kedua dengan menaip "Windows CGI" dalam mana-mana enjin carian. Saya akan ambil perhatian hanya butiran umum mengenai antara muka ini - semua data dari pelayan kepada klien dipindahkan melalui fail yang biasa untuk Windows *.ini, yang namanya dihantar ke program pada baris arahan. Dalam kes ini, semua data dalam fail telah dibahagikan dengan teliti kepada bahagian oleh pelayan dan anda hanya perlu menggunakan fungsi "GetPrivateProfile*" untuk mengekstraknya dari sana. Respons dihantar ke pelayan sekali lagi melalui fail yang namanya ditunjukkan dalam entri yang sepadan dalam fail ini.
Apakah data yang boleh dipindahkan oleh pelanggan ke program CGI? - hampir semua. Secara umum, program ini memberikan nilai medan borang yang diisi oleh pelanggan, tetapi ia juga boleh menjadi beberapa jenis data binari, contohnya, fail dengan gambar atau muzik. Data boleh dipindahkan ke pelayan melalui dua kaedah berbeza - kaedah GET dan kaedah POST. Apabila kami membuat borang untuk diisi di halaman kami, kami secara jelas menunjukkan kaedah yang mana yang kami mahu hantar data yang dimasukkan oleh pengguna, ini dilakukan dalam teg utama borang seperti ini:
Apabila menghantar data menggunakan kaedah GET, penyemak imbas membaca data daripada borang dan meletakkannya selepas URL skrip, diikuti dengan tanda soal; jika terdapat beberapa medan penting dalam borang, maka semuanya dihantar melalui “&” tanda, nama medan dan nilainya ditulis dalam URL melalui tanda “=” " Sebagai contoh, permintaan yang dijana oleh penyemak imbas daripada borang apabila anda mengklik butang yang dilampirkan skrip "/cgi-bin/test.exe", dengan mengambil kira bahawa medan pertama borang dipanggil "nama_anda" , yang kedua – "umur_anda", mungkin kelihatan seperti ini:
DAPATKAN /cgi-bin/test.exe?your_name=Pupkin&your_age=90 HTTP/1.0
Menggunakan kaedah GET mempunyai beberapa kelemahan - yang pertama dan paling penting adalah kerana Data dihantar dalam URL, maka ia mempunyai had pada jumlah data yang dihantar ini. Kelemahan kedua sekali lagi mengikuti dari URL - ini adalah kerahsiaan, dengan pemindahan sedemikian, data tetap terbuka sepenuhnya. Jadi, ada baiknya jika kita mempunyai 2-3 medan kecil dalam bentuk ... timbul persoalan, apa yang perlu dilakukan jika terdapat lebih banyak data? Jawapannya gunakan kaedah POST!
Apabila menggunakan kaedah POST, data dihantar ke pelayan sebagai blok data, dan bukan dalam URL, yang sedikit sebanyak membebaskan tangan kita untuk meningkatkan jumlah maklumat yang dihantar; untuk contoh borang POST di atas, blok dihantar ke pelayan akan menjadi seperti ini:
POST /cgi-bin/test.exe HTTP/1.0
Terima: teks / biasa
Terima: teks/html
Terima: */*
Jenis kandungan: application/x-www-form-urlencoded
Panjang kandungan: 36
your_name=Pupkin&your_age=90
Seperti yang dinyatakan di atas, selepas menerima data, pelayan mesti menukarnya dan menyerahkannya kepada program CGI. Dalam spesifikasi CGI standard, input klien untuk permintaan GET diletakkan oleh pelayan dalam pembolehubah persekitaran program "QUERY_STRING". Apabila permintaan POST dibuat, data diletakkan pada aliran input standard aplikasi, di mana ia boleh dibaca olehnya. Di samping itu, dengan permintaan sedemikian, pelayan menetapkan dua lagi pembolehubah persekitaran - CONTENT_LENGTH dan CONTENT_TYPE, yang mana seseorang boleh menilai panjang permintaan dalam bait dan kandungannya.
Sebagai tambahan kepada data itu sendiri, pelayan juga menetapkan pembolehubah persekitaran lain bagi program yang dipanggil; berikut adalah beberapa daripadanya:
REQUEST_METHOD
Menerangkan dengan tepat bagaimana data diperolehi
Contoh:REQUEST_METHOD=DAPATKAN
QUERY_STRING
Rentetan pertanyaan jika kaedah GET digunakan
Contoh:QUERY_STRING= nama_anda=Pupkin&umur_anda=90&hobi=asm
CONTENT_LENGTH
Panjang dalam bait badan permintaan
Contoh:CONTENT_LENGTH=31
JENIS KANDUNGAN
Permintaan jenis badan
GATEWAY_INTERFACE
Versi protokol CGI
Contoh:LALUAN_ ANTARA MUKA= CGI/1.1
REMOTE_ADDR
Alamat IP hos jauh, iaitu pelanggan yang mengklik butang dalam borang
Contoh:REMOTE_ADDR=10.21.23.10
REMOTE_HOST
Nama hos jauh, ini boleh menjadi nama domainnya atau, sebagai contoh, nama komputer dalam persekitaran Windows; jika ini tidak dapat diperoleh, maka medan tersebut mengandungi IPnya
Contoh:REMOTE_HOST=wasm.ru
SCRIPT_NAME
Nama skrip yang digunakan dalam permintaan.
Contoh:SCRIPT_NAME=/cgi-bin/gols.pl
SCRIPT_FILENAME
Nama fail skrip pada pelayan.
Contoh:SCRIPT_FILENAME=c:/page/cgi-bin/gols.pl
SERVER _ PERISIAN
Perisian pelayan
Contoh: Apache/1.3.19 (MENANG32)
Secara umum, ini semua secara ringkas, untuk maklumat yang lebih terperinci tentang Antara Muka Gerbang Biasa, lihat dokumentasi khusus, saya membuat penerangan ini untuk mengingatkan anda, dan jika anda tidak tahu, kemudian bawa anda terkini. Mari cuba lakukan sesuatu dalam amalan.
Bahagian praktikal.
Untuk latihan, kami memerlukan sekurang-kurangnya 3 perkara - beberapa jenis pelayan http untuk Windows, saya mencuba semua contoh pada Apache 1.3.19 untuk Windows, pelayan adalah percuma, anda boleh memuat turunnya dari http://httpd.apache. org/download.cgi . Ya, dan kami memerlukan pelayan, bukan sebarang pelayan, tetapi yang dikonfigurasikan untuk menjalankan skrip CGI! Lihat dokumentasi untuk cara melakukan ini untuk pelayan yang anda gunakan. Perkara kedua yang kita perlukan ialah, sudah tentu, pemasang; pengkompil juga perlu menyokong penciptaan aplikasi konsol WIN32, saya menggunakan Tasm, tetapi Fasm dan Masm dan banyak *asms lain adalah sempurna. Dan akhirnya, perkara yang paling penting ialah keinginan ini diperlukan.
Jadi, saya menganggap bahawa pelayan telah berjaya dipasang dan dikonfigurasikan oleh anda, supaya dalam direktori akar dokumen pelayan terdapat fail index.html, yang dipaparkan dengan sempurna dalam penyemak imbas apabila anda menaip alamat http://127.0 .0.1. Saya juga akan mengambil kira bahawa di suatu tempat di dalam hutan folder pelayan terdapat folder "cgi-bin" di mana skrip dibenarkan untuk dijalankan.
Mari kita semak tetapan pelayan, dan pada masa yang sama tulis skrip kecil. Skrip kami akan menjadi fail *.bat biasa. Saya meramalkan soalan - bagaimana? betul ke? Ya, ini adalah fail kelompok biasa, seperti yang dinyatakan di atas, spesifikasi CGI tidak membezakan antara jenis fail, perkara utama ialah pelayan boleh menjalankannya, dan ia, seterusnya, mempunyai akses kepada pembolehubah stdin/stdout dan persekitaran, fail kelawar, walaupun tidak sepenuhnya, tetapi sebagai contoh ia akan sesuai dengan kita dengan baik. Mari buat fail dengan lebih kurang kandungan berikut:
@echo off rem Minta gema pengepala Jenis kandungan: teks/html gema. rem Minta gema badan "
hello!echo "Permintaan GET menghantar data berikut: %QUERY_STRING%
Mari kita panggil fail test.bat dan letakkannya dalam direktori untuk menjalankan skrip, kemungkinan besar ia akan menjadi direktori "cgi-bin". Perkara seterusnya yang perlu kita lakukan ialah memanggil skrip ini dalam beberapa cara, pada dasarnya, ini boleh dilakukan secara langsung dengan menaip sesuatu seperti berikut "http://127.0.0.1/cgi-bin/test.bat" ke dalam alamat penyemak imbas tetingkap, tetapi mari kita panggilnya dari halaman utama kami, dan pada masa yang sama semak operasi kaedah GET. Mari buat fail index.html dalam akar pelayan dengan kandungan berikut:
Sekarang, apabila anda memasuki pelayan (http://127.0.0.1 dalam bar alamat penyemak imbas), borang akan muncul, taip sesuatu di dalamnya dan klik butang "hantar", jika semuanya dilakukan dengan betul, anda akan melihat respons daripada kelawar kami- dalam skrip tetingkap penyemak imbas. Sekarang mari kita lihat apa yang kita lakukan di sana.
Seperti yang anda fikirkan, arahan "gema" menghasilkan stdout; pertama sekali, kami menghantar pengepala respons kami kepada pelayan - "jenis Kandungan echo: teks/html". Ini ialah pengepala spesifikasi CGI standard, menunjukkan bahawa kami ingin memindahkan teks atau dokumen html; terdapat pengepala lain. Perkara yang sangat penting ialah tajuk. mesti dipisahkan daripada badan tindak balas dengan baris kosong, iaitu apa yang kita lakukan dengan arahan "gema." berikut. Seterusnya, badan respons itu sendiri dihantar - ini adalah dokumen html biasa. Dalam badan dokumen, untuk kejelasan, saya memaparkan salah satu pembolehubah persekitaran yang dihantar kepada kami oleh pelayan - "QUERY_STRING", seperti yang telah disebutkan dengan kaedah GET (dan ini betul-betul kes kami), semuanya dihantar dalam data yang dimasukkan pengguna berubah-ubah ini, yang boleh kita perhatikan dalam tindak balas skrip. Anda mungkin perasan "tanda petikan tidak pada tempatnya" dalam 2 baris terakhir fail, sejurus selepas "gema", ia berada di sana kerana kekhususan fail kelawar, kerana anda dapat melihat tag html dikelilingi oleh watak "<» и «>", pada masa yang sama, simbol ini berfungsi sebagai pengalihan input/output dalam fail kelawar, dan oleh itu kami tidak boleh menggunakannya secara bebas di sini.
Saya mengesyorkan bermain-main sedikit dengan skrip kelawar seperti itu, ia boleh menjadi sangat berguna, cuba lihat pembolehubah persekitaran yang lain. Saya akan katakan sedikit, menyimpang dari topik, pada sistem UNIX, bahasa penterjemah arahan sangat maju dan garis antara pengaturcaraan dalam bahasa jurubahasa arahan dan pengaturcaraan dalam bahasa pengaturcaraan "sebenar" adalah sangat, sangat kabur dalam sesetengah kes, jadi skrip mudah sering ditulis pada sistem UNIX khususnya dalam bahasa penterjemah arahan, tetapi penterjemah Windows cmd.exe atau, sebelum ini, command.com jelas lemah untuk tujuan ini.
Sekarang mari kita beralih kepada tugas yang paling penting dalam artikel ini, untuk menulis program CGI dalam penghimpun. Pada dasarnya, jika kita mengambil kira semua perkara di atas tentang CGI, kita boleh membuat kesimpulan tentang perkara yang diperlukan antara muka CGI daripada program kami:
2. Program mesti boleh menulis ke aliran keluaran standard (stdout) untuk menghantar hasil kerjanya ke pelayan;
3. Daripada dua perkara pertama, ia mengikuti bahawa untuk pelayan menghantar sesuatu ke program kami dalam stdin, dan untuk ia bertindak balas kepadanya dalam stdout, program CGI mestilah aplikasi konsol;
Ini cukup untuk mencipta aplikasi CGI yang lengkap.
Mari kita mulakan dengan titik terakhir. Untuk mendapatkan akses kepada pembolehubah persekitaran aplikasi Windows, fungsi API "GetEnvironmentStrings" digunakan, fungsi itu tidak mempunyai argumen dan mengembalikan penunjuk kepada tatasusunan pembolehubah persekitaran (NAME=VALUE) yang dipisahkan dengan sifar, tatasusunan ditutup dengan sifar berganda, apabila program dilancarkan oleh pelayan dalam persekitaran program sebagai tambahan kepada pembolehubah standard, pembolehubah CGI khusus yang diterangkan di atas ditambah; apabila anda menjalankan program dari baris arahan, anda tidak akan melihatnya, secara semula jadi.
Untuk menulis sesuatu untuk stdout atau membaca daripada stdin, pertama sekali kita perlu mendapatkan pemegang aliran ini, ini dilakukan menggunakan fungsi API "GetStdHandle", salah satu nilai berikut diluluskan sebagai parameter fungsi:
STD_INPUT_HANDLE - untuk stdin (input standard);
STD_OUTPUT_HANDLE - untuk stdout (output standard);
STD_ERROR_HANDLE - untuk stderr.
Fungsi ini akan mengembalikan pemegang yang kami perlukan untuk operasi baca/tulis. Perkara seterusnya yang perlu kita lakukan ialah menulis/membaca aliran ini. Ini dilakukan oleh operasi baca/tulis fail biasa, i.e. ReadFile dan WriteFile. Terdapat satu kehalusan di sini, anda mungkin berfikir bahawa WriteConsole/ReadConsole boleh digunakan untuk tujuan ini, tetapi ini memang benar untuk konsol dan ia akan berfungsi dengan baik, hasilnya, seperti dengan WriteFile, akan dikeluarkan kepada konsol, tetapi ini akan berterusan sehingga kami menjalankan program kami sebagai skrip pada pelayan. Ini berlaku kerana apabila program kami dilancarkan oleh pelayan, pemegang yang dikembalikan oleh fungsi "GetStdHandle" tidak lagi menjadi pemegang konsol kerana itu, ia akan menjadi pemegang paip, yang diperlukan untuk menyambungkan dua aplikasi.
Berikut ialah contoh kecil tentang rupa program CGI dalam bahasa himpunan; Saya fikir ia tidak akan terlalu sukar untuk memikirkannya:>
386 .model flat,stdcall includelib import32.lib .const PAGE_READWRITE = 4j MEM_COMMIT = 1000j MEM_RESERVE = 2000j STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE = -11 .data hStdout dd ? hStdin dd ? hMem dd ? header: db "Content-Type: text/html",13,10,13,10,0 start_html: db "
Persekitaran program CGI kelihatan seperti ini:",13,10,0 for_stdin: db " STDIN program ini mengandungi:
",13,10,0 end_html: db "
",13,10,0 nwritten dd ? toscr db 10 dup (32) db " - Jenis fail",0 .code _start: xor ebx,ebx call GetStdHandle,STD_OUTPUT_HANDLE mov hStdout,eax call,GetStdHandle mov_STDLEIN write_stdout, offset header call write_stdout, offset start_html panggilan VirtualAlloc,ebx,1000,MEM_COMMIT+MEM_RESERVE,PAGE_READWRITE mov hMem,eax mov edi,eax call GetEnvironmentStringsA mov esi,eax next_symbol: mov al, rentetan_seterusnya : cmpsb jmp pendek 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
Fail boleh laku dibina dengan arahan:
tasm32.exe /ml test.asm
tlink32.exe /Tpe /ap /o test.obj
Jangan lupa bahawa program itu mestilah program konsol.
Arkibkan dengan program.
Anda boleh memanggil program ini menggunakan borang html yang diterangkan di atas, anda hanya perlu menukar nama test.bat dalam borang kepada test.exe dan salin ke /cgi-bin/ sewajarnya, anda boleh menetapkannya kepada POST dalam kaedah permintaan , program memprosesnya.
Saya juga ingin ambil perhatian bahawa anda boleh memanggil program dengan cara lain, anda boleh mencipta fail dalam direktori cgi-bin, contohnya test.cgi, dengan satu baris "#!c:/_path_/test.exe" dan memanggilnya dalam permintaan, dan pelayan pula akan membaca baris pertamanya dan melancarkan fail exe; untuk ini, sambungan *.cgi perlu dinyatakan dalam tetapan pelayan http sebagai sambungan untuk skrip. Dengan pendekatan ini, pelayan akan melancarkan program kami dengan baris arahan "test.exe path_to_test.exe" ini mempunyai beberapa kelebihan - yang pertama ialah orang yang menjalankan skrip kami tidak akan meneka apa yang ditulis dalam skrip, yang kedua ialah bahawa ia dihantar kepada kami nama fail dengan baris kami, kami boleh, sebagai contoh, menambah sebarang tetapan untuk skrip kami ke fail ini, yang memudahkan penyahpepijatan, dengan cara ini, ini adalah cara semua jurubahasa berfungsi - anda mungkin perasan bahawa dalam semua program perl/php/etc terdapat baris yang sama - menunjukkan kepada penterjemah arahan itu sendiri. Jadi, apabila pelayan memulakan program cgi, jika sambungan program didaftarkan sebagai skrip dalam tetapan, ia membaca baris pertama fail, dan jika ia ternyata dalam format yang diterangkan di atas, maka ia melancarkan program dinyatakan dalam baris dengan nama fail ini diikuti dengan ruang, katakan bahawa dalam Jurubahasa mutiara ditunjukkan dalam baris; setelah menerima hadiah sedemikian, ia memulakan pelaksanaannya, kerana Komen dalam Perl ialah simbol "#", kemudian ia melangkau baris pertama dan skrip terus dilaksanakan, secara amnya ia adalah perkara yang mudah.
Pada asasnya itu sahaja yang saya ingin tulis, saya tidak tahu betapa bergunanya semua ini kepada anda, tetapi saya akan mengatakan bahawa saya mempunyai pelayan intranet yang berjalan menggunakan skrip pemasang. Saya mengaku, tidak ada sebab yang bagus untuk melakukan ini, tetapi bagaimanapun, saya melakukannya pada mulanya semata-mata untuk alasan estetik dan keengganan untuk mempelajari mutiara/php atau sesuatu yang lain. TETAPI SAYA sama sekali tidak menghalang anda daripada belajar Pearl, tetapi sebaliknya, saya akan mengatakan bahawa ia adalah perlu untuk melakukan ini, dan bahkan sangat perlu, saya menyedari ini kemudian, tetapi saya masih berfikir bahawa pada pelayan yang sarat, di mana kelajuan pelaksanaan, pemuatan dan jumlah memori yang diduduki oleh aplikasi memainkan peranan skrip cgi yang ditulis dalam pemasang akan mengambil tempat yang sepatutnya.