Сокеты Linux, взаимодействующие с QTcpSockets в Qt 4 - PullRequest
0 голосов
/ 29 июня 2009

Я пытаюсь связаться с TCP между программой Qt и обычной программой linux. У меня есть клиентская серверная программа linux, и я пытаюсь заменить серверную программу приложением Qt Вот код Linux-клиента

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

Вот код 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();
}

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

1 Ответ

3 голосов
/ 29 июня 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...