PDA

Visualizza la versione completa : [C] Variabili in un proxy concorrente


skyboy85
05-12-2007, 10:13
Salve a tutti,mi scuso se nel precedente topic nn ho usato un titolo adeguato!
ho scritto in C il codice di un proxy concorrente...il mio problema ke ogni volta ke si esegue la funzione ke svolge le funzioni di proxy in questa funzione tutte le variabili partono sempre dai valori iniziali e nn dall'ultimo valore.
ad esempio io uso una variabile contatore ke di volta in volta ne incremento il valore,ma ogni volta ke si esegue la funzione (cio arriva una richiesta) ke svolge il proxy, assume sempre lo stesso valore...
Nn so se mi sono spiegato bene...Grazie :)

xam85reBanned
05-12-2007, 10:40
OT
non paghi il forum a carattere, evitiamo abbreviazioni tipo "ke" "nn" etc
OT

hai provato a dichiararle "static" ?

skyboy85
05-12-2007, 11:12
ho provato come mi hai suggerito...

le ho perfino dichiarate come varibili globali all'inizio del codice :dh:

xam85reBanned
05-12-2007, 11:16
prova a postare i codice con la quale chiami la funzione e la funzione stessa.

skyboy85
05-12-2007, 11:36
questo parte del main:


while(1){

len = sizeof(cli_add);
if((conn_fd=accept(list_fd,(struct sockaddr*) &cli_add,&len))<0){
perror("errore nell' esecuzione della accept\n");
exit(1);
}



if((pid=fork())<0){
perror("errore nella creazione del figlio\n");
exit(1);
}

if(pid==0){ // processo figlio


proxyhttp(conn_fd);
exit(0);
}

else{ // processo padre
close(conn_fd);
}
}


questa la funzione ke svolge il proxy:

void proxyhttp(int sockfd){

char sendbuffer[MAX];
char rcvbuffer[MAX];
static richiesta testa; //per gestire la cache uso le liste linkate,questo il puntatore alla lista delle richieste
static risposta testa1; //puntatore alla lista delle risposte
static int i=1;
static int j=1;
int nread,nwrite;
int pres;




while((nread=read(sockfd,sendbuffer,MAX))>0){
sendbuffer[nread]=0;

printf("SOCKET: %s\n",sendbuffer); // richiesta http,dopo va inserito il cache delle risorse



if((pres=controllorichieste(testa,sendbuffer))==0) { // se la risorsa nn c' allora apro un socket verso il server web
printf("PRES = %d\n",pres);
printf("TESTA PRIMA INSER= 0x%x\n",testa);
inserimentorichieste(i,&testa,sendbuffer);
printf("TESTA DOPO INSER= 0x%x\n",testa);
// inserisco la richiesta in un file txt ed in una lista
i++;
printf("valore di i: %d\n",i);

int newfd;
struct sockaddr_in newsock;

const char* serverip = "143.225.250.12";

if ( (newfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("Socket creation error\n");
exit(1);
}

memset((void *)&newsock, 0, sizeof(newsock));
newsock.sin_family = AF_INET;
newsock.sin_port = htons(80);

if((inet_pton(AF_INET,serverip,&newsock.sin_addr))<0){
perror("errore nella conversione dell'indirizzo\n");
exit(1);
}


if(connect(newfd,(struct sockaddr* )&newsock,sizeof(newsock))<0){
printf("Errore nella connessione: %s", strerror(errno));
exit(1);
}


FullWrite(newfd,sendbuffer,strlen(sendbuffer));
FullRead(newfd,rcvbuffer,MAX);
printf("SOCKET di risp: %s\n",rcvbuffer);

inserimentorisposte(j,&testa1,rcvbuffer);
collegamento(testa,testa1); // inserisco la risorsa in un file di testo e nella lista

j++;
FullWrite(sockfd,rcvbuffer,strlen(rcvbuffer));
}

else{ // risorsa presente
int file;


if((file=open("./cache/filetemp.txt",O_RDONLY))<0){
printf("errore nell' apertura del file\n");
}
FullRead(file,rcvbuffer,MAX);
FullWrite(sockfd,rcvbuffer,strlen(rcvbuffer));


}

}

return;
}

le funzioni controllocache,inserimentorichiesta ed altre funz nn standard sono definite in altri file sorgenti che includo in questo...

skyboy85
05-12-2007, 11:40
mi scuso per aver abbreviato di nuovo le parole!!! Sorry

Loading