Ho un piccolo problema con una semplice applicazione client-server. Il client passa come parametri un nome e cognome mentre il server li recepisce e li mette a video. Sembra tutto funzionare correttamente tranne il fatto che sul primo flusso di dati (intendo alla prima esecuzione) il server non mi stampa nulla a video ma devo lanciarlo per la seconda volta.
Magari lato server non do il giusto ordine alla logica ma non riesco proprio a capire.

Lascio il codice:

client.c
codice:
#include <arpa/inet.h> /* IP addresses conversion utililites */
#include <sys/socket.h> /* socket library */
#include <stdio.h> /* include standard I/O library */
#include <string.h> /* Include string */
#include <unistd.h> //Close()
#include <stdlib.h> //exit()


void error(const char *messaggio) {
    perror(messaggio);
    exit(1);
}


struct Persona {
	char nome[33];
	char cognome[33];
};


typedef struct Persona Persona;


int main(int argc, char *argv [])
{
    	int sockfd;
    	struct sockaddr_in servaddr;
    	char indirizzoServerCup[20] = "", portaServerCup[6] = "";
	Persona persona1;
	int n;




    	if(argc != 5) {
       		error("Non hai inserito il numero giusto di parametri");
    	}
    	strcpy(indirizzoServerCup,argv[1]);
    	strcpy(portaServerCup, argv[2]);
	strcpy(persona1.nome, argv[3]);
	strcpy(persona1.cognome, argv[4]);




	if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		error("Errore socket");
	}


	servaddr.sin_addr.s_addr = inet_addr(&indirizzoServerCup[0]);
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = atoi(&portaServerCup[0]);


	if((connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr))) < 0) {
		error("Errore connect");
	}


	printf("Ti sei connesso al server come %s %s\n", persona1.nome, persona1.cognome);
	n = write(sockfd, &persona1, sizeof(Persona));
	if(n < 0) {
		printf("ERRORE WRITE\n");
	} 
			
    	close(sockfd);
    return 0;
}
server.c
codice:
#include <arpa/inet.h> /* IP addresses conversion utililites */
#include <sys/socket.h> /* socket library */
#include <stdio.h> /* include standard I/O library */
#include <string.h> /* Include string */
#include <unistd.h> //Close()
#include <stdlib.h> //exit()


void error(const char *messaggio) {
    perror(messaggio);
    exit(1);
}


struct Persona {
	char nome[33];
	char cognome[33];
};


typedef struct Persona Persona;


int main(int argc, char *argv [])
{
    int list_fd, conn_fd, newlist_fd;
    struct sockaddr_in serv_add, client;
    socklen_t clilen;
    pid_t pid;
    char portaServerCup[6] = "";
    Persona persona;
    int n;


    if(argc != 2) {
        error("Non hai inserito il numero esatto di parametri");
    }
    strcpy(portaServerCup, argv[1]);


    if((list_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        error("socket");
    }


    serv_add.sin_family = AF_INET; //Stabiliamo che gli indirizzi sono IPv4
    serv_add.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_add.sin_port = atoi(&portaServerCup[0]);


    if(bind(list_fd, (struct sockaddr*) &serv_add, sizeof(serv_add)) < 0 ) {
        error("bind error");
    }


    if(listen(list_fd, 5)) {
        error("listen");
    }


	printf("Server in attesa...\n");
    while(1) {
	
        clilen = sizeof(client);
        if(newlist_fd = accept(list_fd, (struct sockaddr *) &client, &clilen) < 0 ) {
            error("accept");
        }


        if((pid = fork()) < 0 ) {
            error("fork error");
        }


        if(pid == 0) {
            close(list_fd);	
	    n = read(newlist_fd, &persona, sizeof(Persona));
	    if(n < 0) {
		printf("ERRORE READ\n");
	    } else {
	    	printf("%s %s si è connesso al server\n", persona.nome, persona.cognome);
	    }


            close(newlist_fd);
	    exit(1);
        } else {
	   close(newlist_fd);
	}
    }


    return 0;
}