2009-10-12 5 views
1

J'essaie de communiquer via TCP Socket entre une application QT4 (MyApp) et Cayuga (écrit en C++).Problème entre un QTcpServer et un TCPClientSocket (Cayuga)

La partie de connexion fonctionne correctement, c'est-à-dire que Cayuga se connecte à MyApp.

Maintenant, MyApp envoie des données à Cayuga, mais rien n'est reçu.

MyApp vide :: init()

QTcpServer *m_server; 
QTcpSocket *clientConnection; 
//Open socket for transmission 
m_server = new QTcpServer(this); 
if (!m_server->listen(QHostAddress::Any, m_port)) { 
//Error handling 
    return; 
} 
connect(m_server, SIGNAL(newConnection()), this, SLOT(startSend())); 

MyApp vide :: startSend()

{ 
    clientConnection = m_server->nextPendingConnection(); 
} 

Le fait est writting ici:

QByteArray block; 
QDataStream out(&block, QIODevice::WriteOnly); 
out.setVersion(QDataStream::Qt_4_0); 
out << (quint16)0; 
out << s; 
out.device()->seek(0); 
out << (quint16)(block.size() - sizeof(quint16)); 
clientConnection->write(block); 
clientConnection->flush(); 

Mon tuteur a suggéré d'utiliser une bibliothèque externe (cudb) si je n'arrive pas à l'utiliser avec QTcpSockets. Cela ne me semble pas normal et c'est pourquoi j'espère que vous aurez une meilleure réponse à mon problème.

Répondre

1

Ceci est mon estimation de ce qui se passe:

QDataStream met en œuvre un protocole de sérialisation (Par conséquent devoir spécifier une version (Qt_4_0) pour elle). Vous avez besoin de quelque chose à l'autre extrémité qui comprend ce protocole (à savoir, un autre Qt_4_0 DataStream). En particulier, QDataStream s'assure que vous obtenez les bonnes données indépendamment de l'endianness des extrémités d'envoi et de réception.

Au lieu de sérialisation à un bloc, puis écrire le bloc, vous pouvez essayer quelque chose comme:

QDataStream out(clientConnection, QIODevice::WriteOnly); 
out.setVersion(QDataStream::Qt_4_0); 
out.writeRawData(data, length); 
clienConnection->flush(); 

writeRawData() ne marshall vos données ...

Questions connexes