#include /* standard C i/o facilities */ #include /* system data type definitions */ #include /* socket specific definitions */ #include #include void echo( int sd ) { int len; char bufin[200],bufout[250]; while (readline(sd,bufin,100)!=0) { printf("Received: %s\n",bufin); sprintf(bufout,"ECHOING: %s",bufin); writeline(sd,bufout); } } /* Server 1. crea un socket 2. assegna un indirizzo al socket e stampa il numero di porta 3. metti il socket in modo passivo (listen) 4. ciclo infinito prendi la prossima connessione gestisci la connessione (fai l'echo) */ main() { int ld,sd; struct sockaddr_in skaddr; struct sockaddr from; int addrlen,length; /* crea il socket IP protocol family (PF_INET) TCP protocol (SOCK_STREAM) */ if ((ld = socket( PF_INET, SOCK_STREAM, 0 )) < 0) { printf("Problem creating socket\n"); exit(1); } /* stabilisci l'indirizzo del socket: address family AF_INET IP address INADDR_ANY (any of our IP addresses) il numero di porta e' assegnato dal kernel */ skaddr.sin_family = AF_INET; skaddr.sin_addr.s_addr = INADDR_ANY; skaddr.sin_port = 0; if (bind(ld, (struct sockaddr *) &skaddr, sizeof(skaddr))<0) { printf("Problem connecting binding\n"); exit(0); } /* ricava il numero di porta e stampalo */ length = sizeof( skaddr ); if (getsockname(ld, (struct sockaddr *) &skaddr, &length)<0) { printf("Error getsockname\n"); exit(1); } printf("The port number is %d\n",ntohs(skaddr.sin_port)); /* metti il socket in modo passivo */ if (listen(ld,5) < 0 ) { printf("Error calling listen\n"); exit(1); } while (1) { addrlen=18; if ( (sd = accept( ld, &from, &addrlen)) < 0) { printf("Problem with accept call\n"); exit(1); } printf("Got a connection - processing...\n"); echo(sd); printf("Done with connection\n"); close(sd); } }