Buongiorno a tutti.
Sono alle prime armi con i socket C in ambiente linux.
Volevo realizzare un semplice programma che crea due thread, un client ed un server che si scambiano un messaggio.
Il problema e' che ricevo sempre lo stesso errore nella connect(): network unreachable.
Sperando che qualcuno possa gentilmente aiutarmi, ringrazio anticipatamente e posto il codice

codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <netinet/in.h>
#include <netdb.h>

#define MAXSIZE 32
#define TWO 2
#define PORT 54322
#define SOCKET int
#define SOCKADDR const struct sockaddr
#define SOCKET_ERROR ((int)-1)
#define LOCALHOST 127.0.0.1
#define MAX_CONNECTION 10

// colori
#define rosso "\e[31m"
#define giallo "\e[33m"
#define verde "\e[32m"

typedef struct
{
	char *data;
	unsigned long tid;
} Message;

char error_msg[MAXSIZE];

void server(void *args)
{	
	printf(rosso"\nServer\n"verde);
	
	// Preparo variabili	
	Message *tosnd = (Message*) args;
	Message *torcv;
	int ris, optVal, len, newSock, byteSend, byteRecv;
	SOCKET ssock, AcceptSocket;
	struct sockaddr_in service, cli;

	// Creo socket
	printf(rosso"socket()\n"verde);
	ssock = socket(AF_INET, SOCK_STREAM, 0);
	if (ssock == SOCKET_ERROR)
	{
		printf(rosso"socket() failed\n"verde);
		perror(error_msg);	
		_exit(-1);
	}
	
	// Rendo il socket riutilizzabile
	printf(rosso"setsockopt()\n"verde);
	optVal = 1;
	ris = setsockopt(ssock, SOL_SOCKET, SO_REUSEADDR, &optVal, sizeof(optVal));
	if (ris == SOCKET_ERROR)  
	{
    		printf (rosso"setsockopt() SO_REUSEADDR failed\n"verde);
		perror(error_msg);
    		_exit(-1);
  	}

	// Assegno indirizzo e porta alla socket
	printf(rosso"bind()\n"verde);
	memset(&service, 0, sizeof(service));

	service.sin_family = AF_INET;
	service.sin_addr.s_addr = inet_addr("LOCALHOST"); 
	service.sin_port = htons(PORT);

	ris = bind(ssock, (SOCKADDR*)&service, sizeof(service));
	if (ris == SOCKET_ERROR)
	{		
		printf(rosso"bind() failed\n"verde);
		perror(error_msg);
		_exit(-1);
	}
	
	// Setto il socket all'ascolto
	printf(rosso"listen()\n"verde);
	ris = listen(ssock, MAX_CONNECTION);
	if (ris == SOCKET_ERROR)
	{
		printf(rosso"listen() failed\n"verde);
		perror(error_msg);
		_exit(-1);
	}
	
	// Attendo richieste di connessioni
	printf(rosso"accept()\n"verde);

	memset(&AcceptSocket, 0, sizeof(AcceptSocket) );
  	len = sizeof(AcceptSocket);

	newSock = accept(ssock, (struct sockaddr*) &cli, &len);
	if (newSock == SOCKET_ERROR)
	{
		printf(rosso"accept() failed"verde);
		perror(error_msg);
		_exit(-1);
	}
	
	// Attendo dati
	printf(rosso"read()\n"verde);
	byteRecv = read(newSock, &torcv, sizeof(Message));
	if (byteRecv < 0)
	{
		printf(rosso"read() failed\n"verde);
		perror(error_msg);
		_exit(-1);
	}
	printf(rosso">>> 1 Message!\n--> From TID %u Text: %s\n"verde, torcv->tid, torcv->data);

	// Invio i dati
	printf(rosso"write()\n"verde);

	tosnd->data = "Hi, I'm the server";
	tosnd->tid = pthread_self();

	byteSend = write(newSock, &tosnd, sizeof(Message));
	if (byteSend < 0)
	{
		printf(rosso"write() failed\n"verde);
		perror(error_msg);
		_exit(-1);
	}
	printf(rosso"server send %ld bytes\n"verde, byteSend);
	
	// Chiusura socket
	printf (rosso"close()\n"verde);
	close(ssock);
	close(newSock);
}

void client(void *args)
{
	printf(giallo"\nClient\n"verde);
	
	// Preparo variabili	
	Message *tosnd = (Message*) args;
	Message *torcv;
	int ris, len, byteSend, byteRecv;
	SOCKET csock, AcceptSocket;
	struct sockaddr_in clientService, cli;

	// Creo socket
	csock = socket(AF_INET, SOCK_STREAM, 0);
	if (csock == SOCKET_ERROR)
	{
		printf(giallo"socket() failed\n"verde);
		perror(error_msg);
		_exit(-1);
	}
	
	// Mi collego al socket del thread server
	printf(giallo"connect()\n"verde);

	clientService.sin_family = AF_INET;
	clientService.sin_addr.s_addr = inet_addr("LOCALHOST");
	clientService.sin_port = htons(PORT);

	ris = connect(csock, (SOCKADDR*)&clientService, sizeof(clientService));
	if (ris == SOCKET_ERROR)
	{
		printf(giallo"connect() failed\n");
		perror(error_msg);
		_exit(-1);
	}
	fflush(stdout);

	// Invio i dati
	printf(giallo"write()\n"verde);
	fflush(stdout);

	tosnd->data = "Hi, I'm the client";
	tosnd->tid = pthread_self();

	byteSend = write(csock, tosnd, sizeof(Message));
	if (byteSend < 0)
	{
		printf(giallo"write() failed\n"verde);
		perror(error_msg);
		_exit(-1);
	}
	printf(giallo"client send %ld bytes\n"verde, byteSend);
	
	// Attendo dati
	printf(rosso"read()\n"verde);
	byteRecv = read(csock, &torcv, sizeof(Message));
	if (byteRecv < 0)
	{
		printf(rosso"read() failed\n"verde);
		perror(error_msg);
		_exit(-1);
	}
	printf(giallo">>> 1 Message!\n--> From TID %u Text: %s\n"verde, torcv->tid, torcv->data);
	fflush(stdout);

	// Chiudo socket
	close(csock);
}

int main(int argc, char** argv)
{
	pthread_t thread1, thread2;
	Message *msg1, *msg2;
	
	// Primo thread sara' il server
	int rc1 = pthread_create(&thread1, NULL, (void*)&server, (void*)msg1);
	if(rc1 != 0)
	{
		perror(verde"*** Main: pthread_create() failed ***\n");
		exit(1);
	}
	printf(verde"*** Main: Thread1 created! ***\n");
	
	// Secondo thread sara' il client
	int rc2 = pthread_create(&thread2, NULL, (void*)&client, (void*)msg2);
	if(rc2 != 0)
	{
		perror(verde"*** Main: Main: pthread_create() failed ***\n");
		exit(1);
	}
	printf(verde"*** Main: Thread2 created! ***\n");

	pthread_join(thread1, NULL);
	pthread_join(thread2, NULL);

	printf(verde"*** Main: End! ***\n");
	fflush(stdout);
	_exit(0);
}