-1

我想寻求帮助,因为我不知道该怎么办了。我有一个用 c++ 创建的模拟器,它接受来自用户的 id 输入并检查它是否在仅在本地主机中的数据库中(在 mysql 工作台中创建)。

sqlQuery = "SELECT staffaccess.card_number FROM proxycardsim.staffaccess WHERE staffaccess.card_number = " 
            + inputID;

if(mysql_ping(theInstance.connects))
{

}

int queryState = mysql_query(theInstance.connects, sqlQuery);
resultSet = mysql_store_result(theInstance.connects);
rowNum = mysql_num_rows(theInstance.resultSet);

if (rowNum == NULL)                     
{                                       
    mysql_free_result(theInstance.resultSet);
    return false;
}
else
{
    mysql_free_result(theInstance.resultSet);
    return true;
}

问题是模拟器连接到另一台用作服务器的计算机(通过winsock连接)。如果服务器启动,它可以正常工作或者如果所有输入都错误,但是如果服务器关闭(我的代码将尝试再次连接到服务器 pc,所以我必须调用 WSACleanup)在输入一个正确的值并输入后另一个 mysql_query 返回 mysql 服务器已消失的错误。然后程序会在转到 mysql_num_rows 时中断。

我在另一个函数中有这段代码,当我将它们一个一个注释掉时,我发现错误是由于 WSACleanup() 引起的。如果 WSACleanup 行不存在,我的查询运行正常。

    if ( false == theInstance.compareID(m_IDEntry))
{
    addData(ConsoleLog,rec,0,0);
}
else
{
    // Send an initial buffer
    iResult = send( connectSocket, sendBuf, (int)strlen(sendBuf), 0 );
    if(false == theInstance.addToLog(m_IDEntry))
    {
        addData(ConsoleLog,rec,0,3);
    }

    if (iResult == SOCKET_ERROR) {
        closesocket(connectSocket);
        WSACleanup();
        serverConnect();
        iResult = send( connectSocket, sendBuf, (int)strlen(sendBuf), 0 );
    }

    if (iResult != SOCKET_ERROR) {
        addData(ConsoleLog,rec,0,1);
    }

    iResultRcv = recv(connectSocket, recvbuf, recvbuflen, 0);
    if ( iResultRcv <= 0 ) 
    {
       addData(ConsoleLog,rec,0,7);
    }

}

我希望有人可以帮助我。

4

1 回答 1

1

不要调用 WSACleanup。WSACleanup 旨在在您不再希望进行任何套接字通信时使用。对你来说不是这样。

于 2013-09-03T06:00:05.353 回答