PDA

Visualizza la versione completa : [C] errore nella connect()


shazo
19-04-2010, 11:46
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



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

shazo
19-04-2010, 12:11
Problema risolto!
Nell'inizializzazione della struttura sockaddr_in sia lato client che lato server ho messo al posto di:


clientService.sin_addr.s_addr = inet_addr("LOCALHOST");




clientService.sin_addr.s_addr = INADDR_ANY;

che prende qualsiasi indirizzo.

Loading