2009-06-28 6 views
0

J'essaie de communiquer avec TCP entre un programme Qt et un programme linux normal. J'ai un programme de serveur de client de Linux existant et j'essaye de remplacer le programme de serveur avec une application de Qt. Voici le code client linuxSockets Linux communiquant avec QTcpSockets dans Qt 4

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <unistd.h> 

int main(int argc, char *argv[]) 
{ 
    int sockfd, portno, n; 
    struct sockaddr_in serv_addr; 
    struct hostent *server; 

    char buffer[256]; 

    portno = 9876; 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 

    if (sockfd < 0) 
    { 
     printf("ERROR opening socket"); 
     return -1; 
    } 
    server = gethostbyname("localhost"); 

    if (server == NULL) 
    { 
     printf("ERROR, no such host\n"); 
     return -1; 
    } 

    memset((char *) &serv_addr,0,sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    bcopy((char *)server->h_addr, 
     (char *)&serv_addr.sin_addr.s_addr, 
     server->h_length); 
    serv_addr.sin_port = htons(portno); 

    connect(sockfd,(sockaddr*)&serv_addr,sizeof(serv_addr)); 

    sprintf(buffer,"This is a test\n"); 
    n = write(sockfd,buffer,256); 

    return 0; 
} 

Voici le code qt

#include <Qt> 
#include <QApplication> 
#include <QTcpServer> 
#include <QMessageBox> 
#include <QTcpSocket> 
#include <QtNetwork> 

#include "qtserver.h" 


Server::Server() 
{ 
    tcp = new QTcpServer(this); 
    tcp->listen(QHostAddress::Any,9876); 
    QObject::connect(tcp,SIGNAL(newConnection()),this,SLOT(printline())); 
} 

void Server::printline() 
{ 
    QTcpSocket *client = tcp->nextPendingConnection(); 
    QObject::connect(client,SIGNAL(disconnected()), 
        client,SLOT(deleteLater())); 


    QDataStream in(client); 
    in.setVersion(QDataStream::Qt_4_0); 

    QString data; 
    in >> data; 
    printf("String = %s\n",(char*)data.data()); 
} 

int main(int argc,char** argv) 
{ 
    QApplication a(argc,argv); 

    Server* server = new Server(); 

    return a.exec(); 
} 

Quand je tente d'exécuter les deux que je viens d'obtenir "String =" au lieu de délivrer en sortie de chaîne. Une idée de ce que je fais mal?

Répondre

3

QString::data() renvoie QChar *, vous ne pouvez pas le convertir en char * et espérer que cela fonctionnera toujours. Pour le débogage de QString, utilisez plutôt qPrintable. En outre, QTcpSocket est très facile à utiliser. Pourtant, au lieu d'écrire le code à partir de zéro, pourquoi ne pas commencer par extraire les exemples, par exemple. Fortune Server exemple.