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

MATLAB Discussion :

Communication TCP et C++


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Communication TCP et C++
    Bonjour,
    Je développe une interface en C++ (sous Visual Studio) entre MATLAB et un simulateur de trafic routier. L'interface permettra l’échange de messages entre MATLAB et le simulateur. Je m'excuse par avance s'il s’avère que le problème rencontre est plutôt du cote de C++, auquel cas je demanderai a déplacer le sujet.
    MATLAB a la Toolbox Instrument Control.

    Actuellement, la partie C++ lit les messages envoyés par MATLAB , mais MATLAB ne reçoit pas les messages envoyés par la partie C++ (le champ ValuesReceived de ma variable tcp indique 0)
    Le code MATLAB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tcpipServer = tcpip('0.0.0.0',25000,'NetworkRole','Server');
    fopen(tcpipServer);
    [answer, count, msg]=fread(tcpipServer,4,'double')
    La partie C++
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /* ... */	
    	try {
    		IPEndPoint^ ipRemoteEndPoint = gcnew IPEndPoint( IPAddress::Loopback, 25000 );
    		TcpClient^ tcpClient = gcnew TcpClient();
     
    		tcpClient->Connect( ipRemoteEndPoint ); // printf: connection OK
     
    		// Get a client stream for reading and writing.
    		NetworkStream^ stream = tcpClient->GetStream();
     
    		// Send the message to the connected TcpServer.
    		if ( stream->CanWrite ) {
    			stream->Write( sendBuffer, 0, sendBuffer->Length );			// printf: sendBuffer->Length != 0
    		}
     
    		stream->Close();
    		tcpClient->Close();
    	} catch ( Exception^ e ) {
    		processException(e);
    	}
    /* ... */

    MATLAB m'indique
    The specified amount of data was not returned within the Timeout period.
    Lorsque j’échange les rôles expéditeur-destinataire, en remplaçant fread par fwrite, stream->Write par stream->Read, tout semble se passer correctement.

    Toute aide sera grandement appréciée

    higlander

  2. #2
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Bonjour,

    Je n'ai jamais touché au TCP, cependant peut-être que j'ai une piste, et c'est peut-être effectivement un problème matlab...

    Es-tu sûr que Matlab ne reçoit pas les messages ? As-tu essayé d'afficher dans le workspace ton fameux message, juste après sa réception, pour vérifier qu'elle a bien eu lieu ? Ce que je pense en fait, c'est que la variable dans laquelle tu as stockée ta variable est "locale" (entre "{" et "}") et il se peut qu'elle soit supprimée avant que tu aies pu l'utiliser...

    Je sais que ça m'a posé problème pour mes développements en local... (cf Fonctions imbriquées)

    Cordialement,

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour et merci pour la piste !
    Citation Envoyé par tachmou Voir le message

    Es-tu sûr que Matlab ne reçoit pas les messages ?
    Je n'ai aucune idee de la reception ou non des messages ce que je sais, c'est que fopen est bloquant, et stoppe lorsqu'une connexion est etablie sur le port indique par l'appel a tcpip(). Je sais aussi que Matlab arrive a envoyer un message (ou plutot que la partie C++ arrive a le recevoir), j'imagine donc que la transmission de donnees est possible avec le code que j'ai donne.

    Citation Envoyé par tachmou Voir le message
    As-tu essayé d'afficher dans le workspace ton fameux message, juste après sa réception, pour vérifier qu'elle a bien eu lieu ?
    Comment faire ?

    Citation Envoyé par tachmou Voir le message
    Ce que je pense en fait, c'est que la variable dans laquelle tu as stockée ta variable est "locale" (entre "{" et "}") et il se peut qu'elle soit supprimée avant que tu aies pu l'utiliser...
    Je teste les lignes de code Matlab indiquees plus haut en les executant dans la fenetre de commandes, la portee des variables doit donc etre globale.
    Voila les infos obtenues sur ma variable tpcip
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    >> tcpipServer
     
       TCPIP Object : TCPIP-127.0.0.1
     
       Communication Settings 
          RemotePort:         25000
          RemoteHost:         127.0.0.1
          Terminator:         'LF'
          NetworkRole:        server
     
       Communication State 
          Status:             open
          RecordStatus:       off
     
       Read/Write State  
          TransferStatus:     idle
          BytesAvailable:     0
    --->ValuesReceived:     0
          ValuesSent:         0

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Je progresse (ou pas).
    Wireshark m'indique
    *) si je n'envoie qu'un seul message (sens C++ -> Matlab):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    src:194.199.22.201 dst:194.199.22.201 length:1406 info: 62239 > icl-twobase1 [PSH, ACK] Seq=1 Ack=1 Win=65536 Len=1352
    src:194.199.22.201 dst:194.199.22.201 length:1406 info: [TCP Out-of-Order] 65239 > icl-twobas1 [PSH,ACK] Seq=1 Ack=1 Win=65536 Len=1352
    Le message semble correctement envoye, mais ma variable tcpip cote Matlab n'a pas change (BytesAvailable = 0).

    *) si j'envoie 10 messages (C++ -> Matlab)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    src:194.199.22.201 dst:194.199.22.201 length:1406 info: 62752 > icl-twobase1 [PSH, ACK] Seq=1 Ack=1 Win=65536 Len=1352
    src:194.199.22.201 dst:194.199.22.201 length:1406 info: [TCP Retransmission] 62752 > icl-twobas1 [PSH,ACK] Seq=1 Ack=1 Win=65536 Len=1352
    src:194.199.22.201 dst:194.199.22.201 length:1406 info: 62752 > icl-twobase1 [PSH, ACK] Seq=1353 Ack=1 Win=65536 Len=1352
    src:194.199.22.201 dst:194.199.22.201 length:1406 info: [TCP Retransmission] 62752 > icl-twobas1 [PSH,ACK] Seq=1353 Ack=1 Win=65536 Len=1352
    src:194.199.22.201 dst:194.199.22.201 length:1406 info: 62752 > icl-twobase1 [PSH, ACK] Seq=2705 Ack=1 Win=65536 Len=1352
    src:194.199.22.201 dst:194.199.22.201 length:1406 info: [TCP Retransmission] 62752 > icl-twobas1 [PSH,ACK] Seq=2705 Ack=1 Win=65536 Len=1352
    ...
    etc (7 sequences de ce type en plus), Seq progresse de 1352 a chaque fois.

    Les logs montrent que les checksum des envois ne sont pas bons (ce qui expliquerait les TCP retransmission ?).
    Mais Matlab recoit des donnees !
    J'ai alors pense a un probleme de buffer qui devrait etre rempli pour que Matlba puisse acceder aux donnees ; j'envoie un unique message en le completant pour qu'il soit 10 fois plus gros que sa version originale. Matlab ne recoit rien...


    Je continue mes recherches...

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Il "semble" qu'en ajoutant une pause (300 millisecondes "semble" robuste) avant l'envoi du message C++, Matlab arrive a le lire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if ( stream->CanWrite ) {
    	Thread::Sleep(300);
    	stream->Write( sendBuffer, 0, sendBuffer->Length );
    }
    Ca fait beaucoup de "semble", mais c'est actuellement la seule solution que j'ai trouvee.

  6. #6
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Bah là, je t'avoue que je suis totalement dépassé (et je travaille pas du tout là dedans et j'ai autre chose à faire que de rentrer aussi loin dans ce problème)... j'ai envie de dire (je suis sûr, tu vas adorer ma réponse) : regarde la doc ! (elle est à ch*er, c'est ça ? bah regarde la quand même contemple la, vas-y, elle est belle, hein ?)

    Bon ben sur ce, je profite du fait que tu sois en train de lire la doc pour m'enfuir... et bonne chance haha !

    Non, mais sérieusement tu es sur la bonne piste je pense, de toutes façons il n'y a qu'à taton que tu y arriveras : perso, il n'y a que comme ça que j'ai pu avancer sans cette vrai doc.

    Pour afficher une variable, rien de plus simple : tu écris le nom de ta variable sur une ligne, sans point-virgule... lors de l'exécution, elle s'affichera.

    Sur ce, je continue à suivre la discussion et te souhaite bon courage (et t'abandonnes dans ta mouise mdr)

    ps: j'espère au moins que ce message t'auras changé les idées et t'auras bien fait rire haha et si tu veux m'insulter, vas-y, je t'en prie. (plutôt en MP histoire quand même que les gens ne se demandent pas... mais que se passe-t-il ici ?)

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Oui je crois bien que je vais finir par monologuer. Encore que je ne suis pas certain que ce soit le bon terme lorsqu'il s'agit de redaction. Bref !
    Il s'avere bien entendu que cela ne marche pas, je peux echanger 5000 messages avant que cela bloque... j'ai augmente le temps d'attente a 500 millisecondes, en attendant d'etre touche par une inspiration divine (ou les insultes d'un developpeur qui m'expliquera pourquoi evidemment ca ne peut pas marcher avec mon code).
    Merci pour ton passage

Discussions similaires

  1. Communication TCP via un script VBS
    Par razorbug dans le forum VBScript
    Réponses: 1
    Dernier message: 31/08/2007, 16h00
  2. Gestion des threads de communication TCP/IP
    Par Daminus dans le forum Delphi
    Réponses: 6
    Dernier message: 01/12/2006, 14h37
  3. Communication TCP/IP avec Flash
    Par Rodrigue dans le forum Dynamique
    Réponses: 3
    Dernier message: 23/10/2006, 16h19
  4. Problème de communication TCP/IP
    Par Gouyon dans le forum Développement
    Réponses: 4
    Dernier message: 01/07/2006, 19h55

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