Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    16

    [C] Problema socket

    Ciao a tutti,
    brevemente introduco il mio problema:

    Ambito: programma client-server (comunicazione via socket su sistema operativo LINUX)

    Dinamica semplificata: il client contatta il server, gli lascia il suo indirizzo IP e la porta d'ascolto... poi termina la connessione e si mette in attesa che il server lo ricontatti.

    Problema: Non riesco a fare in modo che il client lasci al server l'indirizzo IP reale della scheda di rete (L'indirizzo di rete locale es. 192.168.1.10)... Tutte le volte che provo a leggere l'IP assegnato al processo client vengono fuori valori assurdi ( formattati in dotted quad, ma roba tipo 16.144.3.2 )...
    Dopodiche' se rilancio il processo client, esso assume un indirizzo diverso.

    Purtroppo non ho molta esperienza nella programmazione client server,
    ma manuali dicono di usare getsockname(), tuttavia utilizzando tale funzione il risultato e' quello sopradescritto.

    Ogni aiuto e' ben accetto, grazie molte in anticipo!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    E il codice che usi?

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    16
    Il codice che uso e' un semlice programmino client - servert...
    Il problema credo sia nel client, infatti se provo a stampare il contenuto di mio_addr.in_addr mi restituisce dei valori assurdi
    Li riporto qui di seguito:

    CLIENT

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>

    /* Numero di Port sul quale il client richiede la connessione */

    #define PORT 4000

    /* Funzione per inizializzare gli indirizzi */

    void addr_initialize(struct sockaddr_in *indirizzo, int port, long IPaddr)
    {
    indirizzo->sin_family = AF_INET;
    indirizzo->sin_port = htons((u_short) port);
    indirizzo->sin_addr.s_addr = IPaddr;
    }

    /* Programma principale */

    void main(int argc, char* argv[])
    {
    int sd;
    struct sockaddr_in server_addr;
    struct sockaddr_in mio_addr;
    int mio_addr_len=sizeof(mio_addr);
    int error;
    addr_initialize(&server_addr, PORT, inet_addr(argv[1]));
    sd=socket(AF_INET,SOCK_STREAM,0);
    error=connect(sd,(struct sockaddr*) &server_addr, sizeof(server_addr));
    if (error==0)
    {
    printf("Ho eseguito la connessione\n");
    getsockname(sd, &mio_addr, &mio_addr_len);
    printf("il mio port e': %d\n\n",ntohs(mio_addr.sin_port));
    printf("il mio IP è: %s", inet_ntop(AF_INET,mio_addr.sin_addr.s_addr,IP,INET _ADDRSTRLEN));
    close(sd);
    }

    else printf("%s","\nErrore di connect\n\n");
    close(sd);
    }



    SERVER



    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>


    #define PORT 4000 >


    #define MAXCONN 5

    void addr_initialize(struct sockaddr_in *indirizzo, int port, long IPaddr)
    {
    indirizzo->sin_family = AF_INET;
    indirizzo->sin_port = htons((u_short) port);
    indirizzo->sin_addr.s_addr = IPaddr;
    }


    void main(int argc, char * argv[])
    {
    int sd,new_sd;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    int client_len=sizeof(client_addr);
    addr_initialize(&server_addr, PORT, INADDR_ANY);
    sd=socket(AF_INET,SOCK_STREAM,0);
    bind(sd,(struct sockaddr*) &server_addr,sizeof(server_addr));
    listen(sd,MAXCONN);
    printf("Mi pongo in attesa di richieste di connessione\n");
    printf("sul mio port: %d\n", ntohs(server_addr.sin_port));
    new_sd=accept(sd,(struct sockaddr*) &client_addr, &client_len);
    printf("\n\nHo accettato una connessione\n");
    printf("dal client con port: %d\n\n", ntohs(client_addr.sin_port));
    close(new_sd);
    close(sd);
    }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Nel Client devi scrivere

    codice:
    inet_ntop(AF_INET, &mio_addr.sin_addr, IP, INET_ADDRSTRLEN);
    printf("il mio IP è: %s\n", IP);
    e non come hai fatto ...

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    16
    Grazie molte e scusa se approfitto ancora della tua disponibilità...
    il fatto che adesso mi dia come IP l'indirizzo di loopback (127.0.0.1) è causato da un errata inizializzazione del socket da parte mia oppure sto usando male la funzione getsockname?
    Cercando sui manuali, infatti, si evince che la funzione getsockname restituisce l'indirizzo locale a cui e' associato il socket (e quindi in linea teorica l'indirizzo di loopback è corretto anche se di dubbia utilità in questo caso)...
    Esiste quindi la possibilità di ottenere tramite queste funzioni l'indirizzo IP della scheda di rete da cui partono/arrivano le comunicazioni, oppure devo cambiare radicalmente tecnica per ottenerli?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    16
    Ecco sono riuscito a capire il perche':
    se lancio il comando client con indirizzo di connessione al server 127.0.0.1, lui lavora sull'indirizzo di loopback della macchina, quindi interpreta anche l'indirizzo del client da cui viene lanciato il comando di connessione come quello di loopback...
    Utilizzando l'indirizzo d'interfaccia della scheda invece funziona perfettamente. Ho anche provato ad utilizzare client e server su macchine diverse!

    Probabilmente era scontato, ma proprio non mi e' venuto in mente prima!

    Cmq ti ringrazio molto Oregon, sei stato preziosissimo!

  7. #7
    Ricorda che oltra a getsockname() hai anche getpeername() che ti ritorna l'indirizzo remoto a cui è connesso il socket locale.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

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.