Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [C] Implementazione Server socket

    Stavo provando ad implementare una socket di un server che puņ accettare connessioni da un client, ho errori nell' esecuzione al momento del bind....sembrerebbe che voglia fare eseguire una operazione tipica delle socket a qualcosa che non č una socket...ecco il codice:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <errno.h>
    #include <unistd.h>
    
    #define LOCIP "127.0.0.1"
    #define BUFFSIZE 1024
    #define PORT 2000
    #define CONNECTIONS 512
    
    int main(int argc, char * arv[])
    {
    	int servId, clientId, /*s,*/ retcode;         //ID Server, Client, contatore byte
    	struct sockaddr_in servip, clientip;          //Strutture per indirizzo ip server e client 
    	socklen_t servipL, clientipL;                 //lunghezza indirizzi
    	char buffer[BUFFSIZE];
    	char msg[BUFFSIZE];
    	
    	if((servId=socket(PF_INET, SOCK_STREAM, 0)==-1)){        //apertura socket server
    	perror("Error...creating socket...");
    	exit(-1);
    	}
    	
    	servip.sin_family=AF_INET;                     //settaggio dominio e porta server
    	servip.sin_port=htons((unsigned)PORT);
    	
    	inet_aton(LOCIP, &servip.sin_addr);            //assegnazione indirizzo intero alla struttura mediante conversione 
    	
    	servipL=clientipL=sizeof(struct sockaddr_in);        //memorizzazione lunghezza indirizzo 
    	
    	
    	if((bind(servId, (struct sockaddr *)&servip, servipL))==-1){             //assegnazione indirizzo server per la rete
    		perror("Error trying to bind");
    		exit(-2);
    	 }
    	
    	listen(servId, CONNECTIONS);   //attesa di connessioni...
    	
    	while((clientId=accept(clientId, (struct sockaddr *) &clientip, &clientipL)!=-1)){       //accetazione connesioni da parte di client
    		
    		printf("Client from %s/%d connected\n", 
    		       inet_ntoa(clientip.sin_addr), 
    		       ntohs(clientip.sin_port));                                 //stampa indirizzo e porta del client 
    											
    											
    		while((retcode=read(clientId, &buffer, BUFFSIZE))>0){                  //ricevo byte e stampo
    			buffer[retcode-1]='\0';
    			printf("Client asks: %s", buffer);
    			buffer[retcode-1]='\n';
    			 								
    		}
    		
    		close(clientId);                                  //chiudo connessione con il client            
    		printf("%s", "Connection with client closed");   
    	}
    	
    	
    	exit(0);
    }

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Prova a pulire il sockaddr con la memset per settare tutti i campi a zero prima di scriverci sopra.

  3. #3
    Esattamente come si fa? Ho provato a scrivere prima della bind():

    codice:
    memset((void*)&servip, 0, (size_t)servipL);
    Non so se č corretto usarla cosģ ma sono una frana con i puntatori e non so se ho ben capito quello a cui ti riferisci...

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    codice:
    memset((void*)&servip, 0, sizeof(servip));

  5. #5
    No.....purtroppo permane l' errore del bind...

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quale errore? Cerca di ottenere un dettaglio, un codice ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Ma il problema č che l' errore che spunta da terminale č molto generico......eseguendo il codice l' errore č:

    codice:
    Error trying to bind: Socket operation on non-socket
    
    
    ------------------
    (program exited with code: 254)
    Press return to continue

    Nient' altro....

  8. #8
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    codice:
    servip.sin_family=AF_INET;                     
    servip.sin_port=htons((unsigned)PORT);
    inet_aton(LOCIP, &servip.sin_addr);          
    servipL=clientipL=sizeof(struct sockaddr_in);
    Usi la memset dopo queste istruzioni, vero? Se č cosģ allora probabilmente sbagli ad inizializzare la struttura, ma di protocolli conosco solo l' AF_INET e AF_UNIX.Magari qualcun altro lo conosce

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    La accept restituisce il socket del cliente ma va fatta usando il socket del server ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Originariamente inviato da oregon
    La accept restituisce il socket del cliente ma va fatta usando il socket del server ...
    Si sicuramente, infatti l' ho corretta e cosģ ho non ci sarą un altro problema dopo.
    Il fatto č che l' errore di cui parlavo io č precedente a questo, si tratta della funzione bind, mi dą errore come se stessi effettuando un' operazione su una non socket, ho preso un esempio funzionante e l' ho seguito quasi tutto, non vedo cosa possa essere...

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.