Qt QTcpServer怎么处理客户端断开的消息

作者&投稿:侨廖 (若有异议请与网页底部的电邮联系)
如何断开QTcpSocket的问题~

代码如下:
#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 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!!!!" );
}

QTcpSocket * QTcpServer::nextPendingConnection ()
QHostAddress QAbstractSocket::peerAddress ()

socket底层一个连接从断开、释放相关资源、……、准备好建立新连接需要一段时间
所以你除了要设置
setsockopt(s,SOL_SOCKET,((int)(SO_REUSEADDR)),(const char *)&val,4);
以外,
估计需要多准备几个socket备用了。
搜“连接池”。


和布克赛尔蒙古自治县15396536349: QT QTcpServer类到底怎么用? -
桂从脑蛋: 使用tcpserver一般都要继承之后添加一个事件处理slot.明显的当新连接到达时,newConnection是会被emit的,然后使用QTcpServer::nextPendingConnection获得一个可用的tcpsocket对象实例.如果你需要将此实例用于另外的线程中,需要传...

和布克赛尔蒙古自治县15396536349: qt中如何实现多线程? -
桂从脑蛋: 你需要加深对网络编程基本概念的理解.首先server端用于监听的是一个socket,每次有传入连接,就会有一个新的socket描述符产生,与客户端交互就是通过这个socket描述符.如果使用 QTcpServer,你应该重写 incomingConnection() 函数,该函数可以拿到 socket 描述符,然后你使用自定义事件将这个socket描述符传递给一个线程,在这个线程中使用这个socket描述符来与客户端通信.这就是“通知+多线程”的服务器编程模型,Qt 中天生支持这种模型,很容易实现.

和布克赛尔蒙古自治县15396536349: qt头文件QTcpServer 和qtcpserver.h区别 -
桂从脑蛋: 你打开QTcpServer文件 会发现里面是只有一句 #include “qtcpserver.h”

和布克赛尔蒙古自治县15396536349: Qt网络编程怎么设定超时 -
桂从脑蛋: 先做一个QTcpServer作为监听socket,监听后如果出发newConnection信号,说明有连接进来. 然后通过nextPendingConnection()可以得到一个QTcpSocket,这就是用来和客户端进行通信用的套接字. 监听socket仍然可以继续监听.QTcpSocket可以用来和客...

和布克赛尔蒙古自治县15396536349: QT编程问题 -
桂从脑蛋: 原因应该是:你在使用 extern myfunc func;之前myfunc还没定义,假设myfunc类定义在myfunc.h中,那么这么写:#include "myfunc.h" extren myfunc func; 或者:class myfunc;extren myfunc func;......#include "myfunc.h" 这是C++的问题,不是Qt的问题,你这样写在哪个C++框架或编译器上都通不过

和布克赛尔蒙古自治县15396536349: qt 如何把qsplitter 添加到主窗口 -
桂从脑蛋: 两种方法:1.在QSplitter创建实例的时候,构造函数传递主窗口的参数. 2.使用QLayout子类管理窗口 1例:QSplitter *mysp = new QSplitter(this);//this指针是主窗口 2例:QGridLayout *mainly = new QGridLayout;//也可以使用水平对齐或垂直对齐 mainly->add(mysp,0,0); this->setLayout(mysp);

和布克赛尔蒙古自治县15396536349: QT被封了怎么办 -
桂从脑蛋: QT被封了解决方法:一、操作人分类1.平台封禁为了维护QT语音健康的使用环境,QT会将严重违反各类管理条例的用户进行不同程度的封禁处理;2.房间封禁房间管理员有权使用QT语音提供的功能对房间内用户进行不同程度的封禁,此...

和布克赛尔蒙古自治县15396536349: Qt怎样让ui子窗口随程序中主窗口的大小一起变化解决办法 -
桂从脑蛋: 重写主窗口的resizeEvent()函数

和布克赛尔蒙古自治县15396536349: 如何解决Qt程序在其他电脑上无法运行的问题 -
桂从脑蛋: 1、新建一个VisualC++的“Win32项目”,建立一个空项目.2、建立完成后,右键点击右边的“解决方案”中的“源文件”.3、选择“添加”,然后添加“新建项”.4、选择“VisualC++”中的C++文件,点“添加”.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网