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