Funktion wir überlagert. HELP!



  • Gute Idee, danke. Hilft mir aber bei meinem Problem nicht viel weiter.



  • 5000_Watt schrieb:

    Gute Idee, danke. Hilft mir aber bei meinem Problem nicht viel weiter.

    nun, ich weiß ja auch nicht was dein problem ist 🙂 deine schilderung "es passiert nichts" kann mich auch nur vermuten lassen 🙂



  • Ich könnte ja den gesamten Quellcode posten. Aber ich glaube, da gibts s welche, die mir das übel nehemn würden

    nun, ich weiß ja auch nicht was dein problem ist 🙂 deine schilderung "es passiert nichts" kann mich auch nur vermuten lassen :].

    Gut, dann poste ich eine ausgabe meines programmes.

    Winsock gestartet!
    Socket erstellt!
    Socket an port 12345 gebunden
    acceptSocket ist im listen Modus....

    wenn ich den button drücke:

    Winsock gestartet!
    Socket erstellt!
    Socket an port 12345 gebunden
    acceptSocket ist im listen Modus....

    das gleiche. es ist also nichts passiert 😉 .

    Die Methode OpenConnection() kennste ja schon, also kommt hier noch der Volständige Konstruktor sowie die main.cpp:

    Konstruktor:

    server::server(char *n)
    {
            long rc;
    		s = INVALID_SOCKET;
    		acceptSocket = INVALID_SOCKET;
            SOCKADDR_IN addr;
    
    		setupUi(this);
    		connect(pushButton_connect, SIGNAL(clicked()), this, SLOT(OpenConnection()));
    
            name = new(char[21]);
    
            for (int i = 0; i < 20; i++)
                    name[i] = n[i];
    
            name[20] = '\0';
    
    		//den Timer zum automatischen akzeptieren einer Verbindung aktivieren
    		accept_timer = new(QTimer)(this);
    		connect(accept_timer, SIGNAL(timeout()), this, SLOT(CheckForNewConnections()));
    		accept_timer->start(100);
    
            // Winsock starten
            rc=startWinsock();
            if (rc!=0) {
                    textEdit_log->append(QString("Fehler: startWinsock, fehler code:"));
                    return;
            } else {
                   textEdit_log->append(QString("Winsock gestartet!"));
            }
    
            // Socket erstellen
            acceptSocket=socket(AF_INET,SOCK_STREAM,0);
            if (acceptSocket==INVALID_SOCKET) {
                    textEdit_log->append(QString("Fehler: Der Socket konnte nicht erstellt werden, fehler code: "));
                    return ;
            } else {
                    textEdit_log->append(QString("Socket erstellt!"));
            }
    
            //Socket an 12345 binden
            memset(&addr,0,sizeof(SOCKADDR_IN));
            addr.sin_family=AF_INET;
            addr.sin_port=htons(12345);
            addr.sin_addr.s_addr=ADDR_ANY;
            rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
    
            if (rc==SOCKET_ERROR) {
                    textEdit_log->append(QString("Fehler: bind, fehler code: "));
                    return;
            } else {
                    textEdit_log->append(QString("Socket an port 12345 gebunden"));
            }
    
            rc=listen(acceptSocket,10);
            if (rc==SOCKET_ERROR) {
                    textEdit_log->append(QString("Fehler: listen, fehler code: "));
                    return;
            } else {
                    textEdit_log->append(QString("acceptSocket ist im listen Modus...."));
            }
    }
    

    main.cpp:

    #include <QApplication>
    #include "server.h"
    #include <iostream>
    
    int main(int argc, char *argv[])
    {
    		char name[21] = {'S','e','r','v','e','r','\0'}; 
    
    		QApplication app(argc,argv);
    		server *dialog = new server(name);
    
    		dialog->show();
    
    		return app.exec();
    }
    

    Der rest sollte nicht relevant sein, weil er nicht aufgerufen wird/werden soll.



  • beim server socket

    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    

    verwenden 🙂

    wieso gibt das programm nach dem klick auf den button

    Winsock gestartet!
    Socket erstellt!
    Socket an port 12345 gebunden
    acceptSocket ist im listen Modus....

    aus? das geht aus deinem code eigentlich nicht hervor.



  • Damit meie ich immer die gesamtausgabe. Also das, was schon da war + die neue Ausgabe.



  • Danke, leider muss ich mittteilen: Es geht immer noch nicht.



  • ahh. probiers mal mit

    connect(pushButton_connect, SIGNAL(clicked()), this, SLOT(OpenConnection(void)));
    

    oder nenne den slot

    on_pushButton_clicked()
    

    dann connected qt das automatisch



  • Hab ich.

    Die Methode heißt jetzt OpenNewSocketConnection(). Und selbst wenn es eine Namensdopelung gäbe, hätte ich dann nicht die alste Methode überladen?



  • darum ging es mir nicht. es ist wichtig dass beim connecten von signals und slots die parametertypen _exakt_ übereinstimmen. ansonsten wird der slot nicht ausgeführt.

    wenn du also OpenConnection so deklariert hast:

    class
    {
    private slots:

    void OpenConnection(void);
    }

    dann musst du auch

    connect(pushButton_connect, SIGNAL(clicked()), this, SLOT(OpenConnection(void)));
    

    benutzen. nichtsdestotrotz ist es bei ui-komponenten einfacher die slots so zu benennen:

    on_<widgetname>_<signal>()
    

    also eben zum beispiel

    on_pushButton_clicked()
    

    dann benötigst du auch kein aufruf von connect() mehr.



  • Und der ansatz mit dem autoconnecten geht auch nicht.



  • vergiss alles was ich gesagt habe. hat dein dialog den du _vor_ app.exec() aufrufst eine eigene eventqueue?



  • Achso, dann sollte der Slot aber on_pushButton_connect_clicked() heissen.

    Leider funktioniert das auch nicht. Ich habe gerade festgestellt, dass es bei mir nicht klappt auch nur irgendeinen Slot aufzurufen. 😮



  • erm, was?
    app.exec() ist das einzige, was ich aufrufe. oder verstehe ich da was nicht?
    Die main, die vorhins gepostet habe, ist meine komplette main.

    Ich kompilier nur 4 Dateien:

    main.cpp
    server.h
    server.cpp
    server_ui.h



  • 5000_Watt schrieb:

    Achso, dann sollte der Slot aber on_pushButton_connect_clicked() heissen.

    Leider funktioniert das auch nicht. Ich habe gerade festgestellt, dass es bei mir nicht klappt auch nur irgendeinen Slot aufzurufen. 😮

    wenn dein button "pushButton_connect" heißt - ja 🙂 wenn der dialog modal aufgerufen wird, wovon ich ausgehe wird app.exec() erst nach dem beenden des dialogs ausgeführt. demnach werden für den dialog keine events ausgeliefert weil noch keine eventqueue gestartet wurde (eben durch app.exec()).



  • Und was mach ich jetzt?

    Meine main.cpp:

    #include <QApplication>
    #include "server.h"
    #include <iostream>
    
    int main(int argc, char *argv[])
    {	
    		QApplication app(argc,argv);
    		server *dialog = new server("Server");
    
    		//char name[21] = {'S','e','r','v','e','r','\0'};
    
    		dialog->show();
    		return app.exec();
    }
    


  • zeig ma deine "server.h"



  • server.h:

    #ifndef SOCKSRV_H
    #define SOCKSRV_H
    
    #include "ui_server.h"
    #include <winsock2.h>
    #include <QTimer>
    
    class server : public QWidget, private Ui::Form_server
    {
    private:
            char *name;
            int GetLenghtOf(char str[]);
    		SOCKET s;
    		SOCKET acceptSocket; 
    		QTimer *accept_timer;
    public:
            /*! \brief Der standard-konstruktor, welcher einen Socket vorbereitet
             *  \param *n ein zeiger auf einen String, welcher den Namen des Benutzers angibt
             */
            server(char *n);
    
            /*! \brief Startet die Winsock einheit
             * wird benötigt, um Sockets verwenden zu können
             * \return 0, wenn erfolgreich, sonst einen fehlercode
             */
            int startWinsock(void);
    
    public slots:
    		void CheckForNewConnections();
    		void OpenNewSocketConnection(void);
    		void sendmsg();
    		void receivemsg();
    };
    
    #endif
    

    leider noch nicht überall kommentare.



  • class server : public QWidget, private Ui::Form_server
    

    leite deine klasse mal von QMainWindow ab 🙂

    leider noch nicht überall kommentare.

    what's hard to write should be hard to read 😛



  • Schade, hift auch nicht.

    Mein Änderungen:

    server.h

    #include "ui_server.h"
    #include <QMainWindow>
    #include <winsock2.h>
    #include <QTimer>
    
    class server : public QMainWindow, private Ui::Form_server
    

    Gleiches Problem, gleicher Effekt.



  • bool Connect(....)

    Creates a connection of the given type from the signal in the sender object to the method in the receiver object. Returns true if the connection succeeds; otherwise returns false.

    daraufhin habe ich mein programm abgeändert:

    Konstruktor:

    ...
    		bool conaccept = connect(pushButton_connect, SIGNAL(clicked(void)), this, SLOT(OpenNewSocketConnection(void)));
    
    		if(conaccept == true){
    				textEdit_log->append(QString("Connect hat funktioniert"));
    		}else{
    				textEdit_log->append(QString("Fehler: connect"));
                    }
                    ...
    

    und ich habe eine neue Ausgabe:

    Fehler: connect
    Winsock gestartet!
    Socket erstellt!
    Socket an port 12345 gebunden
    acceptSocket ist im listen Modus....
    

    Also scheitert bereits das Veringen und nicht das Aufrufen.


Anmelden zum Antworten