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;
}