Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1224 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Communication TCP Matlab-C++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Communication TCP Matlab-C++

n°2155694
higlander
Posté le 05-09-2012 à 15:04:13  profilanswer
 

Bonjour,
Je developpe une interface en C++ (sous Visual Studio) entre Matlab et un simulateur de trafic routier. L'interface permettra l'echange de messages entre Matlab et le simulateur. Je m'excuse par avance s'il s'avere que le probleme rencontre est plutot du cote de Matlab, auquel cas je demanderai a deplacer le sujet.
Matlab a la toolbox Instrument Control qui permet de gerer le protocole TCP.
 
Actuellement, la partie C++ lit les messages envoyes par Matlab, mais Matlab ne recoit pas les messages envoyes par la partie C++.
Le code Matlab :

Code :
  1. tcpipServer = tcpip('127.0.0.1',25000,'NetworkRole','Server');
  2. fopen(tcpipServer);
  3. [answer, count, msg]=fread(tcpipServer,4,'double')


La partie C++

Code :
  1. /* ... */
  2. try {
  3.  IPEndPoint^ ipRemoteEndPoint = gcnew IPEndPoint( IPAddress::Loopback, 25000 );
  4.  TcpClient^ tcpClient = gcnew TcpClient();
  5.  tcpClient->Connect( ipRemoteEndPoint ); // printf: connection OK
  6.  // Get a client stream for reading and writing.
  7.  NetworkStream^ stream = tcpClient->GetStream();
  8.  // Send the message to the connected TcpServer.
  9.  if ( stream->CanWrite ) {
  10.   stream->Write( sendBuffer, 0, sendBuffer->Length );   // printf: sendBuffer->Length != 0
  11.  }
  12.  stream->Close();
  13.  tcpClient->Close();
  14. } catch ( Exception^ e ) {
  15.  processException(e);
  16. }
  17. /* ... */


 
Matlab m'indique

Code :
  1. >> [answer, count, msg]=fread(tcpipServer, 4, 'double')
  2. answer =
  3.    Empty matrix: 1-by-0
  4. count =
  5.      0
  6. msg =
  7. The specified amount of data was not returned within the Timeout period.


 
Lorsque j'echange les roles expediteur-destinataire, en remplacant fread par fwrite, stream->Write() par stream->Read(), tout semble se passer correctement.  
 
Toute aide sera grandement appreciee :)
 
higlander

mood
Publicité
Posté le 05-09-2012 à 15:04:13  profilanswer
 

n°2155997
higlander
Posté le 07-09-2012 à 17:13:31  profilanswer
 

Je progresse (ou pas).  
Wireshark m'indique
*) si je n'envoie qu'un seul message (sens C++ -> Matlab):

Code :
  1. 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
  2. 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 :
  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. ...


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...

n°2156266
higlander
Posté le 10-09-2012 à 17:39:29  profilanswer
 

J'arrive a faire marcher le bousin en mettant une attente avant l'envoi cote C++ :

Code :
  1. if ( stream->CanWrite ) {
  2. Thread::Sleep(300);
  3. stream->Write( sendBuffer, 0, sendBuffer->Length );
  4. }


300 millisecondes semble stable. Je ne trouve pas ca tres propre, mais j'avoue ne plus avoir d'idees.

n°2156450
in_your_ph​ion
Posté le 12-09-2012 à 10:41:52  profilanswer
 

tu devrais pê tester la valeur de retour de fopen dans matlab ?
 
sinon ton matlab est configuré en serveur, il devrait pê être client aussi ? à voir dans la spec des libs de matlab

n°2156996
higlander
Posté le 17-09-2012 à 17:46:17  profilanswer
 

Merci, je vais creuser la valeur de retour de fopen, qui ne semble pas fonctionner exactement de la meme facon lorsqu'il s'agit d'un fichier ou d'une connexion.

Code :
  1. >> Server = tcpip('194.199.22.207',25000,'NetworkRole','Server');
  2. >> A=fopen(Server)
  3. Error using icinterface.fopen
  4. Too many output arguments.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Communication TCP Matlab-C++

 

Sujets relatifs
[C / C++] Lire informations disque durint16_t[400] et char[400] xor en C
[C][reseau] connection tcp (3 voies) raw socketTemporisation - Langage C - Launchpad MSP430
[XCode/Objective C] Que fais la fonction appendFormat?communication à distance avec un modem GPRS
Fonction: C[C]Extraire un chiffre d'un tableau de char dans un int
[C#] Service Windows et méthode static d'une dll précompilée [Résolu][C#] Génération de rapport PDF
Plus de sujets relatifs à : Communication TCP Matlab-C++


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR