Lucrarea de Laborator Nr. 3: Programarea Sistemelor Distribuite
Lucrarea de Laborator Nr. 3: Programarea Sistemelor Distribuite
<OPTION VALUE="SDTP">SDTP</OPTION>
</SELECT>
<BR>
Nume student: <INPUT TYPE="TEXT" NAME="numestudent"><BR>
Nota examen: <INPUT TYPE="TEXT" NAME="notaex"><BR>
Nota pe parcurs: <INPUT TYPE="" NAME="notaparcurs"><BR>
<INPUT TYPE="SUBMIT" NAME="Trimite" VALUE="Trimite">
<INPUT TYPE="RESET" NAME="Reset" VALUE="Reset">
</FORM>
</BODY>
</HTML>
Fiierul interCGI.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NUMAX 50
#define VALMAX 50
#define NPARAM_MAX 20
int CitesteParam_CGI()
{
char citit[(NUMAX+VALMAX)*NPARAM_MAX],*p,k,i;
//Citirea argumentelor
if(strcmp(getenv("REQUEST_METHOD"),"POST")==0)
fgets(citit,atoi(getenv("CONTENT_LENGTH"))+1,stdin);
else
if(strcmp(getenv("REQUEST_METHOD"),"GET")==0)
strcpy(citit,getenv("QUERY_STRING"));
else return 0;
//Decodificare perechi nume=valoare
for(k=0,p=citit;*p;k++,p++){
for(i=0;*p && *p!='=';p++) param_CGI[k].nume[i++]=*p;
param_CGI[k].nume[i]='\0';
if(*p++==0){ //fara valoare
param_CGI[k].valoare[i]='\0';
break;
}
for(i=0;*p && *p!='&';p++) param_CGI[k].valoare[i++]=*p;
param_CGI[k].valoare[i]='\0';
DecodificaSir_CGI(param_CGI[k].valoare);
if(*p==0)
break;
}
return nr_param_CGI=k+1;
//nr.parametrilor CGI
}
void DeschideDocDinamic(char *titlu)
{
printf("Content-type: text/html\n\n");
printf("\n<HTML><HEAD><TITLE>%s</TITLE></HEAD><BODY>",titlu);
}
void InchideDocDinamic()
{
printf("</BODY></HTML>");
}
Fiierul notare.c
#include "interCGI.c"
int main()
{
int n;
FILE *f;
DeschideDocDinamic("Inregistrare note");
if(strcmp(getenv("REQUEST_METHOD"), "POST") != 0)
return 0;
if( (n = CitesteParam_CGI())<1 || n>5)
return 0;
printf("Date primite<BR>");
printf("Nume: %s<BR>", ValoareParametru_CGI("numestudent"));
printf("Disciplina: %s<BR>", ValoareParametru_CGI("disciplina"));
printf("Nota examen: %s<BR>", ValoareParametru_CGI("notaex"));
printf("Nota pe parcurs %s<BR>",
ValoareParametru_CGI("notaparcurs"));
if ( (f = fopen("note.txt", "at")) == NULL)
return 0;
fprintf(f,"%s\n",
fprintf(f,"%s\n",
fprintf(f,"%s\n",
fprintf(f,"%s\n",
ValoareParametru_CGI("numestudent"));
ValoareParametru_CGI("disciplina"));
ValoareParametru_CGI("notaex"));
ValoareParametru_CGI("notaparcurs"));
fclose(f);
printf("<HR>Datele au fost scrise in fisier!<BR>");
InchideDocDinamic();
return 0;
}
Compilarea programului
gcc -o notare.cgi notare.c
Testarea programului
Creai un fiier note.txt (n directorul cgi-bin) i acordai drepturi de
scriere tuturor utilizatorilor;
ncrcai formularul HTML;
Introducei valori pentru toate cmpurile formularului;
Efectuai click de mouse pe butonul Trimite.
Fiierul note.txt
Ion Ionescu
PCLP1
9
8
Vasilescu Vasile
PCLP1
6
9
Ion Ionescu
PCLP2
5
7
Tem de laborator:
1. Scriei un program CGI pentru afiarea notelor
nregistrate n fiierul note.txt.
2. Modificai exemplul prezentat n lucrarea de
laborator astfel nct, numele studentului
cruia i se nregistreaz nota s nu mai fie
introdus ntr-un cmp text (ceea ce ar putea
provoca erori), ci s fie ales dintr-o list de
selecie. Lista de selecie va fi populat n
mod dinamic, pe baza informaiilor coninute
ntr-un fiier text, denumit studenti.txt. Pentru
realizarea acestui obiectiv, formularul de
introducere a notelor va fi creat, n mod
dinamic, de ctre un program CGI.
3. Scriei o aplicaie CGI care va permite
introducerea
numelor
studenilor
i
nregistrarea acestor informaii n fiierul
studenti.txt.