【问题标题】:C++ Socket disconnects intermittentlyC++ Socket 断断续续
【发布时间】:2012-10-25 04:07:53
【问题描述】:

我是套接字编程的新手,我们有一个通过网络运行的 MFC 客户端应用程序,它的套接字由于某种原因每天至少断断续续地断开一次。这不是网络问题,因为其他网络应用程序运行良好。然而,我注意到日志中的一些内容,在套接字断开连接之前或多或少 10 分钟发生了数据库错误。类似的东西:

DB ERROR: ADO Error 1 (s)
select l.LABOID, l.LABOCODE, l.LABOCREDATE, l.LABOTEXT, l.SHORTTEXT,     l.LISACCOUNTINGMODE, l.ADDRESS1, l.ADDRESS2, l.POSTALCODE, l.CITY, l.STATE, l.COUNTRY, the  . TELEPHON, l.FAX, l.EMAIL, l.TELEPHON2, l.NATIONALCODE, l.FIRSTITEMID, l.ALTERNATECODE, l.LABOSERVICEID, l.STARTVALIDDATE, l.ENDVALIDDATE, l.LOGUSERID, l.LOGDATE, b.DICBINARYID , b.OBJECTLINK, b.OBJECTTYPE, b.DICBINARYTYPE, b.BINARYDATE, b.BINARYMIMETYPE, b.BINARYSIZE, b.LOGUSERID, b.LOGDATE, b.BINARYOBJECT, (select count (*) from d DICT_LABO_TO_DEVICE Where l.LABOID = d.LABOID) as NB_DEVICES from DICT_LABORATORIES l, b DICT_BINARY_DATA Where l.ENDVALIDDATE is null and l.LABOCODE like '%%' and l.LABOID b.OBJECTLINK = (+) and b.DICBINARYTYPE (+) = 1 and b . OBJECTTYPE (+) = 7 AND LABOID IN (1) order by l.LABOCODE

ORA-00936: missing expression of
Error: 0x80040e14

在调试模式下,我发现线程仍在运行但未连接套接字。我无法确定是什么导致它断开连接。 是否建议重新连接? 这是代码块:

if (m_pClientSocket->IsThreadStillRunning())
  {
    if(m_pClientSocket->m_boSocketConnected)
    {
      dwNbSent_L = *pdwBufferSize_P;        
      m_pClientSocket->Write(pbyBuffer_P, *pdwBufferSize_P);
      iotResult_L = IOTRANS_RESULT_SUCCESS;
    }
    else
    {
      m_pobjSession->Write(MSG_ERROR,TRACE_LOW
                          ,_T("%s Client socket is not connected")
                          ,(LPCTSTR)m_strLastErrFunc);
      iotResult_L = IOTRANS_RESULT_FAILED;
      SetError(ERROR_SOCKET_NOT_CONNECTED, _T("Client socket is not connected"), m_strLastErrFunc);
    }
  }

谁能给我一个快速启动或检查项目列表以防止这种情况发生?

【问题讨论】:

  • 你连接到什么?网络连接是否断开?客户端是否断开连接?我们没有所需的信息来帮助解决这个问题。
  • 网络连接没有问题,但客户端收到此错误后断开连接。
  • 我大胆猜测一下,发现数据库错误的错误处理代码然后决定关闭连接。

标签: c++ sockets mfc tcpclient disconnect


【解决方案1】:

这很可能不是网络错误。

Oracle DB 无法解析 SQL 语句(导致错误 ORA-00938),顶部的 ADO 层将 Oracle 错误转换为 ADO 错误 0x80040e14,这仅表示'命令包含一个或多个错误。'。

这预计会在您的应用程序中产生错误。

你可以做的是:

  • 检查(调试)您的应用程序,了解它如何创建其 SQL 语句。
  • 检查您的数据库,是否应用了一些应用程序不知道的更改(删除的表/视图或重命名/删除的列)。

【讨论】: