• 14531阅读
  • 7回复

如何断开QTcpSocket的问题 [复制链接]

上一主题 下一主题
离线iamyu10
 
只看楼主 倒序阅读 楼主  发表于: 2009-11-19
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
一个客户端,

程序逻辑如下:
tcpSocket->connectToHost( ui->lineEdit->text(), xxx );
...发送操作
tcpSocket->abort();

ui->lineEdit->text()中输入服务端ip地址, 反复执行程序,服务端可以接收到数据,没有问题。

当我将lineEdit中的ip换为一个不存在的地址时,发送数据,服务端接收不到,正常!

可问题是当我再把lineEdit中的地址改回第一次的正确的服务端地址时再发送数据,服务端就怎么也收不到了。

服务端的程序应该没有问题,请问我是不是关闭客户端的socket时用的函数不对?请大家帮帮忙,万分感谢
离线yb824
只看该作者 1楼 发表于: 2009-11-19
可以先一下tcpSocket 的state
离线iamyu10
只看该作者 2楼 发表于: 2009-11-19
引用第1楼yb824于2009-11-19 12:58发表的  :
可以先一下tcpSocket 的state


刚刚在tcpSocket->connectToHost前加了state, 在ip正确时,state返回0, 改成错误ip后返回2, 之后再改回正确的ip后也一直都是2..
离线iamyu10
只看该作者 3楼 发表于: 2009-11-19
代码如下:
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent), ui(new Ui::Dialog)
{
    ui->setupUi(this);
    tcpSocket = new QTcpSocket( this );
    ui->lineEdit->setText("192.168.244.66");
    connect( tcpSocket, SIGNAL(error(int)), this, SLOT(errMsg(int)) );
    connect( ui->pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked(bool)) );
    connect( tcpSocket, SIGNAL(readyRead()), this, SLOT(recvMsg()) );

}

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

void Dialog::on_pushButton_clicked(bool checked)
{
        int s;
        s = tcpSocket->state();
        qWarning("state is %d", s);

        tcpSocket->connectToHost(QHostAddress(ui->lineEdit->text()), 2010);
        QTextStream out(tcpSocket);
        out << ui->lineEdit_3->text()<< endl;
}
void Dialog::recvMsg()
{
    QString res;

    res += tcpSocket->readAll();
    ui->textEdit->setText(res);
    ui->textEdit->moveCursor(QTextCursor::End);

   /* 用了下面这三个函数都不行 */
    tcpSocket->disconnectFromHost();
    tcpSocket->close();
    tcpSocket->abort();
}

void Dialog::errMsg( int errNo )
{
   ui->textEdit->setText( "this is err!!!!" );
}
离线yb824
只看该作者 4楼 发表于: 2009-11-19
tcpSocket->disconnectFromHost();加上这句应该是行的
离线iamyu10
只看该作者 5楼 发表于: 2009-11-19
引用第4楼yb824于2009-11-19 15:00发表的  :
tcpSocket->disconnectFromHost();加上这句应该是行的


不行的。。

我知道问题的原因了,正常的流程是:connectToHost之后,tcpSocket的状态变为2( socket开始建立连接.)
在tcpSocket发送readyRead信号之后, tcpSocket的状态才变为3( 连接建立成功 )

然后开始接收数据,

接收完后数据后tcpSocket->disconnectFromHost();

至此tcpSocket的状态又恢复为0 ( 未连接 )

------------------------------------------------------------------------------------------------------------------------

而当我将IP改为一个不存在的IP后, connectToHost之后,tcpSocket的状态变为2( socket开始建立连接.)

而此时因ip是错误的,没有数据可读,因此不会发送readyRead信号,tcpSocket的状态也就一直保持为2,

当下次再改为正确的IP后,connnectToHost时一看tcpSocket状态是2,结果就报错了。。

-------------------------------------------------------------------------------------------------------------------------

但现在的问题是,无论IP是否正确,connectToHost之后都返回状态为2, 那么怎样判断是否找到了主机呢?如果说能从
这里判断ip是错误的,我就可以直接设置tcpSocket的state为0,也就不影响下一次的调用了。。。
离线yb824
只看该作者 6楼 发表于: 2009-11-19
每次connect之前判断state是否为0,不为0,就disconnect一次,然后在connect
离线iamyu10
只看该作者 7楼 发表于: 2009-11-19
问题解决了,connectToHost之后 if (!tcpSocket->waitForConnected(2))判断一下即可
快速回复
限100 字节
 
上一个 下一个