Ragazzi gentilmente potete darmi una visione di questi codici se vi sembrano corretti. Grazie
Vi posto il testo:
Titolo: Media di una matrice bidimensionale a valori interi.
Scopo: Si progetti e si implementi in linguaggio C un’appicazione Client/Server in cui Il Client, dato in input un file contenente una matrice bidimensionale a valori interi, invia le dimensioni ed il contenuto del file, il Server restituisce il valore medio dei dati ricevuti.
Si implementi un Server concorente (tramite thread o fork) ed un client possa essere interrotto o stoppato solo dopo avere ricevuto la risposta dal server o solo dopo un timeout di 2 minuti.
codice:
//lato server
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <netinet/in.h> // struttura per la gestione degli indirizzi internet
#include <sys/socket.h> // funzione socket(),bind()
int main(int argc, char *argv[]){
int sd_server, sd_client; //I socket descriptor
struct sockaddr_in server_addr, client_addr;
int sin_size,ris,ls_result,temp,rig,col,i,j;
float med,som=0;
char buff[80]; /* dati di invio e ricezione */
pid_t pid;
/*Creazione della socket*/
sd_server=socket(AF_INET, SOCK_STREAM, 0);
if (sd_server < 0){
printf("Server:errore nella creazione della socket.\n");
exit(EXIT_FAILURE);
}
else printf("Socket creata con successo\n");
/* Effettua la bind sull'indirizzo e porta ora specificati */
server_addr.sin_family = AF_INET; /* la famiglia dei protocolli */
server_addr.sin_port = htons(1745); /* la porta in ascolto */
server_addr.sin_addr.s_addr = INADDR_ANY; /* dato che è un server bisogna associargli l'indirizzo della macchina su cui sta girando */
/*Assegnazione del processo alla socket tramite la funzione BIND*/
if(bind(sd_server,(struct sockaddr *)&server_addr,sizeof(struct sockaddr)) < 0){
printf("Errore di binding\n");
exit(EXIT_FAILURE);
}
/*la socket si mette in ascolto con un massimo di 10 connessioni*/
ls_result = listen(sd_server, 10);
if (ls_result < 0){
printf("Server: errore durante la listen.\n");
exit(EXIT_FAILURE);
}
else printf("La Socket e' in Ascolto\n");
sin_size = sizeof(client_addr);
while(1){
sd_client = accept(sd_server, (struct sockaddr *)&client_addr, &sin_size);
if(sd_client < 0) {
printf("Errore nella chiamata accept\n");
exit(EXIT_FAILURE);
}
pid = fork();
if(pid == 0) { /* figlio */
close(sd_server); /* si chiude perché non serve più al figlio */
strcpy(buff, "Tutto OK!");
printf("%s\n",buff);
send(sd_client,buff, 80, 0);
recv(sd_client, &col, sizeof(int), 0);
printf("il numero di colonne e' %d\n",col);
memset(buff, '\0', 80); //funzione che cancella gli ultimi dati del buffer
strcpy(buff, "Ok colonne!\n");
send(sd_client, buff, 80, 0);
recv(sd_client, &rig, sizeof(int), 0);
printf("il numero di righe e' %d\n",rig);
memset(buff, '\0', 80);
strcpy(buff, "Ok righe\n");
send(sd_client, buff,80, 0);
for(i=0;i<rig;i++){
for(j=0;j<col;j++){
recv(sd_client,&ris,sizeof(int), 0);
printf("Ricezione dati in corso... ricevo il numero:%d\n",ris);
som=som+ris;
}
memset(buff, '\0', 80);
strcpy(buff, "Ok riga ");
sprintf(buff,"%s%d",buff,i+1);
send(sd_client, buff, 80, 0);
}
med=som/(rig*col);
printf("Spedisco al client la media calcolata:%.2f\n",med);
send(sd_client, &med, sizeof(float), 0);
close(sd_client); /* disconnessione */
exit(0); /* chiude il processo*/
}
else if(pid > 0) { /* padre */
close(sd_client); /* si chiude perché non serve più al padre */
}
else {
printf("Errore nella creazione del figlio\n");
exit(-1);
}
}
/* Per terminare l'esecuzione del server è necessario usare i tasti CTRL + C */
return EXIT_SUCCESS;
}
codice:
//lato client
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h> // system defined identifiers.
#include <netinet/in.h> // internet address structure.
#include <sys/socket.h> // Need 4 socket(), bind(),
#include <netdb.h>
#include <signal.h>
#define true 1
#define false 0
void EnableDisableTerm(int enable) //funzione per la gestione di ignoro e default dei segnali
{
signal (SIGINT,enable?SIG_DFL:SIG_IGN);
signal (SIGTERM,enable?SIG_DFL:SIG_IGN);
}
void alarmhandler() //funzione per la gestione dei segnali dopo il timeout
{
EnableDisableTerm(true);
}
int main(int argc, char *argv[]){
if(argc<4){
printf("errore nelL'esucuzione del programma. Dati inseriti non sono sono sufficienti\n");
exit(EXIT_FAILURE);}
else{
//gestione dei segnali
signal(SIGALRM,alarmhandler);
EnableDisableTerm(false); //disabilitazione dei segnali
alarm(120);//SIG_DFL dopo un timout di due minuti
int sd; /* Il socket descriptor del client */
struct sockaddr_in addr; /* l'indirizzo del server */
char buff[80]; /* dati di invio e ricezione */
FILE*fp;
fp=fopen(argv[3],"r");
if(fp==NULL){
printf("errore nell'apertura del file\n");
exit(EXIT_FAILURE);
}
else{
printf("File %s aperto con successo\n",argv[3]);
/* Utilizzando la struttura hostent si definisce l'indirizzo del server */
struct hostent *h;
h = gethostbyname(argv[1]);
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(argv[2]));
/* successivamente viene memorizzato nella struttura server_addr */
bcopy(h->h_addr,&addr.sin_addr,h->h_length);
/* Viene creato il socket descriptor */
if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
printf("Errore nella creazione della socket\n");
close(sd);
exit(EXIT_FAILURE);
}
/* Connessione al server */
if(connect(sd, (struct sockaddr *)&addr, sizeof(addr)) < 0){
printf("Errore di connessione al server\n");
close(sd);
exit(EXIT_FAILURE);
}
alarm(0); //il timer viene riazzerato dopo la connect
EnableDisableTerm(true);// dopo la rispota del server si imposta il SIG_DFL
recv(sd, buff, 80, 0);
printf("il Server risponde:%s\n",buff);
/* Acquisizione della matrice letta da file */
int **mat;
float med;
int c,i,j,r;
printf("Lettura numero di colonne\n");
fscanf(fp,"%d",&c);
send(sd, &c,sizeof(int), 0);
memset(buff, '\0', 80); //funzione che cancella gli ultimi dati del buffer
recv(sd, buff, 80, 0);
printf("il Server risponde:%s\n",buff);
printf("Lettura numero di righe\n");
fscanf(fp,"%d",&r);
send(sd, &r,sizeof(int), 0);
memset(buff, '\0', 80);
recv(sd, buff, 80, 0);
printf("il Server risponde:%s\n",buff);
printf("Creo Matrice\n");
mat=(int**)malloc(r*sizeof(int*));
for(i=0;i<r;i++)
mat[i]=(int*)malloc(c*sizeof(int));
printf("Caricamento dati in matrice\n");
for(i=0;i<r;i++)
for(j=0;j<c;j++)
fscanf(fp,"%d",&mat[i][j]);
fclose(fp);
printf("Matrice acquisita con successo\n");
/* Si stampano e si inviano i dati della matrice */
printf("stampo matrice\n");
for(i=0;i<r;i++){
printf("\n");
for(j=0;j<c;j++)
printf("%d",mat[i][j]);
}
printf("\n");
for(i=0;i<r;i++){
for(j=0;j<c;j++){
printf("i dati che sto inviando sono:%d\n",mat[i][j]);
send(sd,&mat[i][j],sizeof(int), 0);
}
memset(buff, '\0', 80);
recv(sd, buff, 80, 0);
printf("il Server risponde:%s\n",buff);
}
printf("Attendo il risultato...\n");
recv(sd, &med, sizeof(float), 0);
printf("la media della matrice è %.2f\n",med);
close(sd);
}
}
return 0;
}