IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Quelle classe ou fonction utiliser pour envoyer des messages par TCP IP


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti

    Homme Profil pro
    Ing. dev
    Inscrit en
    Septembre 2009
    Messages
    29
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing. dev
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 29
    Billets dans le blog
    1
    Par d�faut Quelle classe ou fonction utiliser pour envoyer des messages par TCP IP
    Bonjour,

    C'est la premi�re fois que je dois faire un projet avec une communication TCP et je ne sais pas qu'elle classe ou fonction utiliser pour arriver � mes fins.

    J'ai un serveur qui ne fait que d'attendre une connexion TCP pour lire une chaine de caract�re envoy�e sur un port. Le serveur est passif, il ne r�pond pas apr�s la r�ception du texte.

    Mon r�le est d'envoyer une chaine de caract�re au serveur en �tant sur que celui-ci l'ai bien re�u.
    Il y a une contrainte au niveau du temps, je peux me permettre un d�lai lors de l'�tablissement de la connexion mais aucun lorsque j'envoie le message.
    Je dois donc g�rer s�par�ment la connexion au serveur et l'envoi de messages.
    Lors de la connexion je dois pouvoir modifier un timeout.
    Avant d'envoyer un message je dois �tre certain que que la connexion est valide.

    J'ai test� les classes TTcpClient et TIdTCPClient mais je n'arrive pas faire ce que j'aimerais.

    Le but final est de cr�er une DLL qui sera utilis�e par Simatic WinCC permettant l'envoi de message.

    J'utilise l'outil de d�veloppement C++ Builder 2007.

    Merci d'avance

  2. #2
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    Par d�faut
    TCP n'est pas un protocole orient� message.
    Il serait peut-�tre plus simple d'utiliser un protocole plus adapt� � vos contraintes, comme UDP, si vos messages sont de petites tailles.

  3. #3
    Mod�rateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    1 655
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 1 655
    Par d�faut
    Citation Envoy� par bacelar Voir le message
    TCP n'est pas un protocole orient� message.
    C'est vrai: une connexion TCP doit �tre vue comme un flux in-interrompu de donn�es.
    Si tu veux y ajouter la notion de 'message' (parlons ici de 'blocs' de donn�es), tu vas devoir l'impl�menter toi-m�me.
    Par exemple en d�cr�tant qu'un message se termine syst�matiquement par un caract�re de type 'retour charriot' ('\n' en C/C++).
    Donc ton programme va lire chaque octetre�u sur sa socket et la stocker dans un buffer. D�s qu'il d�tecte un '\n', il sait qu'il a re�u un bloc complet et peut le passer au reste de l'application pour qu'elle le traite.
    Ton programme vide alors le buffer et recommence pour le message suivant.

    Il serait peut-�tre plus simple d'utiliser un protocole plus adapt� � vos contraintes, comme UDP, si vos messages sont de petites tailles.
    Surtout pas!
    UDP est avant tout un protocole qui autorise la perte de paquets. Si les messages qu'ils envoient doivent tous arriver � destination, TCP est un meilleur choix.

    Il y a une contrainte au niveau du temps, je peux me permettre un d�lai lors de l'�tablissement de la connexion mais aucun lorsque j'envoie le message.
    Je te conseille alors de d�sactiver l'algorithme de Nagle sur ta socket TCP . Tu y gagneras en vitesse au prix d'une l�gere augmentation de bande passante.

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    D�tails du profil
    Informations personnelles :
    �ge : 51
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par d�faut
    Citation Envoy� par bacelar Voir le message
    Il serait peut-�tre plus simple d'utiliser un protocole plus adapt� � vos contraintes, comme UDP, si vos messages sont de petites tailles.
    Mais dans ce cas, le serveur devra imp�rativement renvoyer un datagramme de confirmation de bonne r�ception, sachant que ce datagramme peut �tre lui-m�me perdu, donc il faut g�rer les retransmissions et ignorer les �ventuels doublons c�t� serveur...

    Bref, faut (presque) r�impl�menter TCP, donc ce n'est pas forc�ment optimal c�t� temps de d�veloppement, m�me si in fine le r�sultat sera souvent "meilleur" en performances avec de l'UDP.
    Mais bon, quitte � bosser aussi bas, pour ma part je passerais directement en Raw Sockets en m'�vitant les couches UDP/IP.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au s�rieux, de toutes fa�ons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum ad�quat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    UDP ne garantie pas l'ordre d'acheminement non plus.

  6. #6
    Mod�rateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    1 655
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 1 655
    Par d�faut
    Citation Envoy� par Mac LAK Voir le message
    Bref, faut (presque) r�impl�menter TCP, donc ce n'est pas forc�ment optimal c�t� temps de d�veloppement
    C'est le moins qu'on puisse dire !

    , m�me si in fine le r�sultat sera souvent "meilleur" en performances avec de l'UDP.
    Non: un paquet TCP transite aussi vite qu'un paquet UDP. Le seul cas o� UDP est plus rapide que TCP c'est si un paquet TCP pr�c�dent a �t� perdu, soit 0.4% des cas pour une transmission internet, et grosso modo moins d'un cas sur un million pour un r�seau local LAN filaire. Mais dans ce cas, il faudra encore g�rer le d�sordonnancement des paquets avec UDP (ou m�me d'abord savoir si �a a un sens au niveau de son appli).

    Mais bon, quitte � bosser aussi bas, pour ma part je passerais directement en Raw Sockets en m'�vitant les couches UDP/IP.
    De deux choses l'une:

    - soit c'est pour une transmission dans un r�seau local, donc probablement en filaire et donc le TCP fera aussi bien (taux de perte de paquets infime).

    - soit c'est pour une transmission via le net, et un paquet non-TCP et non-UDP ne survivra pas au premier routeur rencontr�.

  7. #7
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    Par d�faut
    Sur une s�mantique message, le cas de perte ou de rejeu est facilement impl�mentable sans avoir recours � des fen�tre de temporisation, des fen�tre de bufferisation etc...

    TCP/IP donne beaucoup de service mais UDP � un p�rim�tre d'utilisation aussi vaste.

    nouknouk, tes statistiques prennent-t-elles en compte le cout d'�tablissement et de fermeture de connexion, le probl�me des d�marrage progressif (Nagles) etc... ?

  8. #8
    Membre averti

    Homme Profil pro
    Ing. dev
    Inscrit en
    Septembre 2009
    Messages
    29
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing. dev
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 29
    Billets dans le blog
    1
    Par d�faut
    Merci de vos r�ponses.

    Voici quelques pr�cisions sur vos remarques:

    1 - Je n'ai pas le choix que d'utiliser TCP qui est impos� par le serveur. Celuis-ci est une application achet�e o� je n'ai aucun pouvoir de modification.
    2 - Le serveur attend des blocs contenant du texte avec un terminateur "\r" pour s�parer les diverses chaines.
    3 - Le serveur ne retourne aucun message.
    4 - Nous travaillons sur un r�seau LAN et le r�seau Internet ne sera jamais utilis�.
    5 - Je n'ai pas besoin d'optimiser � la milli-seconde le protocol. Mais avant d'envoyer un message je dois �tre sur que la connexion est toujours OK car je dois �viter au maximum de bloquer mon application (DLL) plus de 100ms lors d'un envoi de message.


    En fait j'ai juste besoin :
    - de pouvoir tester si la connexion est r�ellement valide (Je suis p'�tre naif, mais je pensais que Connected ou Select de la classe TTcpClient me donnais) en cas de coupure du c�ble ou autre.
    - de g�rer les timeout qui sont actuellement proche des 20s.

    Je vais voir Boost.Asio si �a arrange mes bidons...

  9. #9
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    D�tails du profil
    Informations personnelles :
    �ge : 51
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par d�faut
    Citation Envoy� par nouknouk Voir le message
    Non: un paquet TCP transite aussi vite qu'un paquet UDP.
    Pas tout � fait : traverser (logiciellement) la couche TCP est plus long que traverser la couche UDP : pas de machine � �tats, pas de fen�tres, pas de fragmentation, pas de connexion trois points, etc.

    Attention : soyons bien d'accord, l�, on parle de gain tr�s l�gers (de l'ordre de la microseconde au mieux pour chaque paquet). Sur UN envoi, c'est difficilement mesurable. Sur un transfert soutenu, c'est mesurable, voire significatif.

    Citation Envoy� par nouknouk Voir le message
    - soit c'est pour une transmission dans un r�seau local, donc probablement en filaire et donc le TCP fera aussi bien (taux de perte de paquets infime).
    Toujours pareil : ce n'est qu'un probl�me de temps de travers�e de la stack. Pas plus, pas moins.

    Citation Envoy� par nouknouk Voir le message
    - soit c'est pour une transmission via le net, et un paquet non-TCP et non-UDP ne survivra pas au premier routeur rencontr�.
    Je n'envisageais pas une seule seconde d'utiliser des raw sockets sur WAN, je te rassure...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au s�rieux, de toutes fa�ons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum ad�quat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  10. #10
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    Par d�faut
    Aucun protocole IP ne pourra dire en temps r�el si le c�ble est d�connect� ou pas. C'est pas leur fonction. D�branch� le c�ble ne r�initialisa pas les connexions TCP. Vous le rebranchez en moins de 2 minutes et les connexions sont encore op�rationnelles.

    L'approche la plus raisonnable est de faire des envoies non bloquant dans la partie cliente.

  11. #11
    Alp
    Alp est d�connect�
    Expert confirm�

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par d�faut
    Boost.Asio peut �tre int�ressant, si tu utilises d�j� boost par exemple (dans le cas contraire aussi, mais tu seras peut-�tre plus r�ticent pour ajouter une biblioth�que � tes d�pendances).
    Elle permet de m�cher le travail.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [MySQL] info pour envoyer des donn�es par mail
    Par boubourse92 dans le forum PHP & Base de donn�es
    R�ponses: 2
    Dernier message: 30/01/2008, 13h04
  2. [C++] quelle structure de donn�e utiliser pour stocker des vertices ?
    Par johnnyjohnny dans le forum D�veloppement 2D, 3D et Jeux
    R�ponses: 14
    Dernier message: 14/07/2007, 21h44
  3. formulaire pour envoyer des messages.
    Par cyrilmarc dans le forum Langage
    R�ponses: 2
    Dernier message: 22/11/2006, 21h15
  4. [Mail] Codage d'une page pour envoyer des messages.
    Par cyrilmarc dans le forum Langage
    R�ponses: 5
    Dernier message: 21/11/2006, 21h53
  5. R�ponses: 4
    Dernier message: 28/03/2005, 19h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo