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

    [c] gethostbyname()

    Ciao ragazzi, ho bisogno di un piccolo aiutino.
    Ho scritto una semplice applicazione che utilizza le socket e che è portabile per win e unix.
    Per la risoluzione del nome del server da contattare dal lato client utilizzo la gethostbyname facendo opportuni controlli sul valore restituito.
    IL problema è che se provo a inserire da tastiera un nome host inesistente non mi viene mai restituito il valore NULL (come invece dovrebbe essere) e quindi il controllo si va a far friggere...come faccio?

    struct hostent *host;
    memset(&host,0,sizeof(host));
    host = gethostbyname(name);
    if (host == NULL){
    die_with_error("gethostbyname() failed. \n");
    system("pause");
    return 0;
    }
    http://www.fiombari.it
    http://www.as-salvatoretunno.it

  2. #2
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Intanto indica come fai la lettura la tastiera ed inizializza a NULL la variabile host prima di utilizzarla.

  3. #3
    La lettura la faccio con

    printf("Inserire non server: ");
    gets(name);
    printf("Numero di porta: ");
    scanf(%d,&port);

    ho inizializzato host = NULL ma non cambia nient continua a risolvere anche nomi assurdi
    http://www.fiombari.it
    http://www.as-salvatoretunno.it

  4. #4
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    LEggiti il man della gethostbyname.
    Restituisce NULL solo in caso di errore, cio' non significa che invocandola su un host inesistente accada cio'.
    Piu' verosimilmente sara' la lista h_addr_list della struct hostent restituita ad avere dimensione 0 il che corrisponde difatto ad una ricerca priva di risultati.

  5. #5
    ascolta io le sto provando tutte, non sono qui a fare domande tanto perchè non ho voglia di leggermi il manuale...
    cmq ho provato quello che dici ma il primo campo di h_addr_list viene cmq avvalorato e non risulta affatto essere 0.

    struct hostent *host;
    host = NULL;
    host = gethostbyname(name);
    if (host == NULL){
    die_with_error("gethostbyname() failed. \n");
    system("pause");
    return 0;
    }

    unsigned long ul = *((unsigned long*)host->h_addr_list[0]);

    se stampo ul il risultato non è zero e ho provato a settare l'intera area di memoria della struttura host a zero con il memset ma niente
    http://www.fiombari.it
    http://www.as-salvatoretunno.it

  6. #6
    ovviamente anche la dimensione della h_addr_list non è zero essendo piena
    http://www.fiombari.it
    http://www.as-salvatoretunno.it

  7. #7
    Come hai dichiarato name?

    P.S.: la gets è superdeprecata in quanto non sicura, va sostituita con la fgets specificando le dimensioni del buffer.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    char name[100];

    cmq ho provato a fare la sostituzione della gets con la fgets ma nulla
    http://www.fiombari.it
    http://www.as-salvatoretunno.it

  9. #9
    Puoi postare tutto il codice (o almeno, il minimo codice completo compilabile) che presenta il problema, così faccio qualche prova?
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    /*
    ================================================== ==========================
    Name : Client.c
    Author :
    Version :
    Copyright : Your copyright notice
    Description : Hello World in C, Ansi-style
    ================================================== ==========================
    */

    #if defined WIN32
    #include <winsock.h>
    #else
    #define closesocket close
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <netdb.h>
    #endif
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>

    #define BUFFLEN 255
    const char *lost ="LOST"; //datagramma speciale

    //gestione errori
    void die_with_error(char *msg){
    printf("\n%s",msg);
    }

    int main() {
    //WA startup per win
    #ifdef WIN32
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
    printf("Error at WSAStartup()\n");
    return 0;
    }
    #endif

    //dichiarazione variabili
    int port;
    int flag = 1;
    char name[100];
    char buf[BUFFLEN];
    int sock;
    int n;
    int i;
    int last;
    int cont = 0;
    int persi = 0;
    struct sockaddr_in fromAddr;
    unsigned int fromAddrSize;

    //creazione socket udp
    if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0){
    die_with_error("socket() failed.");
    system("pause");
    return 0;
    }

    //L'utente inserisce nome del server e porta
    printf("Type host name: ");
    gets(name);
    printf("\nInsert port's number: ");
    scanf("%d",&port);

    //verifico numero porta
    if (port < 0){
    die_with_error("Invalid port's number");
    system("pause");
    return 0;
    }

    //risoluzione nome server
    struct hostent *host;
    host = NULL;
    host = gethostbyname(name);
    if (host == NULL){
    die_with_error("gethostbyname() failed. \n");
    system("pause");
    return 0;
    }
    unsigned long ul = *((unsigned long*)host->h_addr_list[0]);

    //inizializzo struttura
    struct sockaddr_in addr;
    memset((char *)&addr, sizeof(addr), 0);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = ul;

    //acquisisco n
    printf("\nInsert an integer value: ");
    scanf("%d",&n);
    memset(buf,0,sizeof(buf));
    itoa(n,buf,10);

    //invio n al server
    int len=sendto(sock, buf, sizeof(buf), 0, (struct sockaddr *)&addr, sizeof(addr));
    if(len < (sizeof(buf))){
    die_with_error("\nsendto() failed. \n");
    return 0;
    }

    last = n; //ultimo datagramma ricevuto
    for(i = n-1; i >= 0; i--){
    fromAddrSize = sizeof(fromAddr);
    memset(buf,0,sizeof(buf));
    //ricevo un datagramma
    recvfrom(sock, buf, sizeof(buf), 0,(struct sockaddr_in*)&fromAddr, &fromAddrSize);
    flag = strcmp(buf,lost);//controllo che il datagramma sia valido
    if (flag != 0){
    //datagramma ricevuto
    printf("- Datagram n. %d received, value: %s\n",(n-i),buf);
    if (i != (last - 1))
    //datagramma non ricevuto in ordine
    cont++;
    last = i; //aggiorno ultimo datagramma ricevuto
    }
    else{
    //datagramma non ricevuto
    printf("- Datagram n. %d lost\n",(n-i));
    persi++;
    }
    }
    printf("\nValore di n: %d Datagrammi ricevuti: %d\n",n,(n-persi));
    printf("Datagrammi persi: %d Datagrammi fuori ordine: %d\n",persi,cont);
    printf("\nClosing socket. \n");
    printf("\n**************************************** *********************\n");

    //chiusura socket
    closesocket(sock);
    #ifdef WIN
    WSACleanup();
    #endif

    system("pause");
    return 0;
    }
    http://www.fiombari.it
    http://www.as-salvatoretunno.it

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.