2009-06-28 3 views
0

Я пытаюсь установить связь с TCP между программой Qt и обычной программой linux. У меня есть существующая программа клиентского сервера linux, и я пытаюсь заменить серверную программу на приложение Qt. Вот код Linux клиентСокеты Linux, взаимодействующие с QTcpSockets в 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; 
} 

Вот это кварты код

#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(); 
} 

Когда я пытаюсь запустить оба из них я просто получить «String =» вместо строки вывода. Любая идея, что я делаю неправильно?

ответ

3

QString::data() возвращает QChar *, вы не можете просто передать его char * и надеяться, что он всегда будет работать. Для отладки QString вместо этого используйте qPrintable.

Также, QTcpSocket очень прост в использовании. Тем не менее, вместо того, чтобы писать код с нуля, почему бы не начать с проверки примеров, например. Fortune Server пример.