Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    34

    Problema con socket in C

    Ultimo problema....non ce la faccio più!!!!
    Allora, ho sempre il mio server UDP, a cui son collegati vari client.
    Ora, tutti i client fanno una richiesta, e il server si comporta da master slave, nel senso che solo dopo aver ricevuto tutte le richieste, elabora un algoritmo, e poi risponde a tutti i client, ad ognuno la risposta alla propria richiesta, quindi non una risposta unica a tutti.
    Ora, ho fatto una cosa del genere sul server:

    for(i=0;i<MAXCLIENTS; i++)
    {
    recvfrom(bla bla bla);

    richiesta[i]= ppp;
    indirizzo_client[i]=xxx;
    porta_client[i]=000;
    }

    Algoritmo();

    for(i=0;i<MAXCLIENTS; i++){
    risposta[i]=yyyy;
    sendto();
    }

    Ora il problema è che non so' come passare alla sendto() gli indirizzi ip e le porte dei client che avevano fatto richiesta e che avevo salvato sulla recvfrom().
    Qualcuno può aiutarmi?
    Grazie.

  2. #2
    Dovresti "packettizzare" le informazioni in una stringa e passare l'indirizzo di quest'ultima a sendto().
    Dipende, che tipo di dati, e la dimensione, che occupano:
    codice:
    richiesta[i]= ppp;
    indirizzo_client[i]=xxx;
    porta_client[i]=000;
    se occupano tutti un byte ciascuno li metti in un'array di char, se no in un array di int:
    codice:
    for(i=0;i<MAXCLIENTS; i++) {
          
       recvfrom();
       
       array[i * 3 + 0] = ppp;
       array[i * 3 + 1] = xxx;
       array[i * 3 + 2] = 000;
       
    }
    
    
    /*...*/
    
    sendto(socket, &array, sizeof(array), 0, (struct sockaddr*)&var_sockaddr_in, sizeof(var_sockaddr_in));

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    34
    Allora, grazie in anzitutto!! Ho capito poco pero'. Ti metto il pezzo di codice che ho fatto.
    Prima di tutto mi sono fatto una struttuta del tipo:

    typedef struct{
    char id; // Identificativo terminale
    int porta;
    struct in_addr indirizzo;
    int richiesta; //Richiesta che mi fa (tramite un numero intero tra 1 e 9, capisco cosa vuole)
    int risposta;
    double tempotrasmissione;
    }tipo_riga;


    int main(int argc, char **argv)
    {......
    char request[BUFLEN];
    char response[BUFLEN];
    tipo_riga tabella[BUFLEN];

    for (i=0;i<MAXST;i++){

    recvfrom(s, request, BUFLEN, 0, (struct sockaddr*)&ca, &clean ); // Il server riceve i messaggi.

    printf("\nRicevuto richiesta da: %s:%d.\nRICHIESTA:%c\nTERMINAL_ID:%s \n",
    inet_ntoa(ca.sin_addr), ntohs(ca.sin_port), *request,request+2);


    tabella[i].id=atoi(request+2);
    tabella[i].indirizzo=ca.sin_addr;
    tabella[i].porta=ntohs(ca.sin_port);
    tabella[i].richiesta=atoi(request);
    }

    Qui ho l'algoritmo che mi calcola le risposte in base a tutte le richieste giunte.

    for(i=0;i<MAXST;i++) { //Ora devo spedire ogni risposta ad ogni client che ha fatto richietsa.

    sendto(s, response, BUFLEN, 0, (struct sockaddr*)&ca, sizeof(ca));


    }

    Il problema è che non so' "fisicamente" come passargli l'array delle risposte e l'array degli indirizzi!!
    Tutto qui.

  4. #4
    ah, avevo capito un'altra cosa ...

    Qua:
    codice:
    typedef struct{
    char id; // Identificativo terminale
    int porta;
    struct in_addr indirizzo;
    int richiesta; //Richiesta che mi fa (tramite un numero intero tra 1 e 9, capisco cosa vuole)
    int risposta;
    double tempotrasmissione;
    }tipo_riga;
    al posto di:
    codice:
    struct in_addr indirizzo;
    prova con:
    codice:
    struct sockaddr_t client;
    cosi per ogni client c'è una struttura sockaddr_t, cosi quando cicli gli passi la struttura.
    Una cosa del tipo:
    codice:
    for (i=0;i<MAXST;i++){
    
    recvfrom(s, request, BUFLEN, 0, (struct sockaddr*)&ca, &clean ); // Il server riceve i messaggi.
    
    printf("\nRicevuto richiesta da: %s:%d.\nRICHIESTA:%c\nTERMINAL_ID:%s \n",
    inet_ntoa(ca.sin_addr), ntohs(ca.sin_port), *request,request+2);
    
    
    tabella[i].id=atoi(request+2);
    
    bzero(tabella[i].client, sizeof(tabella[i].client);
    tabella[i].client.sin_family = AF_INET;
    tabella[i].client.sin_port = ca.sin_port;
    tabella[i].client.sin_addr = ca.sin_addr;
    
    tabella[i].porta=ntohs(ca.sin_port);
    tabella[i].richiesta=atoi(request);
    }
    
    Qui ho l'algoritmo che mi calcola le risposte in base a tutte le richieste giunte.
    
    for(i=0;i<MAXST;i++) { //Ora devo spedire ogni risposta ad ogni client che ha fatto richietsa.
    
    sendto(s, response, BUFLEN, 0, (struct sockaddr*)&tabella[i].client, sizeof(tabella[i].client));
    
    
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    34
    Grazie. Ho provato a afre come dici tu, ma in compilazione mi da il seguente problema:

    field 'client' has incomplete type.

    Ti premetto che è la prima volta che programmo!
    Sto vedendo con google di risolvere la cosa.
    Grazie comunque

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da MadAlex
    Ti premetto che è la prima volta che programmo!
    Scusa ... senza offesa ... la "prima volta" che programmi, cominci con i socket?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    no aspetta: la prima volta ?
    Ma non sei tu quello che ha aperto mille discussioni su un server UDP ? :master:

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    34
    Si la prima volta, visto che per la tesi di laurea sto implementando un sistema Server Multiclient che mi simuli una rete satellitare!!!
    Mai programmato prima in vita mia, poi che son 6 mesi che sto sbattendoci la testa è un altro discorso, ma il "programma" in C è solo come plus simulativo alla tesi.
    Comunque ho risolto anche questa, ed essendo l'ultima cosa che mancava, prometto di non scocciarvi piu.

  9. #9
    Originariamente inviato da MadAlex
    Si la prima volta, visto che per la tesi di laurea sto implementando un sistema Server Multiclient che mi simuli una rete satellitare!!!
    Mai programmato prima in vita mia, poi che son 6 mesi che sto sbattendoci la testa è un altro discorso, ma il "programma" in C è solo come plus simulativo alla tesi.
    Comunque ho risolto anche questa, ed essendo l'ultima cosa che mancava, prometto di non scocciarvi piu.
    non sei una scocciatura, e che dopo un sacco di messaggi su un server UDP, vieni a sapere che è la prima volta che programmi. Sono rimasto un po' di stucco tutto qui

    Come hai risolto ?

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    34
    No, ma figurati, capisco di aver tartassato i maroni in maniera allucinante, ma ti giuro che per uno che non ha mai programmato, doversi tirar su un server multiclient UDP che facesse determinate cose, è stato un massacro!!!
    Anche perchè sto facendo una corsa contro il tempo, quindi preferivo chiedere a voi molte cose per evitare di perder tempo con la mia scarsa competenza in C, anchè perchè tutta la questione del semplice printf("Questo è il mio primo programma in C"); l'ho dovuta fare in fretta e furia, quindi sbagliavo molte cose perchè non avevo le basi.
    comunque ho risolto semplicemente sostituendo la

    struct in_addr indirizzo;

    con la

    struct sockaddr_in client;

    e procedendo come mi avevate gentilmente risposto.

    Ora non mi rimane che testare il tutto nella rete REALE, con più pc, e vedere che effettivamente risponda giustamente ad ogni client.

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.