Sockets -> accept (die 1000.)



  • Hallo!

    Erstmal Danke für die recht schnelle Antwort!!!

    Alsooo..

    Port hab ich jetzt geändert, danke für den Tipp 🙂 Das wusste ich nämlich garnet..

    Nun..

    Ich verwende VC++ 6.0 Standard für die Kompilierung des Tutorials UND meines Codes. Das heisst daran kann es nicht liegen, da beide den selben Code verwenden.

    Im Tutorial wird accept() genau so verwendet wie ich es tue.. ich weiss nicht warum das nicht klappt 🙂

    Ich werd aber mal da ne Struktur angeben und das mal probieren.

    Vielen Dank!!!

    PS: Ich hatte mein Passwort verschmissen +g+

    mfg
    sTr33n



  • Ich hab jetzt mal die Funktion accept() abgeändert, aber jetzt stürzt das Programm ab.. 🙄

    Hier der Code

    int cServer::Server_accept (void)
    {
    	this->connectedsocket = accept(this->acceptsocket, (SOCKADDR*)&this->addr, (int*)sizeof(SOCKADDR));
    
    	return this->connectedsocket;
    }
    

    Aber du sagst, bei dir bleibt er erst nachher hängen? Wie geht das ? bei mir klappt es nicht so!

    Ich müsste erst einen Clienten verbinden, aber beim Tutorial und bei DIR mit meinem Code klappts? das kann ja nicht sein.. was kann da falschsein?!

    mfg



  • Bei "... accept(... , (SOCKADDR*) &addr, ...);" also hier

    int cServer::Server_accept (void) 
    { 
        this->connectedsocket = accept(this->acceptsocket, (SOCKADDR*)&this->addr, (int*)sizeof(SOCKADDR)); 
    
        return this->connectedsocket; 
    }
    

    überschreibst Du mit Sicherheit "Die Daten an den Du Deinen Serverapplikation gebunden hast" 🙄 ! Verwende diesen Parameter nur mit einer
    zweiten

    SOCKADDR_IN clientDaten;
    

    Struktur, den Accept legt dort
    Daten von einen Clienten ab der connecten will(Zu verwenden wen Du eine Logfile zum registrieren von eingehenden Clients verwenden willst)! Du überschreibst dort nehmlich
    Die Daten deiner laufenden Serverapplikation -> deswegen kommt sicherlich der
    Absturz!!!!

    mfg



  • wegen flascher Verwendung von "SOCKADDR_IN addr;"
    Deklarieren in deinen Serverobjekt Klasse wie auch immer
    noch eine Struktur vom Typ "SOCKADDR_IN clientDaten;"
    und aendere:

    int cServer::Server_accept (void)  
    {  
        this->connectedsocket = accept(this->acceptsocket, (SOCKADDR*)&this->addr, (int*)sizeof(SOCKADDR));  
    
        return this->connectedsocket;  
    }
    

    ietwa so ab damit Du die Serverdaten nicht ueberschreibst:

    int cServer::Server_accept (void)  
    {  
        this->connectedsocket = accept(this->acceptsocket, (SOCKADDR*)&this->clientDaten, (int*)sizeof(SOCKADDR));  
    
        return this->connectedsocket;  
    }
    

    Dann sollte es nicht mehr Abstürzen!

    Kommt jetzt ein connectendere Client stehen dort (bei "clientDaten")Verbindungsdaten vom Clienten 😉

    mfg



  • Hab folgende Deiner Implementierung folgendermaßen nochmal geandert und dann hat der Server
    bei mir wieder gefunzt

    int cServer::Server_accept (void) 
    {
        int addrSize = sizeof(SOCKADDR);
    
        this->connectedsocket = accept(this->acceptsocket,
                                       (SOCKADDR*) &clientDaten,
                                       (int*) &addrSize);
    
        return this->connectedsocket; 
    }
    

    Sorry und mfg



  • Der bzw Dein TCP-Server (Fehler bei accept behoben) und mit 2. SOCKADDR_IN - Struktur:

    #include <windows.h>
    #include <iostream.h>
    #include <cstring.h>
    
    class cServer 
    { 
    
    public: 
    
        inline cServer () {} 
        inline ~cServer () { WSACleanup(); closesocket(this->acceptsocket); closesocket(this->connectedsocket); } 
    
        inline SOCKET getConSocket (void) { return this->connectedsocket; } 
    
        int        Server_startup        (void); 
        int        Server_createSock    (void); 
        int        Server_bind            (string port); 
        int        Server_listen        (void); 
        int        Server_accept        (void); 
    
    private: 
    
        WSADATA        wsadata; 
        SOCKET        acceptsocket; 
        SOCKET        connectedsocket; 
        SOCKADDR_IN    addr, clientDaten;
    
    }; 
    int cServer::Server_startup (void) 
    { 
        return WSAStartup(MAKEWORD(2,0), &this->wsadata); 
    } 
    
    int cServer::Server_createSock (void) 
    { 
        this->acceptsocket = socket(AF_INET, SOCK_STREAM, 0); 
    
        return this->acceptsocket; 
    } 
    
    int cServer::Server_bind(string port) 
    { 
        memset(&this->addr, 0, sizeof(SOCKADDR_IN)); 
        this->addr.sin_family = AF_INET; 
        this->addr.sin_port = htons(atoi(port.c_str())); 
        this->addr.sin_addr.s_addr = INADDR_ANY; 
    
        return bind(this->acceptsocket, (SOCKADDR*)&this->addr, sizeof(SOCKADDR_IN)); 
    } 
    
    int cServer::Server_listen (void) 
    { 
        return listen(this->acceptsocket, 10); 
    } 
    
    int cServer::Server_accept (void) 
    {
    	 int addrSize = sizeof(SOCKADDR);
        this->connectedsocket = accept(this->acceptsocket,
                                       (SOCKADDR*) &clientDaten,
                                       (int*) &addrSize);
    
        return this->connectedsocket; 
    }
    
    ////////////////////////////////////////////////////////////////////
    
    int main (void) 
    { 
        cServer myserver; 
        long res; 
        char buffer[255]; 
    
        res = myserver.Server_startup(); 
    
        if (res != 0) 
            cout << "Server meldet: Winsock nicht gestartet!\n"; 
        else 
            cout << "Server meldet: Winsock erfolgreich gestartet!\n"; 
    
        res = myserver.Server_createSock(); 
    
        if (res != INVALID_SOCKET) 
            cout << "Server meldet: Socket erfolgreich erstellt!\n"; 
        else 
            cout << "Server meldet: Socket nicht erstellt!\n"; 
    
        res = myserver.Server_bind("237"); 
    
        if (res != SOCKET_ERROR) 
            cout << "Server meldet: Socket wurde an Port 237 erfolgreich gebunden!\n"; 
        else 
            cout << "Server meldet: Socket wurde nicht gebunden!\n"; 
    
        res = myserver.Server_listen(); 
    
        if (res != SOCKET_ERROR) 
            cout << "Server meldet: Neuer Status: Server im Listen Modus...\n"; 
        else 
            cout << "Server meldet: Server nicht im Listen Modus!\n"; 
    
        res = myserver.Server_accept(); 
    
        if (res != INVALID_SOCKET) 
            cout << "Server meldet: Neue Verbindung akzeptiert!\n"; 
        else 
            cout << "Server meldet: Neue Verbindung nicht akzeptiert!\n"; 
    
        while(res != SOCKET_ERROR) 
        { 
            res = recv(myserver.getConSocket(), buffer, strlen(buffer), 0); 
    
            if (res == 0) 
            { 
                cout << "Server hat die Verbindung getrennt.. \n"; 
                break; 
            } 
    
            if (res == SOCKET_ERROR) 
            { 
                cout << "Fehler: Receive"; 
                break; 
            } 
    
            buffer[res] = '\0'; 
            cout << "Nachricht: " << buffer; 
    
        } 
    
        return(0); 
    }
    

    Und jetzt nochmal der TCP - Client zum testen:

    #include <winsock.h>
    #include <stdio.h>
    
    //Prototypen
    int startWinsock(void);
    
    int main()
    {
      long rc;
      SOCKET s;
      SOCKADDR_IN addr;
      char buf[256];
    
      // Winsock starten
      rc=startWinsock();
      if(rc!=0)
      {
        printf("Fehler: startWinsock, fehler code: %d\n",rc);
        return 1;
      }
      else
      {
        printf("Winsock gestartet!\n");
      }
    
      // Socket erstellen
      s=socket(AF_INET,SOCK_STREAM,0);
      if(s==INVALID_SOCKET)
      {
        printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Socket erstellt!\n");
      }
    
      // Verbinden
      memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
      addr.sin_family=AF_INET;
      addr.sin_port=htons(237); // wir verwenden mal port 12345
      addr.sin_addr.s_addr=inet_addr("127.0.0.1"); // zielrechner ist unser eigener
    
      rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
      if(rc==SOCKET_ERROR)
      {
        printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Verbunden mit 127.0.0.1..\n");
      }
    
      // Daten austauschen
      while(rc!=SOCKET_ERROR)
      {
        printf("\nZeichenfolge eingeben [max 256]: ");
        gets(buf);
        send(s,buf,strlen(buf),0);
        rc=recv(s,buf,256,0);
        if(rc==0)
        {
          printf("Server hat die Verbindung getrennt..\n");
          break;
        }
        if(rc==SOCKET_ERROR)
        {
          printf("Fehler: recv, fehler code: %d\n",WSAGetLastError());
          break;
        }
        buf[rc]='\0';
        printf("\nServer antwortet: %s\n",buf);
      }
      closesocket(s);
      WSACleanup();
      getchar();
      return 0;
    }
    
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    

    so funzt es bei mir, Verbindung und Nachrichtübermittlung bei dem Server klappt!
    :p

    wenns immer noch nisch geht?
    kann es sein das du rein zufällig ne bzw. die winsock2.h
    includiert hast die damit gehts bei mir nisch ich verwende deshalb "winsock.h"

    mfg 🙂



  • Hallo!

    Danke für deine Mühe 🙂

    Ich hab gerade ein neues Projekt gemacht und das ganze HAAR GENAU EXAKTESTENS gleich abgeschrieben und siehe da: Es klappt net!

    Das kann nicht sein! Das geht nicht..

    Ich werd jetzt nochmal den neuen Code von dir probieren und hoffen dass es klappt!

    Vielen Dank dass du dir die Mühe gemacht hast!!!!

    mfg



  • is aus versehen geschehen aber diese Header includiert ihrer selbst
    die "winsock.h" gleich mit!
    Du kannst das aendern dann wird die EXE nen bisschen kleiner! 😉



  • Hallo!

    Wie erwartet, funktioniert es nicht 😡 😞 🙄

    Der Server bleibt sofort hängen bei accept wieder mal..

    naja ich weiss langsam echt nicht was da los is... am Code kanns einfach nicht liegen, weil das der selbe ist!

    Trotzdem danke!!!

    mfg



  • Ich habs ja bei mir mit C++ 5.0 von Boland getestet -> Ergebnis es geht anstandslos

    Dann hab ichs mit Microsoft Visual C++ 6.0 getestet -> Ergebnis es geht nischt,
    neben Headerfiles die er nicht findet "cstring.h" ganz zu schweigen

    Ich nutze persöhnlich Microsoft Visual C++ aber sowieso nicht mehr
    das ist etwas Nutzerunfreundlich meines erachtens!
    Das soll aber keine Abwertung von Microsoft sein, nischts ist vollkommen!

    mfg



  • Du das kann nicht sein, dass MEIN Code nicht funktioniert aber der Code des Tutorials funktioniert..

    beides ist mit VC kompiliert/gelinkt wurden!!

    Der eine Code (aus dem Tutorial per c&p) funktioniert aber mein Code, der die selben Funktionen benutzt nur in einer klasse funktioniert nicht!

    Erklär mir das mal 🙂

    Das geht nicht!



  • Und zwar mit dem CBuilder 5.0 von Borland
    und Dein Code mit der Klassenkapselung der Netzwerkfunktionen funktioniert
    einwandfrei bezogen auf meinen Client und Dein Servercode!

    Nur VC 6.0 macht dicke Backen das is Compilerspezifisch und hat nichts unbedingt damit zu tun das der Code grundlegend falsch is!!!!!

    Solche Probleme hatte ich schon des öfteren deswegen habe ich bei mir zu Hause
    auch eineiges an Compilern und IDE's rumkullern! C/C++ - Compiler ist nicht
    gleich C/C++ Compiler bezogen auf CODEtechnische Standards! So is nunmal das
    Leben. Ich hab da schon so manches erlebt was ausser dieser Geschicht dort
    funktioniert hat und auf ner anderen IDE nicht! Es gibt sogar Unterschiede
    zwischen den verschiedenen Versionen von einer IDE von ein und demselben
    Hersteller!!! 😞 😉 🙂

    Sumasomarum hab ich jez auf 3 verschiedenen Compilern getestet bei den
    beiden Borlands klappts, und bei Visual C++ 6.0 gehts nisch! Ergo Compilerproblem!

    mfg 🙂



  • Ich hab jetzt den Code ausm Tutorial 1:1 übernommen und schritt für schritt in Klasse umgesetzt..

    einziger Unterschied: ich benutze printf() und kein cout 😃

    Vielleicht liegts daran.. egal, es funktioniert und das ist das wichtigste +gg+

    Vielen Dank jedenfalls für deine Hilfe!!!

    mfg


Anmelden zum Antworten