fdf86
04-08-2010, 17:04
Salve a tutti,
Dopo essere riuscito (anche grazie a voi) a creare una GUI che facesse da Client per un'applicazione esterna utilizzando WxWidget e DevC++ e la winsock.h, il mio tutor per la tesi mi dice che forse è meglio se , prima di andare avanti, lo compilo con Visual Studio e usando le librerie QT4, sia per la parte grafica che per quella di networking.
Mi dico che non ci vorrà tanto...col cacchio..non riesco a farlo funzionare..
Riesco a connettermi al server (lo vedo sul suo prompt) ma non ad inviare messaggi..
ricevo come risposta ReadOnly device...si riferisce al server o al client che creo io?
Inoltre..ho provato a complicarlo un po' per sfruttare i segnali del QTcpSocket in modo da analizzarne gli errori e ricevo altri messaggi del tipo
Unhandled exception at 0x6703f0ee in GUI8.exe: 0xC0000005: Access violation reading location 0xabababab.
che tra l'altro è lo stesso che mi dava in precedenza quando la funzione ConnectToHost e la write venivano richiamate nello stesso slot.
Essendo nuovo di networking, non espertissimo di programmazione e non avendo mai usato le qt prima vi chiedo scusa per domande e/o errori banali.
Vi posto i codici .h e .cpp che ho scritto.
GUI8.h
#ifndef GUI8_H
#define GUI8_H
#include "stdafx.h"
#include <qapplication.h>
#include <qPushButton.h>
#include <qWidget.h>
#include <qobject.h>
#include "iostream"
#include <qiodevice.h>
#include <qtcpsocket.h>
#include <qhostaddress.h>
#include <QString>
#include <QtNetwork\QtNetwork>
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = 0);
~MyWidget();
QTcpSocket sock;
QMutex mutex;
QString addr;
public slots:
void server();
void start();
void disperror();
};
#endif
GUI8.cpp
// GUI.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "GUI.moc"
#include "GUI.h"
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
setFixedSize(400, 200);
QPushButton *ConnectToOMI = new QPushButton(tr("Connect"), this);
ConnectToOMI->setGeometry(150, 75, 100, 50);
ConnectToOMI->setFont(QFont("Times", 18, QFont::Bold));
connect(ConnectToOMI, SIGNAL(clicked()), this, SLOT(start()));
connect(&sock, SIGNAL(connected()), this, SLOT(server()));
connect(&sock, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(disperror()));
}
MyWidget::~MyWidget()
{
mutex.lock();
sock.close();
mutex.unlock();
}
void MyWidget::server()
{
QByteArray msg = dt.toUtf8();
mutex.lock();
sock.write(msg);
mutex.unlock();
}
void MyWidget::start()
{
mutex.lock();
sock.connectToHost("127.0.0.1",10501);
mutex.unlock();
}
void MyWidget::disperror()
{
mutex.lock();
printf("%s",sock.errorString());
mutex.unlock();
}
int _tmain(int argc, char* argv[])
{
QApplication app(argc, argv);
MyWidget widget;
widget.show();
return app.exec();
return app.exec();
return 0;
}
Per ora ho solo un tasto che dovrebbe avviare la connessione ed inviare un messaggio al server..L'applicazione finale è più complicata..ma per ora mi basterebbe aggiustar questo.
Ho messo qualche Qmutex perchè temevo ci fosse accavallamento di thread...
Sareste così gentili da dirmi cosa c'è che non va? O forse devo dire cosa posso salvare ? :D
Saluti,
Francesco
Dopo essere riuscito (anche grazie a voi) a creare una GUI che facesse da Client per un'applicazione esterna utilizzando WxWidget e DevC++ e la winsock.h, il mio tutor per la tesi mi dice che forse è meglio se , prima di andare avanti, lo compilo con Visual Studio e usando le librerie QT4, sia per la parte grafica che per quella di networking.
Mi dico che non ci vorrà tanto...col cacchio..non riesco a farlo funzionare..
Riesco a connettermi al server (lo vedo sul suo prompt) ma non ad inviare messaggi..
ricevo come risposta ReadOnly device...si riferisce al server o al client che creo io?
Inoltre..ho provato a complicarlo un po' per sfruttare i segnali del QTcpSocket in modo da analizzarne gli errori e ricevo altri messaggi del tipo
Unhandled exception at 0x6703f0ee in GUI8.exe: 0xC0000005: Access violation reading location 0xabababab.
che tra l'altro è lo stesso che mi dava in precedenza quando la funzione ConnectToHost e la write venivano richiamate nello stesso slot.
Essendo nuovo di networking, non espertissimo di programmazione e non avendo mai usato le qt prima vi chiedo scusa per domande e/o errori banali.
Vi posto i codici .h e .cpp che ho scritto.
GUI8.h
#ifndef GUI8_H
#define GUI8_H
#include "stdafx.h"
#include <qapplication.h>
#include <qPushButton.h>
#include <qWidget.h>
#include <qobject.h>
#include "iostream"
#include <qiodevice.h>
#include <qtcpsocket.h>
#include <qhostaddress.h>
#include <QString>
#include <QtNetwork\QtNetwork>
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = 0);
~MyWidget();
QTcpSocket sock;
QMutex mutex;
QString addr;
public slots:
void server();
void start();
void disperror();
};
#endif
GUI8.cpp
// GUI.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "GUI.moc"
#include "GUI.h"
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
setFixedSize(400, 200);
QPushButton *ConnectToOMI = new QPushButton(tr("Connect"), this);
ConnectToOMI->setGeometry(150, 75, 100, 50);
ConnectToOMI->setFont(QFont("Times", 18, QFont::Bold));
connect(ConnectToOMI, SIGNAL(clicked()), this, SLOT(start()));
connect(&sock, SIGNAL(connected()), this, SLOT(server()));
connect(&sock, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(disperror()));
}
MyWidget::~MyWidget()
{
mutex.lock();
sock.close();
mutex.unlock();
}
void MyWidget::server()
{
QByteArray msg = dt.toUtf8();
mutex.lock();
sock.write(msg);
mutex.unlock();
}
void MyWidget::start()
{
mutex.lock();
sock.connectToHost("127.0.0.1",10501);
mutex.unlock();
}
void MyWidget::disperror()
{
mutex.lock();
printf("%s",sock.errorString());
mutex.unlock();
}
int _tmain(int argc, char* argv[])
{
QApplication app(argc, argv);
MyWidget widget;
widget.show();
return app.exec();
return app.exec();
return 0;
}
Per ora ho solo un tasto che dovrebbe avviare la connessione ed inviare un messaggio al server..L'applicazione finale è più complicata..ma per ora mi basterebbe aggiustar questo.
Ho messo qualche Qmutex perchè temevo ci fosse accavallamento di thread...
Sareste così gentili da dirmi cosa c'è che non va? O forse devo dire cosa posso salvare ? :D
Saluti,
Francesco