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

    [C++]Che problema ha questo programma?

    Questo è un programma che invia una stringa ad un server tramite berkeley socket.

    /* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    // Sintassi: EasySockClt [host] [port]
    // host: nome del computer sul quale il server
    // è in esecuzione
    // port: numero della porta da utilizzare
    // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
    #ifndef unix
    #include <windows.h>
    #include <winsock.h>
    #else
    #define closesocket close
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    #endif
    #include <stdio.h>
    #include <string.h>
    #define PORT 5194
    extern int errno;
    char localhost[] = "localhost";

    int main(int argc, char* argv[])
    {
    struct hostent *ptrh;
    struct protoent *ptrp;
    struct sockaddr_in sad, mySad;
    int sd;
    int port;
    char *host;
    int n;
    char buf[1000];
    int option_value, pippo;
    #ifdef WIN32
    WSADATA wsaData;
    WSAStartup(0x0101, &wsaData);
    #endif
    memset((char *)&sad, 0, sizeof(sad));
    sad.sin_family = AF_INET;


    memset((char *)&mySad, 0, sizeof(mySad));
    mySad.sin_family = AF_INET;
    mySad.sin_addr.s_addr = htonl(INADDR_ANY);
    mySad.sin_port = htons(9000);

    // Controllo la linea di comando per verificare
    // che mi sia stata passato il valore della porta
    // altrimenti imposto il valore di default
    if (argc > 2)
    port = atoi(argv[2]);
    else
    port = PORT;

    if (port > 0)
    // Converto la porta da byte order a TCP/IP
    // network order
    sad.sin_port = htons((u_short)port);
    else
    {
    fprintf(stderr,"bad port number %s\n", argv[2]);
    exit(1);
    }

    // Controllo la linea di comando per verificare
    // che mi sia stato passato il valore dell'host
    // altrimenti imposto il valore di default
    if (argc > 1)
    host = argv[1];
    else
    host = localhost;

    // Ricavo il puntatore all'host
    ptrh = gethostbyname(host);
    if (((char *)ptrh) == NULL)
    {
    fprintf(stderr, "invalid host: %s\n", host);
    exit(1);
    }
    memcpy(&sad.sin_addr, ptrh->h_addr, ptrh->h_length);

    // Ricavo le informazioni sul protocollo
    if (((int)(ptrp = getprotobyname("tcp"))) == 0)
    {
    fprintf(stderr, "cannot map \"tcp\" to protocol number");
    exit(1);
    }

    // E le utilizzo per crearmi un socket
    sd = socket(PF_INET, SOCK_STREAM, ptrp->p_proto);
    if (sd < 0)
    {
    fprintf(stderr, "socket creation failed\n");
    exit(1);
    }

    // Permetto al socket di essere associato
    // ad un indirizzo già in uso.
    /*
    option_value = 1;
    if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR,
    (char *)&option_value, sizeof(option_value)) < 0)
    {
    perror("setsockopt");
    exit(1);
    }
    */
    // Associo il socket utilizzando i parametri
    // della struttura sockaddr_in riempiti prece-
    // dentemente

    if (pippo= bind(sd, (struct sockaddr *)&mySad, sizeof(mySad)) < 0)
    {
    fprintf(stderr, "bind fallito\n");
    exit(1);
    }
    else fprintf(stderr, "Valore bind: %d", pippo);

    // Mi connetto al server
    if (connect(sd, (struct sockaddr *)&sad, sizeof(sad)) < 0) {
    fprintf(stderr, "connect failed\n");
    exit(1);
    }

    // Attendo la stringa da parte dell'utente
    memset(buf, 0, sizeof(buf));
    printf("Scrivi una stringa da spedire al server: ");
    gets(buf);

    // E la spedisco al server
    send(sd, buf, strlen(buf),0);


    // Leggo la risposta dal server
    memset(buf, 0, sizeof(buf));
    n = recv(sd, buf, sizeof(buf), 0);
    printf("Ricevuto dal server: %s\n", buf);


    // Chiudo il socket ed esco
    closesocket(sd);
    exit(0);
    }


    Questi sono gli errori che mi dà il compilatore:
    [Linker error] undefined reference to `WSAStartup@8'
    [Linker error] undefined reference to `htonl@4'
    [Linker error] undefined reference to `htons@4'
    [Linker error] undefined reference to `htons@4'
    [Linker error] undefined reference to `gethostbyname@4'
    [Linker error] undefined reference to `getprotobyname@4'
    [Linker error] undefined reference to `socket@12'
    [Linker error] undefined reference to `bind@12'
    [Linker error] undefined reference to `connect@12'
    [Linker error] undefined reference to `send@16'
    [Linker error] undefined reference to `recv@16'
    [Linker error] undefined reference to `closesocket@4'

    Help please.

  2. #2
    Non hai linkato il tutto alle varie librerie di importazione (.lib) necessarie.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    quindi che cosa devo aggiungere al codice che ho postato?

  4. #4
    Non devi aggiungere nulla al codice, devi modificare la riga di comando del compilatore (o del linker) dicendo di linkare al tuo codice Ws2_32.lib. Se usi Visual C++ puoi anche semplicemente inserire all'inizio del file il seguente pragma:
    codice:
    #pragma comment(lib, "Ws2_32.lib")
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    ok,funziona..grazie

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