Salve a tutti ecco i codici che ho provato a fare:
Client:
e il server:codice:#include<unistd.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h> #include<arpa/inet.h> #include<errno.h> #define MAXSIZE 10 int main(int argc, char *argv[]) { /* Variabili */ struct sockaddr_in Serv; char remoteIpAddress[30] = "151.1.244.200"; /* www.html.it */ short int remotePortNumber = 8888; int socketfd, ris; struct hostent * host; char msg[MAXSIZE]; char buffer[MAXSIZE]; int i, len, nwrite, nread, n; /* azzero l'area della struct */ memset(&Serv, 0, sizeof(Serv)); /* imposto il messaggio da inviare al server */ for(i=0; i<MAXSIZE; i++) msg[i] = 'a'; msg[MAXSIZE-1] = '\0'; /* creo la socket per il client */ if((socketfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("Errore nella creazione della soccket"); exit(1); } if(argc > 1) { /* risoluzione indirizzo tramite il DNS */ if((host = gethostbyname(argv[1])) == NULL) { printf("Errore nella risoluzione del nome del dominio\n"); exit(1); } /* setto sin_addr per l'host remoto */ memmove((char *)&Serv.sin_addr, (char *)host->h_addr_list[0], 4); } else { if((Serv.sin_addr.s_addr = inet_addr(remoteIpAddress))== INADDR_NONE) { printf("Errore nella inet_addr\n"); exit(1); } } /* setto la struct soccaddr_in per l'host remoto (n.b. il campo sin_addr è già settato) */ Serv.sin_family = AF_INET; Serv.sin_port = htons(remotePortNumber); /* Debug */ printf("mi sto per connettere a: %s\n", inet_ntoa(Serv.sin_addr)); /* richiesta connessione */ if((ris = connect(socketfd, (struct sockaddr*) &Serv, sizeof(Serv))) == -1) { perror("Errore durante la connessione"); exit(1); } /* Effettuo la scrittura del messaggio da inviare al server sulla socket */ len = strlen(msg) + 1; nwrite = 0; while((n = write(socketfd, &(msg[nwrite]), len-nwrite)) > 0) nwrite += n; printf("Scrittura eseguita\n"); /* Effettuo la lettura della risposta del server */ nread=0; while((len > nread) && ((n = read(socketfd, &(buffer[nread]), len-nread)) >0)) { nread += n; printf("read effettuata, risultato n=%d len=%d nread=%d len-nread=%d\n", n, len, nread, len-nread); fflush(stdout); } /* Stampo la risposta del server */ printf("Il server dice: %s\n", buffer); fflush(stdout); /* chiusura */ if((close(socketfd)) == -1) { perror("Errore durante la chiusura della socket"); exit(1); } return 0; }
Il problema è sicuramente nel server perchè il client l'ho provato con un'altra versione del server e funziona. In pratica quando lancio il client si pianta. Non capisco proprio dove sto sbagliando...codice:#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <netinet/in.h> #include <sys/socket.h> #include <arpa/inet.h> #include <sys/types.h> #include <string.h> #include <errno.h> #include <netdb.h> #define SIZEMSG 1000000 int main(int argc, char* argv[]){ struct sockaddr_in Local; int returnSocket,socketAccept,returnListen,returnWrite,returnRead,returnBind; int nwrite,nread,len,i,porta; char buffer[SIZEMSG]; memset((void *)&Local,0,sizeof(Local)); /* Controllo prametri passati da comando */ if(argc!=2){ puts("Errore, mancano alcuni parametri fondamentali:"); puts("Usage: ./server numeroPorta"); exit(EXIT_FAILURE); } /* Apertura socket */ porta=atoi(argv[1]); returnSocket = socket(AF_INET,SOCK_STREAM,0); if(returnSocket==-1) { perror("Errore nella creazione del socket"); exit(EXIT_FAILURE); } /* Riempiamo la struttura coi dati necessari alla connessione ed effettuo la bind() */ Local.sin_family = AF_INET; Local.sin_port = htons(porta); Local.sin_addr.s_addr = htonl(INADDR_ANY); returnBind = bind(returnSocket,(struct sockaddr*)&Local,sizeof(Local)); if(returnBind == -1){ perror("Errore nella funzione bind()"); exit(EXIT_FAILURE); } /* Effettuo la listen() */ returnListen = listen(returnSocket,10); if(returnListen == -1){ perror("Errore nella funzione listen()"); exit(EXIT_FAILURE); } printf("In stato di listen\n"); /* Effettuo la accept() */ while(1) { socketAccept = accept(returnSocket,(struct sockaddr *)NULL,NULL); if(socketAccept == -1){ perror("Errore nella funzione accept()"); exit(EXIT_FAILURE); } printf("Ho accettato la connessione di un client\n"); /* Eseguo la lettura del client */ len = 15; nread = 0; while( (len>nread) && ((returnRead=read(socketAccept,&(buffer[nread]),len-nread ))>0) ) nread+=returnRead; printf("Stringa ricevuta dal client: %s\n",buffer); fflush(stdout); /* Eseguiamo la scrittura */ nwrite = 0; len = strlen(buffer) + 1; while ( (returnWrite=write(socketAccept,&(buffer[nwrite]),len-nwrite)) > 0 ) nwrite+=returnWrite; printf("Ho inviato: %s al client\n", buffer); fflush(stdout); close(socketAccept); printf("Ho chiuso la connessione con il client\n"); fflush(stdout); } return 0; }![]()
Grazie.

Rispondi quotando
