-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 を呼び出す必要があります) 正しい値を 1 つ入力した後、別の mysql_query は、mysql サーバーがなくなったというエラーを返します。その後、プログラムは mysql_num_rows になると壊れます。

このコードは別の関数にあり、それらを 1 つずつコメントアウトすると、エラーは 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 に答える