Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    7

    [C] errore nella connect() [RISOLTO]

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

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    7
    Problema risolto!
    Nell'inizializzazione della struttura sockaddr_in sia lato client che lato server ho messo al posto di:
    codice:
    clientService.sin_addr.s_addr = inet_addr("LOCALHOST");
    codice:
    clientService.sin_addr.s_addr = INADDR_ANY;
    che prende qualsiasi indirizzo.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.