• 3278阅读
  • 1回复

[提问]百思不得其解的问题,情各位帮忙看看,谢谢! [复制链接]

上一主题 下一主题
离线chenlong1258
 

只看楼主 倒序阅读 楼主  发表于: 2015-02-08
写了个tcp server和tcp client,但是发现server没有收到client发过来的数据。抓包看了也只有TCP握手、断开报文,没有数据传输。

server:
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QTcpServer>
  4. #include <QTcpSocket>
  5. #include <QDebug>
  6. Widget::Widget(QWidget *parent) :
  7.     QWidget(parent),
  8.     ui(new Ui::Widget)
  9. {
  10.     ui->setupUi(this);
  11. }
  12. Widget::~Widget()
  13. {
  14.     delete ui;
  15. }
  16. void Widget::on_pushButton_clicked()
  17. {
  18.     Server = new QTcpServer();
  19.     if (!Server->listen(QHostAddress::Any, 8080))
  20.     {
  21.         qDebug() << "server listen error!";
  22.         return;
  23.     }
  24.     ui->pushButton->setEnabled(false);
  25.     connect(Server, SIGNAL(newConnection()), this, SLOT(recvData()));
  26. }
  27. void Widget::recvData()
  28. {
  29.     qDebug() << "enter recv data";
  30.     clientSocket = Server->nextPendingConnection();
  31.     connect(clientSocket, SIGNAL(readyRead()), this, SLOT(readMoreData()));
  32.     clientSocket->waitForReadyRead();
  33. }
  34. void Widget::readMoreData()
  35. {
  36.     qDebug() << "readMoreData";
  37.     QByteArray data;
  38.     clientSocket->waitForReadyRead();
  39.     data = clientSocket->readAll();
  40.     qDebug() << QString(data);
  41. }

client:
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include "QTcpSocket"
  4. #include <QDebug>
  5. Widget::Widget(QWidget *parent) :
  6.     QWidget(parent),
  7.     ui(new Ui::Widget)
  8. {
  9.     ui->setupUi(this);
  10. }
  11. Widget::~Widget()
  12. {
  13.     delete ui;
  14. }
  15. void Widget::on_pushButton_clicked()
  16. {
  17.     QTcpSocket client(this);
  18.     if(!client.bind())
  19.     {
  20.         qDebug() << "bind error!";
  21.         return;
  22.     }
  23.     ui->pushButton->setEnabled(false);
  24.     client.connectToHost("127.0.0.1", 8080);
  25.     client.waitForBytesWritten();
  26.     int len = client.write("hello");
  27.     if (-1 == len)
  28.     {
  29.         qDebug() << "client write error!";
  30.     }
  31. }

运行之后client没有qDebug打印;server的qDebug打印如下:

Starting /home/chenlong12580/develop/build-myHttpServer-Desktop_Qt_5_4_0_GCC_32bit-Debug/myHttpServer...
enter recv data
离线chenlong1258

只看该作者 1楼 发表于: 2015-02-26
自己回复把,犯了一个低级错误,这里备注下,避免别人被此帖误导。
抓包看了下,主要客户端没发送数据就直接FIN 关闭TCP链接了。然后自己去看了看Qt自带的loopback示例,参考改了下,不是在connecttohost之后直接write数据,而是连接到client socket的connected后再在slot中发送数据,这样就OK了,想了想,也是有道理,tcp分为好几个阶段,connecttohost只是握手阶段,不能直接connecttohost就发送数据,因为这个时候链路也许还没准备好!
具体见下面的client端代码,可以对比上面的看:
#include "widget.h"
#include "ui_widget.h"
#include "QTcpSocket"
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    client = new QTcpSocket(this);

    ui->pushButton->setEnabled(false);

    client->connectToHost("127.0.0.1", 8080);

   connect(client, SIGNAL(connected()), this, SLOT(socket_Conn()));
    connect(client, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(printError(QAbstractSocket::SocketError)));

}

void Widget::socket_Conn()
{
    int len = 0;
    len = client->write("hello");
    if (-1 == len)
    {
        qDebug() << "write error!";
    }
    else
    {
        qDebug() << "write succ";
    }
    client->close();
}

void Widget::printError(QAbstractSocket::SocketError err)
{
    qDebug() << "occur error!";
    qDebug() << err;
}




快速回复
限100 字节
 
上一个 下一个