server-client-architektur: verbindung kommt nicht zustande



  • Hallo zusammen,

    ich programmiere momentan an einem programm mit server-client-architektur. Ich hab alles implementiert, das projekt wäre somit eigentlich fertig, bis auf einen fehler im verbindungsaufbau, an dem ich nun schon etwa 3 tage zu beheben versuche, aber im grunde genommen immer noch gleichweit bin wie am anfang.

    Falls der fehler im client ist, müsste er hier zu finden sein:

    /*
    Open connection to server
    @ int *sockfd: pointer to socket file descriptor
    */
    int newconnection(int *sockfd){
      printf("%s\n", "1");
      // Adressinformation for ip-connection
      struct sockaddr_in serv_addr;
      printf("%s\n", "2");
      serv_addr.sin_family = AF_INET;
      printf("%s\n", "3");
      serv_addr.sin_port = htons(999);
      printf("%s\n", "4");
      serv_addr.sin_addr.s_addr = inet_addr("192.168.1.54");
      printf("%s\n", "5");
      memset(&serv_addr.sin_zero, 0, sizeof(serv_addr.sin_zero));
      printf("%s\n", "6");
      // Try to connect
      if(connect(*sockfd, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0){
        printf("%s\n", "7.1");
        return -1;
      }
      printf("%s\n", "7.2");
      return 0;
    }
    
    // accept connection
      if(acccon(&sockfd, &keysockfd, &clientdata) != 0){
        printf("%s\n", " Error in function acccon()");
        return -1;
      }
      else{
        printf("%s\n", " OK in function acccon()");
      }
    

    Die Konsolenausgaben sind nämlich:

    Socket request successful.
    1
    2
    3
    4
    5
    6
    7.1
    Establishing connection failed.

    Das gegenstück zu dieser funktion (als serverseitig) ist folgendes:

    /*
    Accept connection
    @ int *sockfd: pointer to socket file descriptor for listening
    @ int *keysockfd: pointer to socket file descriptor for new connection
    @ struct sockaddr_in *clientdata: Datastructure for saving details about client
    */
    int acccon(int *sockfd, int *keysockfd, struct sockaddr_in *clientdata){
      printf("%s\n", "1");
      socklen_t sin_size = sizeof(struct sockaddr_in);
      printf("%s\n", "2");
      struct sockaddr_in tempcd = *clientdata; // optimieren: nicht umweg ueber tempcd !!! wie?
      printf("%s\n", "3");
      *keysockfd = accept(*sockfd, (struct sockaddr *) &clientdata, &sin_size);
      printf("%s\n", "4");
      if(*keysockfd == -1){
        printf("%s\n", "5.1");
        return -1;
      }
      printf("%s\n", "5.2");
      return 0;
    }
    

    Wär super, wenn mir jemand sagen könnte, das nicht richtig ist/nicht richtig sein könnte, da ich so langsam aber sicher nicht mehr weiss, was ich noch probieren könnte.



  • Zur Debugging-Strategie:
    Lass mal den Server weg, und verbinde dich auf 80 mit irgendeinem Webserver.
    Danach solltest du wissen, ob das Problem am Client oder am Server liegt.

    Wenn nicht werd ich mir's genauer ansehen.
    🙂



  • Wow, dein tipp ist gold wert:

    Socket request successful.
    1
    2
    3
    4
    5
    6
    7.2
    Establishing connection successful.

    Der Fehler muss also beim server liegen! Das wird auch bestätigt durch:

    telnet> open 192.168.1.54 999
    Trying 192.168.1.54...
    telnet: connect to address 192.168.1.54: Connection refused

    Der Fehler muss also in zeile 13 des letzten codes liegen, die "3" wird nämlich noch ausgegeben, die "4" aber schon nicht mehr.
    Wenigstens weiss ich jetzt, dass der Client seine verbindungsanfrage richtig sendet und in welcher Zeile der Fehler liegt. 🙂 Nur an welcher Stelle genau? 😕

    Noch zwei Bemerkungen zum ersten post:
    (1) Der kleine codeteil ist ein ausschnitt aus den mainprogramm. Ich hab in an der falschen stelle eingefügt. Er gehört eigentlich zur unteren funktion. Es ist ihr aufruf.
    (2) Beim kompilierten der codes gibts beim ganzen code keine fehler, das problem tritt zur laufzeit auf.



  • Wow, dein tipp ist gold wert:

    Hehe. 🙂
    Ich hab leider gerade keine Zeit um deinen Code zu testen, vielleicht später.
    Muß aber jedenfalls auch Werbung für unser Magazin machen, da gibt's einen Artikel
    zum Thema:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-169861.html



  • Es geht darin aber leider nur um die entwicklung eines clients, als den teil, der bei mir funktioniert. 😉 Aber trotzdem vielen Dank.


Anmelden zum Antworten