DHamrick
DHamrick

Reputation: 8488

Linux sockets communicating with QTcpSockets in Qt 4

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?

Upvotes: 0

Views: 7513

Answers (1)

Ariya Hidayat
Ariya Hidayat

Reputation: 12561

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.

Upvotes: 3

Related Questions