socket-qt

  • Upload
    semeh

  • View
    218

  • Download
    0

Embed Size (px)

Citation preview

  • 7/25/2019 socket-qt

    1/10

    Initiation au dveloppement Qt sur les socketsPhilippe Latu

    philippe.latu(at)inetdoc.net

    http://www.inetdoc.net

    Rsum

    Ce support est la suite de l'initiation au dveloppement en Langage C sur les sockets. L'objectifest nouveau le mme ; utiliser un code minimaliste accessible aux dbutants. Les bibliothquesQt prsentent un grand intrt lorsque l'on souhaite produire du code indpendant du systmed'exploitation sous-jacent. On aborde aussi la programmation oriente objet avec ces bibliothques.

    Table des matires

    1. Copyright et Licence ............................................................................................................... 11.1. Meta-information .......................................................................................................... 1

    2. Contexte de dveloppement .................................................................................................... 22.1. Bibliothques Qt ........................................................................................................... 2

    2.2. Instructions d'excution ................................................................................................ 22.3. Bibliothques utilises .................................................................................................. 43. Programme serveur UDP en mode console .............................................................................. 4

    3.1. Utilisation des sockets avec le serveur UDP console ........................................................ 43.2. Code source complet .................................................................................................... 5

    4. Programme serveur UDP en mode graphique ........................................................................... 64.1. Utilisation des sockets avec le serveur UDP graphique .................................................... 74.2. Traitement des vnements et des datagrammes ............................................................ 8

    5. Documents de rfrence ......................................................................................................... 9

    1. Copyright et Licence

    Copyright (c) 2000,2015 Philippe Latu.Permission is granted to copy, distribute and/or modify this document under theterms of the GNU Free Documentation License, Version 1.3 or any later versionpublished by the Free Software Foundation; with no Invariant Sections, noFront-Cover Texts, and no Back-Cover Texts. A copy of the license is includedin the sectionentitled "GNU Free Documentation License".

    Copyright (c) 2000,2015 Philippe Latu.Permission est accorde de copier, distribuer et/ou modifier ce document selonles termes de la Licence de Documentation Libre GNU (GNU Free DocumentationLicense), version 1.3 ou toute version ultrieure publie par la Free SoftwareFoundation; sans Sections Invariables ; sans Texte de Premire de Couverture,et sans Texte de Quatrime de Couverture. Une copie de la prsente Licence estincluse dans la section intitule Licence de Documentation Libre GNU .

    1.1. Meta-information

    Cet articleest crit avec DocBookXML sur un systme Debian GNU/Linux. Il est disponible en versionimprimable au format PDF : socket-qt.pdf.

    Initiation au dveloppement Qt sur les sockets 1

    http://www.docbook.org/http://www.debian.org/http://www.inetdoc.net/pdf/socket-qt.pdfhttp://www.debian.org/http://www.docbook.org/
  • 7/25/2019 socket-qt

    2/10

    Initiation au dveloppement Qt sur les sockets

    2. Contexte de dveloppement

    Comme ce support est la suite de celui sur le Langage C, on reprend le mme dcoupage en deuxprogrammes distincts : un serveuret un clientqui changent des chanes de caractres. la diffrencedu support prcdent, on ne prsente pas le code des deux programmes. Dans le but de limiter levolume du document, on introduit uniquement le code de la partie serveur qui reoit le message, le

    traite et le rexpdie au client. Pour les tests, on peut trs bien rutiliser le programme client djdvelopp en Langage C : Code du programme udp-client.c

    Le principe d'illustration des communications rseau reste le mme : le client ou talker met unmessage que le serveurou listenertraite et retransmet vers le client. Le traitement est toujours aussiminimaliste ; le serveurconvertit la chane de caractres en majuscules.

    2.1. Bibliothques Qt

    Le diagramme ci-dessous prsente l'architecture des bibliothques Qt. Il met en videncel'indpendance entre les dveloppements et les systmes d'exploitation cibles.

    Dans notre contexte, on utilise le Langage C++ et l'environnement de dveloppement intgr QtCreator.Cet environnement comprend les bibliothques Qt rseau dont nous avons besoin.

    On se propose de dvelopper le programme serveur en deux temps.

    Une version sans graphisme mettant en vidence les appels de bibliothques propres l'utilisationdes sockets.

    Une version avec une fentre graphique dans laquelle on affiche les messages reus depuis unprogramme client ainsi que l'adresse IP et le numro de port utiliss par ce programme client.

    2.2. Instructions d'excution

    On excute le programme clientdj dvelopp en Langage C dans un Shellalors que le programmeserveurest gr directement par l'environnement QtCreator. On peutexcuter ces deux programmessur le mme hte en utilisant l'interface de boucle locale pour les communications rseau.

    Initiation au dveloppement Qt sur les sockets 2

    http://www.inetdoc.net/dev/socket-c/socket-c.udp.client.html#socket-c.udp.client.sourcehttp://www.inetdoc.net/dev/socket-c/socket-c.udp.client.html#socket-c.udp.client.sourcehttp://www.inetdoc.net/dev/socket-c/socket-c.udp.client.html#socket-c.udp.client.sourcehttp://www.inetdoc.net/dev/socket-c/socket-c.udp.client.html#socket-c.udp.client.source
  • 7/25/2019 socket-qt

    3/10

    Initiation au dveloppement Qt sur les sockets

    Le programme serveur, nogui-udp-listener

    Note

    Dplacer le pointeur de la souris sur l'image, clicker sur le bouton droit et lancer Afficherl'image pour lire les messages.

    C'est dans la partie infrieure droite de la copie d'cran que l'on retrouve en rouge les messageschangs entre les programmes clientet serveur. Le code utilis ici correspond la version sansgraphisme du programme serveur.

    Le programme client, udp-talker.o

    $ ./udp-talker.oEntrez le nom du serveur ou son adresse IP :127.0.0.1

    Entrez le numro de port du serveur :8888

    Entrez quelques caractres au clavier.Le serveur les modifiera et les renverra.Pour sortir, entrez une ligne avec le caractre '.' uniquement.Si une ligne dpasse 100 caractres,seuls les 100 premiers caractres seront utiliss.

    Saisie du message :texte de test avec tabulation et espaces

    Message trait : TEXTE DE TEST AVEC TABULATION ET ESPACESSaisie du message :_exit_Message trait : _EXIT_

    Saisie du message :serveur arrtPas de rponse dans la seconde.Saisie du message :.

    Lorsque le programme serveurest en cours d'excution, il est possible de visualiser la correspondanceentre le processus en cours d'excution et le numro de port en coute l'aide de la commande netstat.

    $ netstat -aup | grep -e Proto -e 8888(Tous les processus ne peuvent tre identifis, les infos sur les processusnon possds ne seront pas affiches, vous devez tre root pour les voir toutes.)Proto Recv-Q Send-Q Adresse locale Adresse distante Etat PID/Program nameudp 0 0 *:8888 *:* 3321/QtCreator_UDP

    Dans l'exemple ci-dessus, le numro de port 8888apparat dans la colonne Adresse localeet processusnumro 3321correspond bien au programme QtCreator_UDP_receiverdans la colonne PID/Programname.

    Initiation au dveloppement Qt sur les sockets 3

  • 7/25/2019 socket-qt

    4/10

    Initiation au dveloppement Qt sur les sockets

    2.3. Bibliothques utilises

    Les bibliothques standards du Langage C utilises par le programme clientsont prsentes dans ledocument Initiation au dveloppement C sur les sockets. On ne s'intresse ici qu' l'utilisation de labrique rseau des bibliothques Qt.

    bind

    Cette mthode de la classe QUdpSocketassure la liaison d'un socketavec les adresses et le numro

    de port spcifis.

    waitForReadyRead

    C'est une fonction bloquante qui attend que de nouvelles donnes soient disponibles en lecture etque le signal readyRead()ait t mis. Le blocage expire aprs msecsmillisecondes. La valeur pardfaut est 30000 millisecondes.

    La fonction retourne la valeur boolenne vrai si le signal readyRead()est mis.

    readDatagram

    Cette fonction assure la rception d'un datagramme de taille infrieure maxSizeoctets et le stockedans le tableau data. L'adresse et le numro de port de l'metteur sont stockes dans les pointeurs*addresset *port( moins que les pointeurs aient une valeur nulle).

    Si maxSizeest trop petit, le reste du datagramme est perdu. Pour viter les pertes de donnes, on faitappel pendingDatagramSize()pour dterminer la taille du datagramme en attente avant d'essayerde le lire. Si maxSizevaut 0, le datagramme sera limin.

    writeDatagram

    Cette fonction assure l'mission d'un datagramme de taille size destination de l'adresse addresset du port port. Elle renvoie le nombre d'octets mis avec succs ou -1 en cas d'erreur.

    Les datagrammes sont toujours crits en un bloc. La taille maximum d'un datagramme dpendbeaucoup du systme utilis. Elle peut atteindre 8192 octets. Si le datagramme est trop grand,la fonction renvoie -1 et la fonction error() renvoie DatagramTooLargeError. Il est dconseilld'mettre des datagrammes de plus de 512 octets est en gnral. Mme s'ils sont mis avec succs,

    ils seront probablement fragments au niveau de la couche IP avant d'arriver leur destinationfinale.

    3. Programme serveur UDP en mode console

    Avec l'environnement intgr de dveloppement QtCreator, il est possible de crer une application enmode console.

    partir de l'cran d'accueil, il faut crer un nouveau projet et choisir Qt Console Application dans lacatgorie Application.

    L'intrt de cette tape est de produire un fichier source unique de taille rduite dans lequel on trouvel'ensemble des appels de bibliothques Qt.

    3.1. Utilisation des sockets avec le serveur UDP consoleAvec les bibliothques Qt, on retrouve les lments classiques de reprsentation des communicationsrseau.

    Initiation au dveloppement Qt sur les sockets 4

    http://www.inetdoc.net/dev/socket-c/
  • 7/25/2019 socket-qt

    5/10

    Initiation au dveloppement Qt sur les sockets

    QUdpSocket listenSocket;QByteArray datagram;QHostAddress senderAddress;quint16 senderPort;

    listenSocketObjet de la classe QUdpSocketconstituant le canal de communication entre le sous-systme rseaudu noyau du systme d'exploitation et l'application.

    datagramObjet de la classe QByteArray contenant les donnes vues de la couche application de lamodlisation rseau.

    senderAddressObjet de la classe QHostAddresscontenant la reprsentation de l'adresse de l'hte qui a mis ledatagramme reu par le serveur.

    senderPortEntier en format court contenant le numro de port utilis par l'hte qui a mis le datagrammereu par le serveur.

    if (!listenSocket.bind(QHostAddress::Any , 8888 )) { qDebug("Impossible de crer le socket en coute"); exit(EXIT_FAILURE) ;}

    QHostAddress::Any spcifie que le programme est en coute sur toutes les adresses IP desinterfaces de l'hte.L'application est en coute sur le port numro 8888uniquement.Le le programme s'interrompt en cas d'erreur. On reprend ici le mme principe que dans lesautres programmes crits en Langage C.

    Une fois la liaison en place, le programme attend les datagrammes provenant du client.if (listenSocket.waitForReadyRead(100)) { if (listenSocket.hasPendingDatagrams()) ) { datagram.resize(listenSocket.pendingDatagramSize()); if (listenSocket.readDatagram(datagram.data(), datagram.size(), &senderAddress, &senderPort) == -1) { listenSocket.close(); exit(EXIT_FAILURE); } msg = datagram.data();

    La mthode waitForReadyRead(100)bloque l'excution du programme pendant 100ms, le temps

    de dtecter un vnement de rception de donnes sur le socketen coute.Si un datagramme est en attente, on procde sa lecture.On redimensionne le tableau des donnes en fonction de la taille du datagramme reu.On stocke les donnes du datagramme dans la chane de caractres msg.

    Enfin, l'mission de datagramme du serveur vers le client utilise la fonction writeDatagramavec un jeude paramtres identique l'opration de lecture.

    3.2. Code source complet

    #include #include

    #include #include #include

    int main(int argc, char *argv[])

    Initiation au dveloppement Qt sur les sockets 5

  • 7/25/2019 socket-qt

    6/10

    Initiation au dveloppement Qt sur les sockets

    { QCoreApplication a(argc, argv);

    QUdpSocket listenSocket; QByteArray datagram; QHostAddress senderAddress; quint16 senderPort; QString msg;

    if (!listenSocket.bind(QHostAddress::Any, 8888)) {

    qDebug("Impossible de crer le socket en coute"); exit(EXIT_FAILURE); }

    while (1) {

    if (listenSocket.waitForReadyRead(100)) { if (listenSocket.hasPendingDatagrams()) { datagram.resize(listenSocket.pendingDatagramSize()); if (listenSocket.readDatagram(datagram.data(), datagram.size(), &senderAddress, &senderPort) == -1) { listenSocket.close(); exit(EXIT_FAILURE); } msg = datagram.data();

    qDebug()

  • 7/25/2019 socket-qt

    7/10

    Initiation au dveloppement Qt sur les sockets

    4.1. Utilisation des sockets avec le serveur UDP graphique

    Puisque cette section est consacre une application graphique, on commence par dcrire le voletinterface utilisateur.

    Une fois le projet ouvert, on slectionne l'onglet Formulaires puis le fichier de description de la fentregraphique mainwindow.ui.

    Note

    Dplacer le pointeur de la souris sur l'image, cliquer sur le bouton droit et lancer Afficherl'image pour lire les messages.

    Dans cette fentre, on implante trois objets.

    pushButtonL'objet bouton, dont on a chang le texte affich, sert quitter le programme. Le codecorrespondant l'utilisation du bouton se trouve dans le fichier mainwindow.cpp.

    msgLabelCet objet champ de texte est utilis pour l'affichage de la chane de caractres msg. C'est lors de larception d'un nouveau message que les caractres de ce champ sont modifis.

    senderLabelCet objet champ de texte est utilis pour l'affichage de l'adresse IP et le numro de port de l'metteurdu message. Comme dans le cas prcdent, il faut qu'un nouveau message ait t reu et quel'metteur soit identifi pour que ce champ soit modifi.

    En revenant au mode diter, on peut parcourir les diffrents fichiers sources du projet.

    main.cpp

    Le programme principal est complt par dfaut lors de la cration d'un nouveau projet. notreniveau, il n'est pas ncessaire de le modifier. Son seul travail est d'afficher la fentre wde la classeMainWindowavant d'entrer dans la boucle d'vnements (event loop).

    mainwindow.hCe fichier en-tte contient la dclaration de la classe MainWindow. C'est ce niveau que l'on dbutel'dition de code avec l'ajout d'une mthode et de plusieurs membres privs. Le mot cl privatespcifie que seuls les objets de la classe ont accs ces ressources.

    Initiation au dveloppement Qt sur les sockets 7

  • 7/25/2019 socket-qt

    8/10

    Initiation au dveloppement Qt sur les sockets

    La mthode processPendingDatagrams() contient tous les traitements de rception, detransformation et de r mission des messages. Cette mthode utilise les membres dclars dansla classe.

    On retrouve ici la liste des variables du programme de la section prcdenteen plus du pointeurde fentre ui(user interface) et des deux champs de texte prsents plus haut.

    private: Ui::MainWindow *ui;

    QLabel *senderLabel, *msgLabel; QUdpSocket *listenSocket; QHostAddress senderAddress; quint16 senderPort; QString msg;

    mainwindow.cpp

    Aprs les dclarations des membres et des mthodes de la classe MainWindow, ce fichier contient lecode des mthodes. Les points importants ici sont le traitement des vnements et le traitementdes datagrammes rseau.

    4.2. Traitement des vnements et des datagrammes

    Dans ce programme, deux types d'vnements sont scruts : l'arrive d'un nouveau datagramme et leclic sur le bouton Quitter. Le code correspondant la scrutation des vnements est dcrit dans lamthode MainWindowdu fichier mainwindow.cpp.

    QObject::connect(listenSocket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()));

    QObject::connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(close()));

    L'appel de la mthode connect() de la classe QObject cre une connexion entre le socket

    listenSocketet le signal issu de la mthode readyRead().Ds qu'un signal est reu par la mthode connect(), un datagramme est en attente delecture. Cette lecture et le traitement associ sont effectus l'aide du sous-programmeprocessPendingDatagrams()dont le code est donn dans le mme fichier source.Ici, l'appel la mthode connect()de la classe QObjectcre une connexion entre l'objetpushButtonet le signal issu de la mthode clicked(). Ds que ce signal est reu, la mthode close()entranela fin d'excution du programme.

    Pour le traitement des datagrammes, c'est le code du sous-programme processPendingDatagrams()quiassure la lecture, le passage en majuscules des caractres de la chane et la rmission. L'opration detransformation des caractres en majuscules n'est qu'une illustration d'un traitement possible. Commela plupart des protocoles de l'Internet sont bass sur l'change de messages sous forme de chanes decaractres, on utilise ici une forme minimaliste de traitement par requte - rponse.

    Initiation au dveloppement Qt sur les sockets 8

  • 7/25/2019 socket-qt

    9/10

    Initiation au dveloppement Qt sur les sockets

    void MainWindow::processPendingDatagrams(){

    while (listenSocket->hasPendingDatagrams()) {

    QByteArray datagram;

    datagram.resize(listenSocket->pendingDatagramSize()); if (listenSocket->readDatagram(datagram.data(), datagram.size(),

    &senderAddress, &senderPort) == -1) { listenSocket->close(); exit(EXIT_FAILURE); }

    msg = datagram.data(); qDebug()

  • 7/25/2019 socket-qt

    10/10

    Initiation au dveloppement Qt sur les sockets

    Adressage IPv4Adressage IPv4: support complet sur l'adressage du protocole de couche rseau de l'Internet (IP).

    Configuration d'une interface rseauConfiguration d'une interface de rseau local: support sur la configuration des interfaces rseau.Il permet notamment de relever les adresses IP des htes en communication.

    http://www.inetdoc.net/travaux_pratiques/config.interface.lan/http://www.inetdoc.net/articles/adressage.ipv4/