#include "stdafx.h"
#include "commfunc.h"
#include "datatype.h"
BOOL init_socket(void)
{
// TODO: 在此添加实现代码
WSADATA wsd;
WORD wVersion=MAKEWORD(1,1);
if(WSAStartup(wVersion,&wsd))
{
::MessageBox(NULL,"SOCKET初始化失败!!!","WARING",MB_OK);
WSACleanup();
return S_FALSE;
}
if((LOBYTE(wsd.wVersion)!=1)||(HIBYTE(wsd.wVersion)!=1))
{
::MessageBox(NULL,"SOCKET初始化失败!!!","WARING",MB_OK);
WSACleanup();
return S_FALSE;
}
return S_OK;
}
int CombinationPacket(int nType,
char *strSql,
CString strDbName,
CString strDbIp,
char *lpPacket)
{
/**************************************************/
DATAPACKET *pDataPacket = (DATAPACKET*)lpPacket;
REPORTINFOHEADER * pReportInfoHeader = NULL;
int len = 0;
if(strSql)
len = sizeof(DATAPACKET) +
sizeof(REPORTINFOHEADER) + strlen(strSql);
else
len = sizeof(DATAPACKET) +
sizeof(REPORTINFOHEADER);
pReportInfoHeader =
(REPORTINFOHEADER*)(lpPacket + sizeof(DATAPACKET));
memset(pDataPacket, 0, sizeof(DATAPACKET));
memset(pReportInfoHeader, 0, sizeof(REPORTINFOHEADER));
pDataPacket->FlowDir = 1;
pDataPacket->lTotalLength = len;
pDataPacket->MgmtCmdPrimary = 1000;
pDataPacket->MgmtCmdSecondary = 1001;
pDataPacket->MgmtType = nType;
pDataPacket->Src = 2008;
pDataPacket->SysType = 500;
pDataPacket->Tos = 1;
pDataPacket->Version = 500;
pReportInfoHeader->lPolicyID = 0;
strcpy((char*)pReportInfoHeader->szcomUserName ,
"administrator");
strcpy((char*)pReportInfoHeader->szHostID ,
strDbName.GetBuffer(strDbName.GetLength()));
strcpy((char*)pReportInfoHeader->szigsUserName ,
"jiangxian");
strcpy((char*)pReportInfoHeader->szIPAddr ,
strDbIp.GetBuffer(strDbIp.GetLength()));
GetLocalTime(&pReportInfoHeader->Time);
if(strSql == NULL)
{
}
else
{
memcpy(lpPacket + sizeof(DATAPACKET) +
sizeof(REPORTINFOHEADER),
strSql,
strlen(strSql));
}
/****************************************************/
return len;
}
void FunAnalyzeColumn(CString szColumn,
CString *szArrCol,
CString* szArrType,
int &nSize)
{
int nStart = 0, nEnd = 0;
nSize = 0;
nStart = szColumn.Find('(', nStart);
while(true)
{
nEnd = szColumn.Find(",", nStart);
if(nEnd < 0)
break;
CString strTemp = szColumn.Mid(nStart + 1, nEnd - nStart - 1);
nStart = nEnd+1;
int nTStart = strTemp.Find(" ");
CString strType = strTemp.Mid(0, nTStart);
CString strName = strTemp.Mid(nTStart+1, strTemp.GetLength() - nTStart - 1);
szArrType[nSize] = strType;
szArrCol[nSize] = strName;
nSize++;
}
nEnd = szColumn.Find(")", nStart);
CString strTemp = szColumn.Mid(nStart+1, nEnd - nStart -1);
int nTStart = strTemp.Find(" ");
CString strType = strTemp.Mid(0, nTStart);
CString strName = strTemp.Mid(nTStart+1, strTemp.GetLength() - nTStart -1);
szArrType[nSize] = strType;
szArrCol[nSize] = strName;
nSize++;
}
int GetRecord(SOCKET socket,
char *szOpenSql,
char *szTableName,
CString strDbName,
CString strDbIp,
int nField,
int& nLimit,
CString *strFieldType,
CString *strFieldName,
map<CString, void*>&mapField,
map<CString, int>&mapFieldType,
int &nRowId
)
{
char szRecv[256];//分配内存后需要释放CREATE_SUSPENDED
int nRecv = 0;
char szRecvHead[12] = {0};
char szSql[128] = {0};
char lpPacket[4096] = {0};
if(strlen(szOpenSql) == 0)
{
sprintf(szSql, "select * from '%s' limit %d, 1", szTableName, nLimit);
}
else
{
sprintf(szSql, "%s limit %d, 1", szOpenSql, nLimit);
}
int len = CombinationPacket(1, szSql, strDbName, strDbIp, lpPacket);
send(socket, lpPacket, len, 0);
Sleep(10);
if((nRecv = recv(socket, szRecvHead, sizeof(RETDATAPACKET), 0)) > 0 )
{
if(nRecv != sizeof(RETDATAPACKET))
{
DWORD nErr = WSAGetLastError();
return nErr;
}
RETDATAPACKET *pHeader = (RETDATAPACKET*)szRecvHead;
if(pHeader->Type == 99)
{
return -1;
}
int nData = pHeader->lTotalLength - sizeof(RETDATAPACKET);
if(nData > 0)
{
//接收实际返回的数据
nRecv = recv(socket, szRecv, nData, 0);
//对接收到的数据进行解析
int nPos = 0;
nRowId = atoi(szRecv);
nPos += (strlen(szRecv) + 1);
for(int i = 0; i < nField; i++)
{
if(strFieldType[i] == "int")
{
int len = 0;
len = strlen(szRecv + nPos);
int *pTemp = (int*)mapField[strFieldName[i]];
if(pTemp)
*pTemp = atoi(szRecv + nPos);
nPos += (len + 1);
}
else if(strFieldType[i] == "text" && mapFieldType[strFieldName[i]] != 3)
{
CString *strTemp;
strTemp = (CString*)mapField[strFieldName[i]];
*strTemp = szRecv + nPos;
nPos += (strlen(szRecv + nPos) + 1);
}
else if(strFieldType[i] == "time" || mapFieldType[strFieldName[i]] == 3)
{
int nYear = 0;
int nMonth = 0;
int nDay = 0;
int nHour = 0;
int nMinute = 0;
int nSecond = 0;
int nPrevPos = 0;
int nNextPos = 0;
CString strTemp = szRecv + nPos;
CString strFindTemp = "";
nNextPos = strTemp.Find("-", nPrevPos);
if(nNextPos != -1)
{
{
strFindTemp = strTemp.Mid(nPrevPos, nNextPos - nPrevPos);
nYear = atoi(strFindTemp.GetBuffer(strFindTemp.GetLength()));
nPrevPos = nNextPos + 1;
}
nNextPos = strTemp.Find("-", nPrevPos);
if(nNextPos != -1)
{
{
strFindTemp = strTemp.Mid(nPrevPos, nNextPos - nPrevPos);
nMonth = atoi(strFindTemp.GetBuffer(strFindTemp.GetLength()));
nPrevPos = nNextPos + 1;
}
nNextPos = strTemp.Find(" ", nPrevPos);
if(nNextPos != -1)
{
{
strFindTemp = strTemp.Mid(nPrevPos, nNextPos - nPrevPos);
nDay = atoi(strFindTemp.GetBuffer(strFindTemp.GetLength()));
nPrevPos = nNextPos + 1;
}
nNextPos = strTemp.Find(":", nPrevPos);
if(nNextPos != -1)
{
{
strFindTemp = strTemp.Mid(nPrevPos, nNextPos - nPrevPos);
nHour = atoi(strFindTemp.GetBuffer(strFindTemp.GetLength()));
nPrevPos = nNextPos + 1;
}
nNextPos = strTemp.Find(":", nPrevPos);
if(nNextPos != -1)
{
strFindTemp = strTemp.Mid(nPrevPos, nNextPos - nPrevPos);
nMinute = atoi(strFindTemp.GetBuffer(strFindTemp.GetLength()));
nPrevPos = nNextPos + 1;
strFindTemp = strTemp.Mid(nPrevPos, strTemp.GetLength() - nPrevPos);
nSecond = atoi(strFindTemp.GetBuffer(strFindTemp.GetLength()));
}
}
}
}
}
CTime *timeTemp;
timeTemp = (CTime*)mapField[strFieldName[i]];
if(nYear > 0)
{
*timeTemp = CTime(nYear, nMonth, nDay, nHour, nMinute, nSecond);
}
nPos += (strlen(szRecv + nPos) + 1);
}
}
}
}
return 0;
}
int GetRecordNext(SOCKET socket,
char *szOpenSql,
char *szTableName,
CString strDbName,
CString strDbIp,
int nField,
int& nLimit,
CString *strFieldType,
CString *strFieldName,
map<CString, void*>&mapField,
map<CString, int>&mapFieldType,
int &nRowId
)
{
char szRecv[256];//分配内存后需要释放CREATE_SUSPENDED
int nRecv = 0;
char szRecvHead[12] = {0};
char szSql[128] = {0};
char lpPacket[4096] = {0};
if(strlen(szOpenSql) == 0)
{
sprintf(szSql, "select * from '%s' limit %d, 1", szTableName, nLimit);
}
else
{
sprintf(szSql, "%s limit %d, 1", szOpenSql, nLimit);
}
int len = CombinationPacket(12, szSql, strDbName, strDbIp, lpPacket);
send(socket, lpPacket, len, 0);
Sleep(10);
if((nRecv = recv(socket, szRecvHead