在QTcpServer的服务器端出现:远程主机关闭连接

时间:2017-07-18 06:21:29

标签: c++ qt qtcpsocket qtcpserver

我有一个QTcpServer应用程序和QTcpClient应用程序。 See my screenshot. 当与服务器交互后的客户端与服务器断开连接时,在服务器端出现事件(在客户端套接字 - 插槽中):

with cte as 
 (
   select PersonID, ChangeId, ChangeDateTime, OldAddress,OldCity, NewAddress, NewCity
   from #temp as t1
   -- would be easier (ChangeId = 1) if the ChangeId was in chronological order
   where ChangeId = (select max(ChangeId) from #temp as t2 where t1.PersonID = t2.PersonID)

   union all

   select t1.PersonID, t1.ChangeId, t1.ChangeDateTime, t1.OldAddress,
     coalesce(t1.OldCity,cte.NewCity) , t1.NewAddress, 
     coalesce(t1.NewCity,cte.NewCity)
   from cte
   join #temp as t1 
     on t1.PersonID = cte.PersonID
    and t1.ChangeId = cte.ChangeId -1
 )
select PersonID, ChangeID, ChangeDateTime, 
   OldAddress + ', ' + OldCity as OldDetail, 
   NewAddress + ', ' + NewCity as NewDetail 
from cte
order by PersonID, changeid 

错误讯息:

  

远程主机关闭了连接。

之后出现一个事件:

void CMyClient::onSocketDisplayError(QAbstractSocket::SocketError socketError)
{
    QString sErr = m_pClientSocket->errorString();
    m_pWin->AddMessageFormClient("Was gotten some error! " + sErr);
}

生成void CMyClient::onSocketDisconnected() { m_pWin->AddMessageFormClient("Client is disconnected!"); m_pWin->UpdateDisconnectUI(); }

是服务器端的正确行为吗?

客户端断开连接的代码:

onSocketDisplayError

1 个答案:

答案 0 :(得分:1)

根据QAbstractSocket的文档,这是QTcpSocket背后的类,因此是您的客户端和服务器(强调我的):

  

要关闭套接字,请致电disconnectFromHost()QAbstractSocket 输入QAbstractSocket::ClosingState。将所有待处理数据写入套接字后,QAbstractSocket实际关闭套接字,输入QAbstractSocket::UnconnectedState发出disconnected() 。如果要立即中止连接,丢弃所有待处理数据,请改为呼叫abort()如果远程主机关闭了连接,QAbstractSocket将发出error(QAbstractSocket::RemoteHostClosedError) ,在此期间套接字状态仍为ConnectedState则为{{> 1}}将发出信号

因此我会说:

  • disconnected()是您应该用来关闭客户端或服务器的
  • 服务器发出错误指示远程主机关闭连接
  • 是正确的行为
相关问题