Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    2

    [C] socket client/server

    Salve, ho scritto due sorgenti, uno client e uno server, in C e tramite le socket devono comunicare; la compilazione avviene senza errori e senza warning, ma al momento dell'esecuzione non so come fare in quanto gli eseguibili sono distinti.
    Da terminale ho provato: ./client ./server (sia insieme, che in ordine diverso, che separatamente)
    e in output ho da parte del client connessione fallita all'invoco della funzione connect()
    e in output da parte del server ho un'attesa continua, penso sull'invocazione della funzione listen().
    Quindi morale della favola il mio programma non va e non so come risolvere l'errore nel codice e se i comandi di esecuzione sono dati correttamente.

    ringrazio a chi mi darà una mano perchè non so come uscirne.


    Preciso che lancio i comandi da terminale e lavoro in ambiente linux-ubuntu.
    codice:
    //CLIENT.c 
    
    //CLIENT
    		
    
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    int main()
    {	/***** variabili per modulo client *******/
    
    	struct sockaddr_in serverIP;	// mi serve per comunicare con taluno server
    	int err_net;
    	int err_id;
    	int sk;	//n° socket
    	
    	char msg[26];		// scambio di messaggi
    	char msg_R[] = "che data/ora sono?";
    	int send_ok, rec_ok;	
    	int ok = 1;
    	
    	int close_ok;
    	
    
    	//Creo socket tramite taluna primitiva 
    	sk=socket(AF_INET, SOCK_STREAM, 0);		// fissa
    	
    	 if (sk==-1) // la primitiva in caso si errore ret -1
    	{
    		printf("Creazione socket fallito\n");
    		exit(1);
    	}
    	
    	// Assegnamento degli indirizzi
    	memset(&serverIP, 0, sizeof(serverIP)); 		/* azzera la struttura*/
    	serverIP.sin_family = AF_INET; 					/* IPv4 address */
    	serverIP.sin_port = htons(1050);				/* network ordered */
    	err_id = inet_pton(AF_INET, "127.0.0.1", &serverIP.sin_addr.s_addr);
    	
    	if (err_id==0) // la primitiva in caso si errore ret 0
    	{
    		printf("Indirizzamento fallito\n");
    		exit(1);
    	}
    	
    	// crea connessione 
    	err_net=connect(sk, (struct sockaddr*) &serverIP, sizeof(serverIP));
    	
    	if (err_net==-1) // la primitiva in caso si errore ret -1
    	{
    		printf("Connessione fallita\n");
    		exit(1);
    	}
    	
    	while(ok==1)	
    {	
    	// invio richiesta data/ora
    	send_ok = send(sk, (void *)msg_R, strlen(msg_R), 0);
    	
    	if (send_ok==-1 || send_ok < strlen(msg_R)) // la primitiva in caso si errore ret -1
    	{
    		printf("Invio di richiesta fallito, ritento\n");
    	}
    	else ok = 0;
    }
    
    	while(ok==0)
    {	
    	//ricevuta data/ora
    	rec_ok = recv(sk, (void*)msg, sizeof(msg), MSG_WAITALL);
    	
    	if ( (rec_ok == -1) || rec_ok<sizeof(msg)) 
    	{
    		int okk = 1;
    		printf("Packetloss, rinvio richiesta \n");
    		
    		while(okk == 1)	
    		{	
    			// invio richiesta data/ora
    			send_ok = send(sk, (void *)msg_R, strlen(msg_R), 0);
    	
    			if (send_ok==-1 || send_ok < strlen(msg_R)) // la primitiva in caso si errore ret -1
    			{
    				printf("Invio di richiesta fallito, ritento\n");
    			}
    			else okk = 0;
    		}
    		
    	}	
    	else ok = 1;
    }	
    	printf("%s",msg);	// ricevuto e stampo a video
    	
    	close_ok = close(sk);	// chiudo il so_cke_t
    	
    	if (close_ok==-1) // la primitiva in caso si errore ret -1
    	{
    		printf("chiusura socket client fallito\n");
    		exit(1);
    	}
    	
    	return 0;
    }
    	
    
    
    
    //SERVER.c
    		
    
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <time.h>
    
    int main()	
    {				/***** variabili per modulo server *******/
    
    	struct sockaddr_in clientIP, myIP;	//serve per comunicare tramite indirizzo col client
    	int err_bind;
    	int err_listen;
    	int err_accept;
    	int sk_server;		//n° socket
    	
    	
    	
    	char msg[26];	// scambio di messaggi
    	char msg_R[] = "che data/ora sono?";
    	char m[50];
    	int richiesta;
    	int send_ok, rec_ok;	
    	int ok = 1;
    	time_t ora;
    	
    	int close_ok;
    	socklen_t dim = sizeof(clientIP);
    	
    	//Creo socket tramite taluna primitiva 
    	sk_server=socket(AF_INET, SOCK_STREAM, 0);		// fissa
    	
    	 if (sk_server==-1) // la primitiva in caso si errore ret -1
    	{
    		printf("Creazione socket fallito\n");
    		exit(1);
    	}
    	
    	// Assegnamento degli indirizzi al server
    	memset(&myIP, 0, sizeof(myIP)); 					/* azzera la struttura*/
    	myIP.sin_family = AF_INET; 						/* IPv4 address */
    	myIP.sin_addr.s_addr = htonl(INADDR_ANY);		/* network ordered */
    	myIP.sin_port=htons(1050);
    	
    	// connetto local_inf al socket creato
    	err_bind = bind(sk_server, (struct sockaddr*) &myIP, sizeof(myIP));
    	
    	
    	if (err_bind==-1) // la primitiva in caso si errore ret -1
    	{
    		printf("Connessione fallita\n");
    		exit(1);
    	}
    	
    	
    	// server in ascolto su taluno socket
    	err_listen = listen(sk_server, 5)	;			// 5 richieste da servire contemporaneamente
    											// che vanno nella coda di buffer				
    	
    	if (err_listen==-1) // la primitiva in caso si errore ret -1
    	{
    		printf("Non ascolto\n");
    		exit(1);
    	}
    	
    	// accettazione della richiesta
    	err_accept = accept(sk_server, (struct sockaddr*) &clientIP, &dim);
    	
    	if (err_accept==-1) // la primitiva in caso si errore ret -1
    	{
    		printf("Richiesta rifiutata \n");
    		exit(1);
    	}
    	
    	
    	// ricezione di richiesta data/ora
    	rec_ok = recv(sk_server, (void*)m, sizeof(msg_R), MSG_WAITALL);
    	
    	richiesta = strcmp(m, msg_R);
    	
    	if( (rec_ok == -1) || richiesta !=0) 
    	{
    		printf("Packetloss \n");
    	}	
    	else
    	{
    			// invio data/ora.
    
    		time(&ora);
    		ctime_r(&ora, msg);
    	
    		send_ok = send(sk_server, (void *)msg, strlen(msg), 0);
    	
    		while(ok == 1)
    		{	
    			if (send_ok==-1 || send_ok < strlen(msg)) //in caso si errore ret -1
    			{
    				printf("Invio fallito, ritento\n");
    			}
    			else ok = 0;
    		}
    	}
    	
    	
    	close_ok = close(sk_server);
    	
    	if (close_ok==-1) // la primitiva in caso si errore ret -1
    	{
    		printf("chiusura socket server fallito\n");
    		exit(1);
    	}
    	
    	return 0;
    }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Ovviamente dovrai avviare prima il server e poi il client.
    Ovviamente in due terminali diversi.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    2
    grazie in effetti non ci avevo pensato... ho provato , ora dal lato client non da più connessione fallita , però in entrambi non succede nulla ... come posso fare? grazie

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.