Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213

    [C] Read() non funziona al primo flusso

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

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213
    Nessuno sa aiutarmi?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.