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
server.ccodice:#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; }
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; }

Rispondi quotando