1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
|
#include "ads.h"
Ads::Ads()
{
setupUi(this);
socket = new QTcpSocket(this);
connect(socket, SIGNAL(connected()), this, SLOT(connecte()));
connect(socket, SIGNAL(disconnected()), this, SLOT(deconnecte()));
connect(socket, SIGNAL(readyRead()), this, SLOT(donneesRecues()));
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(erreurSocket(QAbstractSocket::SocketError)));
}
//================================= Tentative de connexion au serveur==================================================
void Ads::on_boutonConnexion_clicked()
{
// On annonce sur la fenêtre qu'on est en train de se connecter
listeMessages->append(tr("<em>Tentative de connexion en cours...</em>"));
boutonConnexion->setEnabled(false);
socket->abort(); // On désactive les connexions précédentes s'il y en a
//socket->setSocketOption(QAbstractSocket::KeepAliveOption, 1);
socket->connectToHost(serveurIP->text(), serveurPort->value()); // On se connecte au serveur demandé
}
//================================= Ce slot est appelé lorsque la connexion au serveur a réussi========================
void Ads::connecte()
{
listeMessages->append(tr("<em>Connexion réussie !</em>"));
boutonConnexion->setEnabled(true);
}
//================================= Ce slot est appelé lorsqu'on est déconnecté du serveur==============================
void Ads::deconnecte()
{
listeMessages->append(tr("<em>Déconnecté du serveur</em>"));
}
//================================= Ce slot est appelé lorsqu'il y a une erreur=========================================
void Ads::erreurSocket(QAbstractSocket::SocketError erreur)
{
switch(erreur) // On affiche un message différent selon l'erreur qu'on nous indique
{
case QAbstractSocket::HostNotFoundError:
listeMessages->append(tr("<em>ERREUR : le serveur n'a pas pu être trouvé. Vérifiez l'IP et le port.</em>"));
break;
case QAbstractSocket::ConnectionRefusedError:
listeMessages->append(tr("<em>ERREUR : le serveur a refusé la connexion. Vérifiez si le programme \"serveur\" a bien été lancé. Vérifiez aussi l'IP et le port.</em>"));
break;
case QAbstractSocket::RemoteHostClosedError:
listeMessages->append(tr("<em>ERREUR : le serveur a coupé la connexion.</em>"));
break;
case QAbstractSocket::SocketAccessError:
listeMessages->append(tr("<em>ERREUR : Des droits sont demandés</em>"));
break;
case QAbstractSocket::SocketResourceError:
listeMessages->append(tr("<em>ERREUR : Trop de sockets créés chez le serveur</em>"));
break;
case QAbstractSocket::DatagramTooLargeError:
listeMessages->append(tr("<em>ERREUR : Le datagram etait plus grand que la limite de calcul du système</em>"));
break;
case QAbstractSocket::NetworkError:
listeMessages->append(tr("<em>ERREUR : Une erreur est survenus sur le réseau</em>"));
break;
case QAbstractSocket::UnsupportedSocketOperationError:
listeMessages->append(tr("<em>ERREUR : Opération non supporté par le système</em>"));
break;
case QAbstractSocket::ProxyAuthenticationRequiredError:
listeMessages->append(tr("<em>ERREUR : Erreur Proxy</em>"));
break;
case QAbstractSocket::ProxyConnectionRefusedError:
listeMessages->append(tr("<em>ERREUR : Erreur Proxy, connection refusé</em>"));
break;
case QAbstractSocket::ProxyConnectionClosedError:
listeMessages->append(tr("<em>ERREUR : Erreur Proxy, Fermeture par le proxy</em>"));
break;
case QAbstractSocket::ProxyConnectionTimeoutError:
listeMessages->append(tr("<em>ERREUR : Erreur Proxy, Time out</em>"));
break;
case QAbstractSocket::ProxyNotFoundError:
listeMessages->append(tr("<em>ERREUR : Erreur Proxy, Le proxy n'a pas trouvé d'erreur</em>"));
break;
case QAbstractSocket::ProxyProtocolError:
listeMessages->append(tr("<em>ERREUR : Erreur Proxy, Le proxy n'a pas compris</em>"));
break;
case QAbstractSocket::UnknownSocketError:
listeMessages->append(tr("<em>ERREUR : Erreur inconnu</em>"));
break;
default:
listeMessages->append(tr("<em>ERREUR : ") + socket->errorString() + tr("</em>"));
}
boutonConnexion->setEnabled(true);
}
//=================================Envoi d'un message au serveur=========================================================
void Ads::on_boutonEnvoyer_clicked()
{
QByteArray paquet;
QDataStream out(&paquet, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_6);
//reserved
out << (quint16) 0;
//Length
out << qToBigEndian((quint32) AMS_TCP_Header_Lenght->text().toInt());
// AMSnetId Target
QStringList NetIdList_dest = AMS_NetId_Target->text().split(".");
if (NetIdList_dest.count()!=6)
{ listeMessages->append("Format : NetId target not Valid"); }
foreach(QString Tk_Net_Id_dest, NetIdList_dest)
{ out << (quint8) Tk_Net_Id_dest.toInt(); }
//AMSPortTarget
out << qToBigEndian((quint16) AMS_Port_Target->text().toInt());
// AMSnetId Source
QStringList NetIdList_src = AMS_NetId_Source->text().split(".");
if (NetIdList_src.count()!=6)
{ listeMessages->append("Format : NetId source not Valid"); }
foreach(QString Tk_Net_Id_src, NetIdList_src)
{ out << (quint8) Tk_Net_Id_src.toInt(); }
//AMSPort Source
out << qToBigEndian((quint16) AMS_Port_Source->text().toInt());
// Command Id
out << qToBigEndian((quint16)ADS_READ);
// State Flags
out << qToBigEndian((quint16)STATE_ADS_COMMAND);
// Data Length
out << qToBigEndian((quint32) 12);
//Error code
out << qToBigEndian((quint32) ADSERR_NOERROR);
//Invoke Id
out<< (quint8) NetIdList_src[3].toInt() << (quint8) NetIdList_src[2].toInt()<< (quint8) NetIdList_src[1].toInt() << (quint8) NetIdList_src[0].toInt() ;
////////read
out << qToBigEndian((quint32)0x4020);
out << qToBigEndian((quint32)0x0000);
out << qToBigEndian((quint32) 2 );
listeMessages->append(paquet.toHex());
socket->write(paquet);
}
// On a reçu un paquet (ou un sous-paquet)
void Ads::donneesRecues()
{
QDataStream in(socket);
in.setVersion(QDataStream::Qt_4_6);
QString messageRecu;
in >> messageRecu;
// On affiche le message sur la zone de Chat
listeMessages->append(messageRecu);
// On remet la taille du message à 0 pour pouvoir recevoir de futurs messages
tailleMessage = 0;
} |
Partager