Funktion wir überlagert. HELP!
-
Ah, d**n. Hast natürlich vollkommen Recht. Habe das Programm modifizieren müssen, solange connect nicht funzte, habs leider vergessen, ses wieder rückgängig zu machen:
void server::OpenConnection() { long rc = 0; char buf[36]; char target[16]; SOCKADDR_IN addr; //meine Socketadresse textEdit_log->append(QString("OpenConnection()")); memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten addr.sin_family=AF_INET; addr.sin_port=htons(12345); // wir verwenden mal port 12345 for(int i = 0; i < lineEdit_IP->text().size(); i++) target[i] = lineEdit_IP->text()[i].toAscii(); addr.sin_addr.s_addr=inet_addr( target); rc= ::connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if (rc==SOCKET_ERROR) { textEdit_log->append(QString("Kann keine Verbindung herstellen")); return ; } else { textEdit_log->append(QString("Verbindung hergestellt")); } //sende meinen Namen als begrüßung rc = send(s,name,21,0); //empfange den Namen des anderen rc = recv(s,buf, 21, 0); //schiebe den Namen im buffer 16 zeichen nach rechts return ; }
Fazit: Geht leider immer noch nicht.
Problem: Das selbe
-
nutze lieber
struct hostent* hostinfo; hostinfo = gethostbyname("hostname"); if (hostinfo == NULL) { close(local_socket); } else neu.sin_addr = *(struct in_addr*) hostinfo->h_addr;
als "hostname" kannst du die ip als string oder einen hostnamen übergeben. gethostbyname() kümmert sich dann um die namensauflösung via dns.
-
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