Communication TCP Matlab-C++

Communication TCP Matlab-C++ - C++ - Programmation

Marsh Posté le 05-09-2012 à 15:04:13    

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

Reply

Marsh Posté le 05-09-2012 à 15:04:13   

Reply

Marsh Posté le 07-09-2012 à 17:13:31    

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

Reply

Marsh Posté le 10-09-2012 à 17:39:29    

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.

Reply

Marsh Posté le 12-09-2012 à 10:41:52    

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

Reply

Marsh Posté le 17-09-2012 à 17:46:17    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed