Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C] problema socket e connessioni multiple

    Ciao ragazzi, sto completando un software per una rubrica ma ho un problema per le connessioni multiple: sto facendo il server senza multithreading e quando vado ad accettare le connessioni dopo la prima, praticamente il client non fa niente, accetta solo la connessione ma non invia ne riceve nulla dal server. Come posso risolvere?


    codice:
     int optval;
       socklen_t optlen = sizeof(optval);
    	char choice[MAX];
    	char buff[MAX]; /* dati di invio e ricezione */
    	char buff1[MAX];
    	char buffNome[MAX];
    	char buffCognome[MAX];
    	char buffTelefono[MAX];
    	char buffMail[MAX];
    	struct sockaddr_in server_addr; /* indirizzo del server */
    	struct sockaddr_in client_addr; /* indirizzo del client */
    	int sd_server, sd_client; /* i socket descriptor usati per identificare server e client */
     
    /*
     * Creazione socket descriptor per il server.
     * AF_INET + SOCK_STREAM --> TCP, utilizzo del protocollo TCP (IPPROTO_TCP)
     * 
     * 
     * 
     * 
     */
    	if((sd_server = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    		printf("Errore nella creazione del server\n");
    
    	
    	
    	
       /* Set the option active */
       optval = 1;
       optlen = sizeof(optval);
       if(setsockopt(sd_server, SOL_SOCKET, SO_REUSEADDR, &optval, optlen) < 0) {
          perror("setsockopt()");
          close(sd_server);
          exit(EXIT_FAILURE);
       }
       
       
    
    	
    /*
     * Inseriamo nella struttura alcune informazioni
     */
    	server_addr.sin_family = AF_INET; /* la famiglia dei protocolli */
    	server_addr.sin_port = htons(1745); /* la porta in ascolto */
    	server_addr.sin_addr.s_addr = INADDR_ANY; /* dato che è un server bisogna associargli l'indirizzo della macchina su cui sta girando */
     
    /*
     * Assegnazione del processo alla socket tramite la funzione BIND
     */
    	if(bind(sd_server, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
    		printf("Errore di binding\n");
     
    	
    	
    /*
     * Si mette in ascolto con un massimo di 20 connessioni
     */
    	listen (sd_server, 20);
     
    	int address_size = sizeof(client_addr); /* dimensione della struttura client_addr */
    /* Con opportune modifiche si potrebbe vedere anche l'ip del client */
    
      struct elemento *lista = NULL;
       struct elementoutente *listautente = NULL;
    
    while (1) {
    	if((sd_client = accept(sd_server, (struct sockaddr *)&client_addr, &address_size)) < 0)
    		printf("Errore nella chiamata accept\n");
    
    	
    	 
    	
    	while(1){
    
    .... ROBA CHE FA.....
    
    
    }
    close(sd_server);

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Che funzione usi per leggere i dati da ricevere?

  3. #3

    risolto

    ho risolto, bisogna usare necessariamente una fork se non li si vuole fare multithread. 1 socket 1 connessione e basta. :-)

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.