tags:

views:

1313

answers:

1

I am trying to communicate with TCP between a Qt program and a regular linux program. I have an existing linux client server program and I am trying to replace the server program with a Qt application. Here is the linux client code

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

Here is the qt code

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

When i try to run both of them I just get "String = " instead of the string outputting. Any idea what I'm doing wrong?

+3  A: 

QString::data() returns QChar*, you can't just cast it to char* and hope that it would always work. For debugging QString, use qPrintable instead.

Also, QTcpSocket is very easy to use. Still, instead of writing the code from scratch, why not start by checkout out the examples, e.g. Fortune Server example.

Ariya Hidayat