Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 16 su 16
  1. #11
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Il codice corretto con tutto quello che hai aggiunto, adesso qual č ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  2. #12
    Questo č l' ultimo che ho scritto con il problema nel bind:

    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, 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 
    	
    	
    	//memset((void*)&servip, 0, sizeof(servip));
    	
    
    	 if ( bind(servId, (struct sockaddr *) &servip, servipL) == -1 )     //assegnazione indirizzo server per la rete
    		{perror("trying to bind"); exit(-2);}
    	 
    	 listen(servId, CONNECTIONS);   //attesa di connessioni...
    	
    	while((clientId=accept(servId, (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);
    }

  3. #13
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Secondo me, tra il socket e il bind deve esserci questo codice

    codice:
    	memset(&servip, 0, sizeof(servip));
    	servip.sin_family      = AF_INET;
    	servip.sin_addr.s_addr = htonl(INADDR_ANY);
    	servip.sin_port        = htons((unsigned)PORT);
    Tu hai eliminato la memset (che comunque va prima di assegnare i valori e non dopo) ma deve esserci.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #14
    Quindi cosģ? Il problema permane....

    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, 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);
    	}
    	
    	
    	memset(&servip, 0, sizeof(servip));
    	
    	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("trying to bind"); exit(-2);}
    	 
    	 listen(servId, CONNECTIONS);   //attesa di connessioni...
    	
    	while((clientId=accept(servId, (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);
    
    }


    Comunque provando a compilare a mano da terminale mi spunta un messaggio che lascia intendere che la memset č automatica...



    codice:
    Server.c: In function ‘main’:
    Server.c:28:2: warning: incompatible implicit declaration of built-in function ‘memset’ [enabled by default]
    dario@ubuntu:~/Scrivania$ ./Server
    trying to bind: Socket operation on non-socket
    dario@ubuntu:~/Scrivania$ ^C
    dario@ubuntu:~/Scrivania$

  5. #15
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    No ... cosa c'entra, come fa ad essere "automatica" la memset?

    Quel messaggio si risolve se scrivi

    memset((void *)&servip, 0, sizeof(servip));

    Comunque

    1) inserisci le linee che ti ho indicato, ma tutte, non devi eliminarne

    codice:
    	memset((void *)&servip, 0, sizeof(servip));
    	servip.sin_family      = AF_INET;
    	servip.sin_addr.s_addr = htonl(INADDR_ANY);
    	servip.sin_port        = htons((unsigned)PORT);
    2) elimina la linea

    inet_aton(LOCIP, &servip.sin_addr);

    3) lascia la linea

    servipL=clientipL=sizeof(struct sockaddr_in);

    Quindi, il codice sarą, tra il socket e la bind

    codice:
    socket ...
    
    	memset((void *)&servip, 0, sizeof(servip));
    	servip.sin_family      = AF_INET;
    	servip.sin_addr.s_addr = htonl(INADDR_ANY);
    	servip.sin_port        = htons((unsigned)PORT);
    
    	servipL=clientipL=sizeof(struct sockaddr_in); 
    
    bind ...
    E poi occhio alle parentesi nella chiamata a socket deve essere

    codice:
    if((servId=socket(PF_INET, SOCK_STREAM, 0))==-1) {
    Il problema potrebbe essere proprio questo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #16
    Ok, č bastato modificare nell' apertura della socket come dicevi tu le parentesi....ora la bind funziona e nel terminale si vede il puntatore pulsante, penso sia normale visto che per ora non faccio nulla.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.