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

nnn1234567890 2014-04-02 02:20:40
用Qt 编写的程序,服务端允许最多五个客户端连接进来,如果其中有一个客户端断开,那么久释放它所占用的内存,以便下次新连接进来的客户端用,那么服务端应该怎么编写disconnected()槽函数,

这是有客户端连接进来时的代码
//服务器端创建套接字
void Server::screateServerSocket ()
{

int nConncetion = 0;
bool bsoketConnection=false;
for ( int i =0;i<MaxCnnection;i++)
{

if (bConnection[i] == true)
{
continue ;
}
else if (bConnection[i] == false)
{
nConncetion =i;
bsoketConnection= true;
break;
}

}

if (bsoketConnection == true)
{
ui.statuslabel->setText(tr("client connection"));
ui.serverSendpushButton->setEnabled (true);
//tcpServer->setMaxPendingConnections(5);
m_clientScoket[nConncetion] = tcpServer->nextPendingConnection();
bConnection[nConncetion] = true ;
connect(m_clientScoket[nConncetion],SIGNAL(disconnect()),this,SLOT(disConnectioned()));//我想知道这个槽函数应该怎么写,来判断是哪个客户端断开连接了,我好释放它
connect(m_clientScoket[nConncetion],SIGNAL(disconnect()),m_clientScoket[nConncetion],SLOT(deleteLater()));
connect(m_clientScoket[nConncetion],SIGNAL(readyRead()),this,SLOT(serverReadMessage()));
QString hostAddress=m_clientScoket[nConncetion]->QAbstractSocket::peerAddress().toString();
int hostPort=m_clientScoket[nConncetion]->QAbstractSocket::peerPort();
ui.servertextBrowser->insertPlainText(tr("hostAddress: %1 (%2)\n").arg(hostAddress).arg(hostPort));
}
else
{
QTcpSocket *clientScoket = tcpServer->nextPendingConnection();
clientScoket->close();
}

}
...全文
1216 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-05-19
  • 打赏
  • 举报
回复
我发的帖子对鼠标有一种神秘的磁力,很容易导致发帖人手滑而引用。
wain_ 2016-05-19
  • 打赏
  • 举报
回复
楼主这个问题解决了吗?现在我也遇到这个问题
feihuadao 2014-04-04
  • 打赏
  • 举报
回复
bConnection[i],这个数组感觉没必要。 m_clientScoket声明为QList或QVector,有socket进来就判断m_clientScoket.size() < 5; disConnectioned槽函数大概如下:

void server::disConnectioned
{
QTcpSocket * st= qobject_cast<QTcpSocket *>(sender());
for(int i= 0; i < m_clientScoket.size();i++)
{
if(st.socketDescriptor() == m_clientScoket[i].socketDescriptor()
   m_clientScoket.removeat(i);
}
}
如果m_clientScoket声明为map<int ,QTcpSocket *>可以省去遍历。
nnn1234567890 2014-04-02
  • 打赏
  • 举报
回复
引用 4 楼 max_min_ 的回复:
[quote=引用 3 楼 mujiok2003 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] socket底层一个连接从断开、释放相关资源、……、准备好建立新连接需要一段时间 所以你除了要设置 setsockopt(s,SOL_SOCKET,((int)(SO_REUSEADDR)),(const char *)&val,4); 以外, 估计需要多准备几个socket备用了。 搜“连接池”。
服务器断不需要端口复用, 除非另外一个进程也绑定了相同的端口。 [/quote] 埃,不应该@赵老师的 楼主 ,这个和平台关系不大,都是tcp协议的事情,在服务端设置下linger选项! 这里有2*MSL的时间等待。。[/quote] 说的太高端了,完全不懂,都没有听过这些专业的东西
max_min_ 2014-04-02
  • 打赏
  • 举报
回复
引用 3 楼 mujiok2003 的回复:
[quote=引用 2 楼 zhao4zhong1 的回复:] socket底层一个连接从断开、释放相关资源、……、准备好建立新连接需要一段时间 所以你除了要设置 setsockopt(s,SOL_SOCKET,((int)(SO_REUSEADDR)),(const char *)&val,4); 以外, 估计需要多准备几个socket备用了。 搜“连接池”。
服务器断不需要端口复用, 除非另外一个进程也绑定了相同的端口。 [/quote] 埃,不应该@赵老师的 楼主 ,这个和平台关系不大,都是tcp协议的事情,在服务端设置下linger选项! 这里有2*MSL的时间等待。。
mujiok2003 2014-04-02
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
socket底层一个连接从断开、释放相关资源、……、准备好建立新连接需要一段时间 所以你除了要设置 setsockopt(s,SOL_SOCKET,((int)(SO_REUSEADDR)),(const char *)&val,4); 以外, 估计需要多准备几个socket备用了。 搜“连接池”。
服务器断不需要端口复用, 除非另外一个进程也绑定了相同的端口。
赵4老师 2014-04-02
  • 打赏
  • 举报
回复
socket底层一个连接从断开、释放相关资源、……、准备好建立新连接需要一段时间 所以你除了要设置 setsockopt(s,SOL_SOCKET,((int)(SO_REUSEADDR)),(const char *)&val,4); 以外, 估计需要多准备几个socket备用了。 搜“连接池”。
nnn1234567890 2014-04-02
  • 打赏
  • 举报
回复
现在的情况是,我把5个连接都连上了之后就不能连接了,但是如果我断开其中一个,再连接就不能连不上了

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧