Questo è il mio progetto:
codice:
Si progetti e si implementi in linguaggio C un’applicazione Client/Server in cui Il Client invia due caratteri ed il Server restituisce la distanza di hamming della rappresentazione binaria dei due caratteri secondo i codice ascii.
Si ricorda che la distanza di Hamming tra due stringhe di ugual lunghezza è il numero di posizioni nelle quali i simboli corrispondenti sono diversi.


Ad esempio dati x=’b’ e y=’g’, la codifica ascii del carattere ‘b’ in decimale è 98 in binario 01100010, la codifica ascii del carattere ‘g’ in decimale è 103 in binario 01100111.
La distanza di Hamming tra 01100010 e 01100111 è 2.


Si implementi un Server concorrente (tramite thread o fork) ed un client che possa essere interrotto o stoppato solo dopo avere ricevuto la risposta dal server o solo dopo un timeout di 2 minuti.


La comunicazione tra Client e Server segue il protocollo seguente:
1. Il Client legge da linea di comando l’indirizzo, il numero di porta del server e si collega al Server.
2. Il Server invia al Client la stringa “OK”
3. Il Client dopo la lettura di OK, invia i  due caratteri
4. Il Server invia al Client la stringa “OC” calcola la distanza e la invia al Client, se i caratteri sono entrambi ‘0’, chiude la connessione, viceversa invia OK
5. Il Client dopo la lettura di OC attende il risultato e se ha inviato due ‘0’ termina , viceversa va al passo 3



Ho scritto in C il procedimento standard per calcolare la distanza di Hamming:
codice:
#include <stdio.h>
#include <stdlib.h>


int main (void) 
{
	int x, y, h;                              //getchar restiruisce interi ..... h = distanza di Hamming
	
	printf("Introduci due caratteri consecutivamente:   ");
	
	x = getchar(); 
	y = getchar();
	
	//Creazione di due vettori di dimensione 8 bit
	int vx[8] = {0}, vy[8] = {0};
	
	//Conversione da decimale a binario del primo carattere
	int i = 0;  
	int t = x;                     //indice del vettore
	while (t > 0) {
	  vx[i++] = t % 2;
	  t /= 2;                       // t = t / 2;	
	}
	//Conversione da decimale a binario del secondo carattere
	t = y;
	i = 0;
	while (t > 0) {
	  vy[i++] = t % 2;
	  t /= 2;                       // t = t / 2;	
	}
	//Stampa il primo carattare convertito in binario
	printf("\nIl carattere %c in decimale: %d, in binario corrisponde: \n", x, x);
	for (i=7; i>=0; i--)
	  printf ("%d", vx[i]);
	
	//Stampa il secondo carattare convertito in binario 
	printf("\nIl carattere %c in decimale: %d, in binario corrisponde: \n", y, y);
	for (i=7; i>=0; i--)
	  printf ("%d", vy[i]);
	  
	//Distanza di Hamming
	h = 0;                        //contatore della distanza
	for (i = 0; i < 8; i++)
	  if (vx[i] != vy[i])
	    h++;	  	  
	
	//Stampa la distanza di Hamming
	printf ("\nLa distanza di Hamming tra %c e %c e' : %d ", x, y, h); 
printf("\n\n\n"); 	  
return 0;
}

Non ho ben capito se devo farlo col protocollo TCP o UDP.
Se voglio usare il protocollo UDP, i due codici standard Client e Server sono questi:


SERVER UDP
codice:
#include <stdio.h>
#include <stdlib.h> 
#include <string.h> /* memset() */ 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <netdb.h> 
#include <unistd.h> /* close() */ 
#define LOCAL_SERVER_PORT 4000 
#define MAX_MSG 100 
int main(int argc, char *argv[]) 
{int sd, rc, n, cliLen; 
 struct sockaddr_in cliAddr, servAddr; 
 char msg[MAX_MSG]; 
 /* socket creation */ 
 sd=socket(AF_INET, SOCK_DGRAM, 0); 
 if(sd<0) 
  {printf("%s: cannot open socket \n",argv[0]); 
   exit(1); 
  } 
 /* bind local server port */ 
 servAddr.sin_family = AF_INET; 
 servAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
 servAddr.sin_port = htons(LOCAL_SERVER_PORT); 
 rc = bind (sd, (struct sockaddr *) &servAddr,sizeof(servAddr)); 
 if(rc<0)
  {printf("%s: cannot bind port number %d \n",  argv[0], LOCAL_SERVER_PORT); 
   exit(1); 
  } 
 printf("%s: waiting for data on port UDP %u\n", argv[0],LOCAL_SERVER_PORT); 
 /* server infinite loop */ 
 while(1) 
  {/* init buffer */ 
   memset(msg,0x0,MAX_MSG); 
   /* receive message */ 
   cliLen = sizeof(cliAddr); 
   n = recvfrom(sd, msg, MAX_MSG, 0, (struct sockaddr *) &cliAddr, &cliLen); 
   if(n<0) 
   {printf("%s: cannot receive data \n",argv[0]);continue;} 
    /* print received message */ 
    printf("%s: from %s:UDP%u : %s \n", 
    argv[0],inet_ntoa(cliAddr.sin_addr), 
    ntohs(cliAddr.sin_port),msg); 
   }  /* end of server infinite loop */ 
 return 0; 
}

CLIENT UDP
codice:
#include <stdio.h>
#include <stdlib.h> 
#include <string.h> /* memset() */ 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <netdb.h> 
#include <unistd.h> 
#include <sys/time.h> /* select() */ 
#define REMOTE_SERVER_PORT 4000
#define MAX_MSG 100 


int main(int argc, char *argv[]) 
{int sd, rc, i; 
 struct sockaddr_in cliAddr, remoteServAddr; 
 struct hostent *h; 
 /* check command line args */ 
 if(argc<3) 
 {printf("usage : %s <server> <data1> ... <dataN> \n", argv[0]);
  exit(1);
 } 
 /* get server IP address (no check if input is IP address or DNS name */ 
 h = gethostbyname(argv[1]); 
 if(h==NULL) 
 {printf("%s: unknown host '%s' \n", argv[0], argv[1]); 
  exit(1); 
 } 
 printf("%s: sending data to '%s' (IP : %s) \n", argv[0], h->h_name, 
 inet_ntoa(*(struct in_addr *)h->h_addr_list[0])); 
 remoteServAddr.sin_family = h->h_addrtype; 
 memcpy((char *) &remoteServAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length); 
 remoteServAddr.sin_port = htons(REMOTE_SERVER_PORT); 
 /* socket creation */ 
 sd = socket(AF_INET,SOCK_DGRAM,0); 
 if(sd<0)
 {printf("%s: cannot open socket \n",argv[0]); 
  exit(1); 
 } 
 /* bind any port */ 
 cliAddr.sin_family = AF_INET; 
 cliAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
 cliAddr.sin_port = htons(0); 
 rc = bind(sd, (struct sockaddr *) &cliAddr, sizeof(cliAddr)); 
 if(rc<0)
 {printf("%s: cannot bind port\n", argv[0]); 
  exit(1); 
 } 
 /* send data */ 
 for(i=2;i<argc;i++)
 {rc = sendto(sd, argv[i], strlen(argv[i])+1, 0,(struct sockaddr *) &remoteServAddr,sizeof(remoteServAddr)); 
  if(rc<0)
  {printf("%s: cannot send data %d \n",argv[0],i-1); 
   close(sd); 
   exit(1); 
  } 
 } 
return 0; 
}

Come faccio a unire il codice C con Client/Server e implementare un server concorrente tramite thread o fork?