Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194

    servizio echo con socket tcp

    Salve a tutti ecco i codici che ho provato a fare:
    Client:
    codice:
    #include<unistd.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<netdb.h>
    #include<arpa/inet.h>
    #include<errno.h>
    
    #define MAXSIZE 10
    
    int main(int argc, char *argv[])
    {
    	/* Variabili */
    	struct sockaddr_in Serv;
    	char remoteIpAddress[30] = "151.1.244.200"; /* www.html.it */
    	short int remotePortNumber = 8888;
    	int socketfd, ris;
    	struct hostent * host;
    	char msg[MAXSIZE];
    	char buffer[MAXSIZE];
    	int i, len, nwrite, nread, n;
    	
    	/* azzero l'area della struct */
    	memset(&Serv, 0, sizeof(Serv));
    	
    	/* imposto il messaggio da inviare al server */
    	for(i=0; i<MAXSIZE; i++)
    		msg[i] = 'a';
    	msg[MAXSIZE-1] = '\0';
    
    	/* creo la socket per il client */
    	if((socketfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    	{
    		perror("Errore nella creazione della soccket");
    		exit(1);
    	}
    	
    	if(argc > 1)
    	{
    		/* risoluzione indirizzo tramite il DNS */
    		if((host = gethostbyname(argv[1])) == NULL)
    		{
    			printf("Errore nella risoluzione del nome del dominio\n");
    			exit(1);
    		}
    		/* setto sin_addr per l'host remoto */
    		memmove((char *)&Serv.sin_addr, (char *)host->h_addr_list[0], 4);
    	}
    	else
    	{
    		if((Serv.sin_addr.s_addr = inet_addr(remoteIpAddress))== INADDR_NONE)
    		{
    			printf("Errore nella inet_addr\n");
    			exit(1);
    		}
    	}
    
    
    	/* setto la struct soccaddr_in per l'host remoto (n.b. il campo sin_addr è già settato) */
    	Serv.sin_family = AF_INET;
    	Serv.sin_port = htons(remotePortNumber);
    
    	/* Debug */
    	printf("mi sto per connettere a: %s\n", inet_ntoa(Serv.sin_addr));
    
    	/* richiesta connessione */
    	if((ris = connect(socketfd, (struct sockaddr*) &Serv, sizeof(Serv))) == -1)
    	{
    		perror("Errore durante la connessione");
    		exit(1);
    	}
    
    	/* Effettuo la scrittura del messaggio da inviare al server sulla socket */
    	len = strlen(msg) + 1;
    	nwrite = 0;
    	while((n = write(socketfd, &(msg[nwrite]), len-nwrite)) > 0)
    		nwrite += n;
    
    	printf("Scrittura eseguita\n");
    
    	/* Effettuo la lettura della risposta del server */ 
    	nread=0;
    	while((len > nread) && ((n = read(socketfd, &(buffer[nread]), len-nread)) >0))
    	{
    		nread += n;
    		printf("read effettuata, risultato n=%d len=%d nread=%d len-nread=%d\n", n, len, nread, len-nread);
    		fflush(stdout);
    	}       
    
    	/* Stampo la risposta del server */
    	printf("Il server dice: %s\n", buffer);
    	fflush(stdout);     
    
    	/* chiusura */
    	if((close(socketfd)) == -1)
    	{
    		perror("Errore durante la chiusura della socket");
    		exit(1);
    	}
    
    	return 0;
    }
    e il server:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <sys/types.h>
    #include <string.h>
    #include <errno.h>
    #include <netdb.h>
    
    #define SIZEMSG 1000000
    
    int main(int argc, char* argv[]){
    
    	struct sockaddr_in Local;
    	int returnSocket,socketAccept,returnListen,returnWrite,returnRead,returnBind;
    	int nwrite,nread,len,i,porta;
    	char buffer[SIZEMSG];
    
    	memset((void *)&Local,0,sizeof(Local));
    
    /*	Controllo prametri passati da comando	*/
    	if(argc!=2){
    		puts("Errore, mancano alcuni parametri fondamentali:");
    		puts("Usage: ./server numeroPorta");
    		exit(EXIT_FAILURE);
    	}
    
    /*	Apertura socket 	*/
    	porta=atoi(argv[1]);
    	returnSocket = socket(AF_INET,SOCK_STREAM,0);
    
    	if(returnSocket==-1)
    	{
    		perror("Errore nella creazione del socket");
    		exit(EXIT_FAILURE);
    	}
    
    /*	Riempiamo la struttura coi dati necessari alla connessione ed effettuo la bind()	*/
    	Local.sin_family = AF_INET;
    	Local.sin_port = htons(porta);
    	Local.sin_addr.s_addr = htonl(INADDR_ANY);
    	returnBind = bind(returnSocket,(struct sockaddr*)&Local,sizeof(Local));
    
    	if(returnBind == -1){
    		perror("Errore nella funzione bind()");
    		exit(EXIT_FAILURE);
    	}
    
    /*	Effettuo la listen()	*/
    	returnListen = listen(returnSocket,10);
    
    	if(returnListen == -1){
    		perror("Errore nella funzione listen()");
    		exit(EXIT_FAILURE);
    	}
    
    	printf("In stato di listen\n");
    
    /*	Effettuo la accept()	*/
    	while(1)
    	{
    		socketAccept = accept(returnSocket,(struct sockaddr *)NULL,NULL);
    
    		if(socketAccept == -1){
    			perror("Errore nella funzione accept()");
    			exit(EXIT_FAILURE);
    		}
    
    		printf("Ho accettato la connessione di un client\n");
    
              /*	Eseguo la lettura del client	*/
    		len = 15;
    		nread = 0;
    		while( (len>nread) && ((returnRead=read(socketAccept,&(buffer[nread]),len-nread ))>0) )
    			nread+=returnRead;
    
    		printf("Stringa ricevuta dal client: %s\n",buffer);
    		fflush(stdout);
    
    	  /*	Eseguiamo la scrittura	 */
    		nwrite = 0;
    		len = strlen(buffer) + 1;
    		while ( (returnWrite=write(socketAccept,&(buffer[nwrite]),len-nwrite)) > 0 )
    			nwrite+=returnWrite;
    
    		printf("Ho inviato: %s al client\n", buffer);
    		fflush(stdout);
    
    		close(socketAccept);
    
    		printf("Ho chiuso la connessione con il client\n");
    		fflush(stdout);
    	}
    
    	return 0;
    }
    Il problema è sicuramente nel server perchè il client l'ho provato con un'altra versione del server e funziona. In pratica quando lancio il client si pianta. Non capisco proprio dove sto sbagliando...
    Grazie.
    "There is no dark side of the moon really. Matter of fact it’s all dark."

  2. #2
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194
    Mi sono accorto che se tolgo questa parte dal client tutto funziona....Non so più dove sbattere la testa.
    codice:
    /*	/* Effettuo la lettura della risposta del server
    	nread=0;
    	while((len > nread) && ((n = read(socketfd, &(buffer[nread]), len-nread)) >0))
    	{
    		nread += n;
    		printf("read effettuata, risultato n=%d len=%d nread=%d len-nread=%d\n", n, len, nread, len-nread);
    		fflush(stdout);
    	}
    
    	/* Stampo la risposta del server
    	printf("Il server dice: %s\n", buffer);
    	fflush(stdout);     */
    "There is no dark side of the moon really. Matter of fact it’s all dark."

  3. #3
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194
    Nessun aiuto?

    "There is no dark side of the moon really. Matter of fact it’s all dark."

  4. #4
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194
    Ho risolto nel server così:
    codice:
    while( (len>nread) && ((returnRead=read(socketAccept,&(buffer[nread]),len-nread ))>0) )
    		{
    			nread+=returnRead;
    			if(buffer[nread-1] == '\0')
            			break; /* fine stringa */
    		}
    "There is no dark side of the moon really. Matter of fact it’s all dark."

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.