Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14
  1. #1
    Anfänger Avatar von cyber_gh0st
    Registriert seit
    25.04.2009
    Beiträge
    208

    Frage meine erste Client Anwendung und ich habe ein Problem

    Hi
    ich habe ein Programm geschrieben dessen Quelltext so aussieht:
    PHP-Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <arpa/inet.h>
    #include <unistd.h>

    int main(void)  {
            
    struct sockaddr_in server//Struktur vom Typ sockaddr_in deklariert.
            
    struct hostent *host_info;
            
    char input;
            
    char *echo_string malloc(50);
            
    char echo_len;
            
    unsigned long addr;
            
            
    int sock;
            
            
    //Eingabe:
            
    printf("Bitte geben sie die Adresse an:\n");
            
    scanf("%s",&input);
            
    fflush(stdin);
            
    printf("Bitte geben sie einen Echostring an:\n");
            
    fgets(echo_string,30stdin);
            
    fflush(stdin);

            
    //Socket Inizialisieren:        
            
    if(sock socket(AF_INETSOCK_STREAM0) < ) {
                    
    fprintf(stderr,"Fehler beim Inizialiesieren des Sockets");
                    exit(
    EXIT_FAILURE);
            }

            
    //Ausfüllen des sockaddr_in struct:
            
    memset( &server0sizeof(server) );
            if((
    addr inet_addr(input)) != INADDR_NONE)     {
                    
    memcpy( (char *)&server.sin_addr, &addrsizeof(addr));
            }
            
    //Domainname in IP umwandeln:
            
    else    {
                    
    host_info gethostbyname(input);
                    if(
    NULL == host_info)   {
                            
    fprintf(stderr,"Unbekannter Server");
                    }
                    
    memcpy( (char *)&server.sin_addr, (*host_info).h_addr, (*host_info).h_length );
            }
            
    server.sin_family AF_INET;
            
    server.sin_port htons(80);

            
    //Verbinden:
            
    if ( connect(sock,(struct sockaddr*)&serversizeof(server)) < 0)       {
                    
    fprintf(stderr,"Verbindung kann nicht aufgebaut werden.");
                    exit(
    EXIT_FAILURE);
            }
             
            
    echo_len strlen(echo_string);
            
            if (
    send(sockecho_stringecho_len0) != echo_len)   {
                    
    fprintf(stderr,"Fehler beim Senden des Echostrings");
                    exit(
    EXIT_FAILURE);
            }
            
    close (sock);
            return 
    EXIT_SUCCESS;

    im Terminal sah das dann so aus:
    Code:
    gh0st@a450-netbook:~/Desktop$ 
    gh0st@a450-netbook:~/Desktop$ gcc client.c
    client.c: In Funktion »main«:
    client.c:37: Warnung: Übergabe des Arguments 1 von »inet_addr« erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
    client.c:42: Warnung: Übergabe des Arguments 1 von »gethostbyname« erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
    gh0st@a450-netbook:~/Desktop$ ./a.out
    Bitte geben sie die Adresse an:
    Web.de
    Bitte geben sie einen Echostring an:
    Segmentation fault
    gh0st@a450-netbook:~/Desktop$
    Leider kann ch mit der Warnung nicht viel anfangen kann mir bitte eier von euch sagen warum das nicht Funktioniert vielleicht sogar mit einem Auskemmentiertem Quelltext?
    währe sehr dankbar.
    mfg cyber_gh0st


  2. #2
    Stiller Leser
    Registriert seit
    03.09.2009
    Beiträge
    4

    Standard

    Ich hab zwar zugegebener Maßen wenig Erfahrung mit C und Konsorten, aber das klingt bei mir nach einem eher kleineren Problem:
    Du sollst deinen Input typecasten -> explizit in den gewünschten Datentyp umwandeln.

    PS: Meines Erachtens heißt das "Initialisieren"

  3. #3
    Anfänger Avatar von cyber_gh0st
    Registriert seit
    25.04.2009
    Beiträge
    208

    Standard

    k danke das mit der Rechtschreibung lerne ich glaube ich nich mehr >.<

    sieht mittlerweile so aus:
    PHP-Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <arpa/inet.h>
    #include <unistd.h>

    int main(void)  {
            
    struct sockaddr_in server//Struktur vom Typ sockaddr_in deklariert.
            
    struct hostent *host_info;
            
    char input[40];
            
    char *echo_string malloc(50);
            
    char echo_len;
            
    unsigned long addr;
            
            
    int sock;
            
            
    //Eingabe:
            
    printf("Bitte geben sie die Adresse an:\n");
            
    fgets(echo_string,40stdin);
            
    fflush(stdin);
            
    printf("Bitte geben sie einen Echostring an:\n");
            
    fgets(echo_string,50stdin);
            
    fflush(stdin);

            
    //Socket Initialisieren:        
            
    if(sock socket(AF_INETSOCK_STREAM0) < ) {
                    
    fprintf(stderr,"Fehler beim Inizialiesieren des Sockets");
                    exit(
    EXIT_FAILURE);
            }

            
    //Ausfüllen des sockaddr_in struct:
            
    memset( &server0sizeof(server) );
            if((
    addr inet_addr(input)) != INADDR_NONE)     {
                    
    memcpy( (char *)&server.sin_addr, &addrsizeof(addr));
            }
            
    //Domainname in IP umwandeln:
            
    else    {
                    
    host_info gethostbyname(input);
                    if(
    NULL == host_info)   {
                            
    fprintf(stderr,"Unbekannter Server");
                    }
                    
    memcpy( (char *)&server.sin_addr, (*host_info).h_addr, (*host_info).h_length );
            }
            
    server.sin_family AF_INET;
            
    server.sin_port htons(80);

            
    //Verbinden:
            
    if ( connect(sock,(struct sockaddr*)&serversizeof(server)) < 0)       {
                    
    fprintf(stderr,"Verbindung kann nicht aufgebaut werden.");
                    exit(
    EXIT_FAILURE);
            }
             
            
    echo_len strlen(echo_string);
            
            if (
    send(sockecho_stringecho_len0) != echo_len)   {
                    
    fprintf(stderr,"Fehler beim Senden des Echostrings");
                    exit(
    EXIT_FAILURE);
            }
            
    close (sock);
            
    free(echo_string);
            return 
    EXIT_SUCCESS;

    jetzt wird vom Compiler nichts mehr ausgegeben aber ich kann mich nicht verbinden hier das Terminal:
    Code:
    gh0st@a450-netbook:~/Desktop$ ./a.out
    Bitte geben sie die Adresse an:
    217.72.195.42
    Bitte geben sie einen Echostring an:
    HEAD / HTTP/1.0
    Unbekannter ServerSegmentation fault
    gh0st@a450-netbook:~/Desktop$
    Geändert von cyber_gh0st (10.09.2009 um 12:22 Uhr) Grund: Automerged Doublepost


  4. #4
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    printf("Bitte geben sie die Adresse an:\n");
    fgets(echo_string,40, stdin);
    fflush(stdin);
    printf("Bitte geben sie einen Echostring an:\n");
    fgets(echo_string,50, stdin);
    fflush(stdin);

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  5. #5
    Anfänger Avatar von cyber_gh0st
    Registriert seit
    25.04.2009
    Beiträge
    208

    Standard

    arg bin ich dumm Peinlich >.<
    maaaaaaaaaaaan :S

    //EDIT:
    klappt mmer noch nicht:
    PHP-Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <arpa/inet.h>
    #include <unistd.h>

    int main(void)  {
            
    struct sockaddr_in server//Struktur vom Typ sockaddr_in deklariert.
            
    struct hostent *host_info;
            
    char input[40];
            
    char *echo_string malloc(50);
            
    char echo_len;
            
    unsigned long addr;
            
            
    int sock;
            
            
    //Eingabe:
            
    printf("Bitte geben sie die Adresse an:\n");
            
    fgets(input,40stdin);
            
    fflush(stdin);
            
    printf("Bitte geben sie einen Echostring an:\n");
            
    fgets(echo_string,50stdin);
            
    fflush(stdin);

            
    //Socket Inizialisieren:        
            
    if(sock socket(AF_INETSOCK_STREAM0) < ) {
                    
    fprintf(stderr,"Fehler beim Inizialiesieren des Sockets");
                    exit(
    EXIT_FAILURE);
            }

            
    //Ausfüllen des sockaddr_in struct:
            
    memset( &server0sizeof(server) );
            if((
    addr inet_addr(input)) != INADDR_NONE)     {
                    
    memcpy( (char *)&server.sin_addr, &addrsizeof(addr));
            }
            
    //Domainname in IP umwandeln:
            
    else    {
                    
    host_info gethostbyname(input);
                    if(
    NULL == host_info)   {
                            
    fprintf(stderr,"Unbekannter Server\n");
                    }
                    
    memcpy( (char *)&server.sin_addr, (*host_info).h_addr, (*host_info).h_length );
            }
            
    server.sin_family AF_INET;
            
    server.sin_port htons(80);

            
    //Verbinden:
            
    if ( connect(sock,(struct sockaddr*)&serversizeof(server)) < 0)       {
                    
    fprintf(stderr,"Verbindung kann nicht aufgebaut werden.");
                    exit(
    EXIT_FAILURE);
            }
             
            
    echo_len strlen(echo_string);
            
            if (
    send(sockecho_stringecho_len0) != echo_len)   {
                    
    fprintf(stderr,"Fehler beim Senden des Echostrings");
                    exit(
    EXIT_FAILURE);
            }
            
    close (sock);
            
    free(echo_string);
            return 
    EXIT_SUCCESS;

    Geändert von cyber_gh0st (10.09.2009 um 17:52 Uhr)


  6. #6
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    nach fprintf(stderr,"Unbekannter Server\n"); fehlt ein exit...

    btw:
    fgets liest den Zeilenumbruch mit ein.
    Ein Host "www.google.com\n" kann nicht aufgelöst werden.
    Wegen dem fehlenden exit ist dein socket nicht valid und es kommt zu Fehlern.

    Wieder ein dummer Fehler

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  7. #7
    Anfänger Avatar von cyber_gh0st
    Registriert seit
    25.04.2009
    Beiträge
    208

    Standard

    oh ja das mit dem exit() schon aber wie kann ich das \n wegmachen?


  8. #8
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    input[strlen(input) - 1] = 0;

    Mir ist außerdem noch ein Problem aufgefallen...
    Jetzt verbindet es war, aber der String kommt bei meinem netcat nicht an.

    Ich schau's mir nochmal genauer an.

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  9. #9
    Anfänger Avatar von cyber_gh0st
    Registriert seit
    25.04.2009
    Beiträge
    208

    Standard

    input[strlen(input) - 1] = 0; <-- verstehe ich irgentwie nicht...


  10. #10
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    input[strlen(input) - 1] = 0;
    Ein C-String ist im Grunde nichts anderes als ein char-Array.
    Das Ende wird durch ein Null-Zeichen (\0, oder einfach 0 wenn du es als Zahl schreiben willst) bestimmt.

    Die Funktion strlen liefert die Anzahl der Zeichen ihres Parameters, die vor einem solchen 0-Terminator stehen.

    Beispiel:
    strlen("Hello World") = 11

    Unser mit fgets eingelesener String sieht aber so aus:
    strlen("Hello World\n") = 12

    Hinter dem \n befindet sich jedoch noch ein 0-Terminator.
    meinString[strlen(meinString)] ist somit immer 0, da dort das 0-Zeichen steht

    Wenn wir vom dem Index nun 1 substrahieren ist das \n-Zeichen gemeint.
    Machen wir also:
    meinString[strlen(meinString) - 1] = __EIN_ZEICHEN_;
    so wird das \n am Ende des C-Strings druch "__EIN_ZEICHEN_" ersetzt.
    In unserem Fall wäre das ein 0-Terminator.

    Damit wird der String um 1 gekürzt.
    Das \n ist weg.


    --------------------------------

    Back2Topic

    Ok ich hab den Sinn deines Programms mal selbst implementiert...
    So funktioniert es auf jeden Fall.
    Warum es bei deiner Version bei mir nur verbindet und send das richtige Ergebnis liefert, jedoch nichts ankommt weiß ich nicht...
    Code:
    #ifdef _WIN32
        /* sorry, bin grad mit Windows on und kann nur so testen... */
        #include <winsock2.h>
    #else
        #include <sys/types.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <netdb.h>
        #include <arpa/inet.h>
        #include <unistd.h>
    #endif
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    #define PORT 80
    
    
    int main(void)
    {
        char serv[100];
        char echo[100];
        struct sockaddr_in server;
        struct hostent *dns;
        int sock;
        
    #ifdef _WIN32
        // WinSock starten
        WSADATA wsa;
        if (WSAStartup(MAKEWORD(2, 0), &wsa) == -1)
        {
            printf("Error: WSAStartup\n");
            return 1;
        }
    #endif
        
        // Daten einlesen
        printf("Host: ");
        fgets(serv, sizeof(serv), stdin);
        fflush(stdin);
        
        printf("Echo: ");
        fgets(echo, sizeof(echo), stdin);
        fflush(stdin);
        
        // Länge checken und \n entfernen
        if (strlen(serv) < 2 || strlen(echo) < 2)
        {
            printf("Error: host || echo [strlen]\n");
            return 2;
        }
        serv[strlen(serv) - 1] = 0;
        echo[strlen(echo) - 1] = 0;
        
        // Hostname auflösen
        if (!(dns = gethostbyname(serv)))
        {
            printf("Error: gethostbyname\n");
            return 3;
        }
        
        // Struktur ausfüllen
        memset(&server, 0, sizeof(server));
        memcpy(&server.sin_addr.s_addr, dns->h_addr_list[0], sizeof(server.sin_addr.s_addr));
        server.sin_family = AF_INET;
        server.sin_port = htons(PORT);
        
        // Socket erstellen
        if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
        {
            printf("Error: socket\n");
            return 4;
        }
        
        // Verbinden
        if (connect(sock, (struct sockaddr *) &server, sizeof(server)) == -1)
        {
            printf("Error: connect\n");
            return 5;
        }
        
        // Daten senden
        if (send(sock, echo, strlen(echo), 0) < strlen(echo))
        {
            printf("Error: send\n");
            return 6;
        }
        
        // Socket schließen
    #ifdef _WIN32
        closesocket(sock);
        // WinSock DLL freigeben
        WSACleanup();
    #else
        close(sock);
    #endif
        return 0;
    }

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

Seite 1 von 2 12 LetzteLetzte

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •