2009-06-28 47 views
0

我想与Qt程序和普通的Linux程序之间的TCP通信。我有一个现有的Linux客户端服务器程序,我试图用Qt应用程序替换服务器程序。下面是Linux的客户端代码在Qt 4中与QTcpSockets通信的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(); 
} 

当我尝试运行他们两个我只想找到“字符串=”而不是字符串输出。任何想法我做错了什么?

回答

3

QString::data()返回QChar *,您不能只是将其转换为char *并希望它始终有效。要调试QString,请改为使用qPrintable

另外,QTcpSocket非常容易使用。尽管如此,不是从头开始编写代码,为什么不从头开始检查例子,例如例如Fortune Server