Mittels Lan verbinung Daten senden

Alles rund um die Programmierung mit Qt
Antworten
Nalid
Beiträge: 26
Registriert: 21. Februar 2011 23:49

Mittels Lan verbinung Daten senden

Beitrag von Nalid »

Moin moin,

Ich hab das mit der Lan verbindung net ganz geschnallt... Ich hab es in einem Spiel benützt, und es hat geklappt. Doch da habe ich nur einzelne chars senden können und müssen.

Ich bin nun mitten drin in der Entwicklung eines Pokerspieles über eine LAN aber ich hab keine Ahnung wie ich grössere Werte als chars senden und lesen kann.


Das hier währe mein h file :

Code: Alles auswählen

#ifndef CGUI_CONNECT_H
#define CGUI_CONNECT_H

#include <QDockWidget>

#include <QtNetwork/QTcpSocket>
#include <QtNetwork/QTcpServer>
#include <QtNetwork/QNetworkInterface>
#include <QObject>
#include <CPlayer.h>


namespace Ui {
    class CGui_Connect;
}

class CGui_Connect : public QDockWidget
{
    Q_OBJECT

public:
    explicit CGui_Connect(QWidget *parent = 0);
    CPlayer *player;

    ~CGui_Connect();

private slots:
    void on_pushButton_connect_clicked();
    void acceptConnection();
    void clientConnectionEstablished();
    void send(QByteArray tosend);


    void on_pushButton_start_clicked();

private:
    Ui::CGui_Connect *ui;


    QString getMyIP();

    void startRead();


    QTcpSocket Clientt; // used by tcp client
    QTcpServer Server;        // used by tcp server
    QTcpSocket *pServerClient;

};

#endif // CGUI_CONNECT_H
und dies hier meine cpp :

Code: Alles auswählen

#include "CGui_Connect.h"
#include "ui_CGui_Connect.h"
#include "CGui.h"

CGui_Connect::CGui_Connect(QWidget *parent) :
    QDockWidget(parent),
    ui(new Ui::CGui_Connect)
{
    ui->setupUi(this);
    ui->pushButton_start->setDisabled(true);
    player = new CPlayer;

    // -- Server Setup ------------
    connect(&Server, SIGNAL(newConnection()), this, SLOT(acceptConnection()));

    bool ok = Server.listen();
    if (!ok) {

        QMessageBox::critical(this,"TCP Server", "Unable to start the server: " + Server.errorString());

        close();

        return;
    }
    QString ipAddress = getMyIP();
    quint16 port = Server.serverPort();
    ui->label_myip->setText(ipAddress);
    ui->label_myport->setText(QString::number(port,10));


    qDebug()<<"The Server is running on IP: "<<ipAddress<<" Port: "<<port<<" Run a client now." ;

    // -- Client Setup ------------
    connect(&Clientt, SIGNAL(connected()), this, SLOT(clientConnectionEstablished()));

}


void CGui_Connect::acceptConnection()
{
    pServerClient = Server.nextPendingConnection();
    connect(pServerClient, SIGNAL(readyRead()),this, SLOT(startRead()));
}

void CGui_Connect::clientConnectionEstablished() {
    qDebug()<<"verbindung hergestellt";
}

QString CGui_Connect::getMyIP() {
    QString ipAddress;
    QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
    // use the first non-localhost IPv4 address
    for (int i = 0; i < ipAddressesList.size(); ++i) {
        if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
            ipAddressesList.at(i).toIPv4Address()) {
            ipAddress = ipAddressesList.at(i).toString();
            break;
        }
    }
    // if we did not find one, use IPv4 localhost
    if (ipAddress.isEmpty()) {
        ipAddress = QHostAddress(QHostAddress::LocalHost).toString();
    }
    return ipAddress;
}


CGui_Connect::~CGui_Connect()
{
    delete ui;
}

void CGui_Connect::on_pushButton_connect_clicked()
{
    bool ok;
    ui->pushButton_start->setDisabled(false);
    ui->pushButton_connect->setDisabled(true);

    QString otherIP = ui->lineEdit_enemyip->text();
    quint16 otherPort = ui->lineEdit_enemyport->text().toInt(&ok);

    //Verbdindung mit der Adresse und port herstellen
    QHostAddress addr(otherIP);
    Clientt.connectToHost(addr, otherPort);

}


void CGui_Connect::startRead()
{    //wenn weniger als 1 byte warten sonst aus der methode kicken
    if (pServerClient->bytesAvailable() < 1)
        return;

    // anzahl bytes lesen
    QByteArray empfangpacket;
    empfangpacket = pServerClient->read(pServerClient->bytesAvailable());
    //eingelesenes bearbeiten

    switch(empfangpacket[0]){
    case 's': player->first=false;
        break;
    case 'g':
        break;
    default :

    break;
}
}


void CGui_Connect::send(QByteArray tosend){
    Clientt.write(tosend);
    update();
}


void CGui_Connect::on_pushButton_start_clicked()
{
    player->first=true;
    QByteArray startsend;
    startsend[0]='s';
    send(startsend);
    this->hide();

}

Wie ihr sieht sende ich mit QByteArray die Daten rüber... Aber bei einem Pokerspiel kann ich das so nicht machen... Einer der Spieler muss dem anderen seine Karten senden. Die Spieler müssen gegenseitig senden um wieviel sie erhöhen. ect... Also grössere Werte als ich mit einem Char senden kann.

Danke schon ma im voraus ;)
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: Mittels Lan verbinung Daten senden

Beitrag von DBGTMaster »

Ein QByteArray kann durchaus mehrere Zeichen darstellen.
Nalid
Beiträge: 26
Registriert: 21. Februar 2011 23:49

Re: Mittels Lan verbinung Daten senden

Beitrag von Nalid »

Also könnte ich durchaus die zahl 2000 rüber senden??
wieso hab ich dann beim letzten projekt so viel rumgemurkst -.-
Nalid
Beiträge: 26
Registriert: 21. Februar 2011 23:49

Re: Mittels Lan verbinung Daten senden

Beitrag von Nalid »

also könnte ich das einfach so machen??

Code: Alles auswählen

int chipcount = 2000;
QByteArray startsend;
    startsend[0]=chipcount;
    send(startsend);
und er würde dann 2000 raus lesen? sry, bin da noch ein ziemlicher neuling was solche sachen angeht -.-


edit: ok das klappt ja mal net -.-


Fehler:invalid conversion from 'int' to 'const char*'

Wie kann ich den mit dem TCP socket überhaupt solche Zahlen senden???
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Mittels Lan verbinung Daten senden

Beitrag von Christian81 »

Wie wäre es mit C++ Grundlagen?

Wenn du etwas hin- und hersenden möchtest musst du dir ein eigenes kleines Protokoll entwickeln. Der Einfachheit halber würde ich einfach Text hin- und herschicken welcher mit einem Zeilenumbruch sendet oder eben einen QDataStream. Ein sehr gutes Beispiel ist (welch Wunder) in der Qt-Doku zu finden: http://doc.trolltech.com/4.7/network-fortuneserver.html
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten