Problem bei Compilieren



  • Hi,

    habe Probleme es zu compilen.

    /* client.c */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    
    #ifdef _WIN32
    /* Headerfiles für Windows */
    #include <winsock.h>
    #include <io.h>
    
    #else
    /* Headerfiles für Unix/Linux */
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #endif
    
    #define PORT 1234
    #define RCVBUFSIZE 8192
    
    /* Funktion gibt aufgetrenene Fehler aus und
     * beendet die Anwendung */
    static void error_exit(char *errorMessage) {
    #ifdef _WIN32
        fprintf(stderr,"%s: %d\n", errorMessage, WSAGetLastError());
    #else
        fprintf(stderr, "%s: %s\n", errorMessage, strerror(errno));
    #endif
        exit(EXIT_FAILURE);
    }
    
    int main( int argc, char **argv) {
        struct sockaddr_in server;
        struct hostent *host_info;
        unsigned long addr;
    
    #ifdef _WIN32
        SOCKET sock;
    #else
        int sock;
    #endif
    
        char *echo_string;
        int echo_len;
    
    #ifdef _WIN32
        /* Initialisiere TCP für Windows ("winsock") */
        WORD wVersionRequested;
        WSADATA wsaData;
        wVersionRequested = MAKEWORD (1, 1);
        if (WSAStartup (wVersionRequested, &wsaData) != 0)
            error_exit( "Fehler beim Initialisieren von Winsock");
        else
            printf("Winsock initialisiert\n");
    #endif
    
     /* Sind die erforderlichen Kommandozeilenargumente vorhanden? */
        if (argc < 3)
            error_exit("usage: client server-ip echo_word\n");
    
        /* Erzeuge das Socket */
        sock = socket( AF_INET, SOCK_STREAM, 0 );
        if (sock < 0)
            error_exit( "Fehler beim Anlegen eines Sockets");
    
        /* Erzeuge die Socketadresse des Servers
         * Sie besteht aus Typ, IP-Adresse und Portnummer */
        memset( &server, 0, sizeof (server));
        if ((addr = inet_addr( argv[1])) != INADDR_NONE) {
            /* argv[1] ist eine numerische IP-Adresse */
            memcpy( (char *)&server.sin_addr, &addr, sizeof(addr));
        }
        else {
            /* Für den Fall der Fälle: Wandle den
             * Servernamen bspw. "localhost" in eine IP-Adresse um */
            host_info = gethostbyname(argv[1]);
            if (NULL == host_info)
                error_exit("Unbekannter Server");
            /* Server-IP-Adresse */
            memcpy( (char *)&server.sin_addr,
                    host_info->h_addr, host_info->h_length );
        }
        /* IPv4-Verbindung */
        server.sin_family = AF_INET;
        /* Portnummer */
        server.sin_port = htons( PORT );
    
        /* Baue die Verbindung zum Server auf */
        if(connect(sock,(struct sockaddr*)&server,sizeof(server)) <0)
            error_exit("Kann keine Verbindung zum "
                       "Server herstellen");
    
        /* Zweites Argument wird als "echo" beim Server verwendet */
        echo_string = argv[2];
        /* Länge der Eingabe */
        echo_len = strlen(echo_string);
    
        /* Denn String inskl. Nullterminator an den Server senden */
        if (send(sock, echo_string, echo_len, 0) != echo_len)
            error_exit("send() hat eine unterschiedliche Anzahl"
                       " von Bytes versendet, als erwartet !!!!");
    
        /* Schließe Verbindung und Socket */
    #ifdef _WIN32
        closesocket(sock);
        /* Cleanup Winsock */
        WSACleanup();
    #else
       close(sock);
    #endif
    
        return EXIT_SUCCESS;
    }
    

    Bekomme unter Windows folgende Fehler:

    client.obj : error LNK2001: Nichtaufgeloestes externes Symbol _WSACleanup@0
    client.obj : error LNK2001: Nichtaufgeloestes externes Symbol _closesocket@4
    client.obj : error LNK2001: Nichtaufgeloestes externes Symbol _send@16
    client.obj : error LNK2001: Nichtaufgeloestes externes Symbol _connect@12
    client.obj : error LNK2001: Nichtaufgeloestes externes Symbol _htons@4
    client.obj : error LNK2001: Nichtaufgeloestes externes Symbol _gethostbyname@4
    client.obj : error LNK2001: Nichtaufgeloestes externes Symbol _inet_addr@4
    client.obj : error LNK2001: Nichtaufgeloestes externes Symbol _socket@12
    client.obj : error LNK2001: Nichtaufgeloestes externes Symbol _WSAStartup@8
    client.obj : error LNK2001: Nichtaufgeloestes externes Symbol _WSAGetLastError@0
    

    Kann mir da einer Helfen?

    mfg



  • g++ ... -lwinsock32 ...



  • Das WSA Zeug ist glaube ich in WS2_32.Lib(statt der 32 kann natülich auch was anderes stehen 🙂 ) drinnen... Das musst du in Projekteinstellungen oder Build Options (oder so in der Art heißt das bei vielen IDEs) dem Linker geben... wenn du die WS2_32.Lib nicht hast solltest du dir vielleicht das SDK von Microsoft runterladen...



  • oder die gnu compiler collection benutzen, weil die im gegensatz zu M$ korrektes c beherrscht.
    ich weise nur mal auf die unzaehligen _* funktionen von M$ hin...



  • -lwsock32 -mwindows
    sollte auch den WSA abdecken



  • Danke,

    musste nur LIBWSOCK32.a (winsock) und LIBWS2_32.a (winsock2) dem Kompiler mitteilen.


Anmelden zum Antworten