📄 back.cpp
字号:
// back.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <winsock2.h>
#include <Windows.h>
#include <stdio.h>
#include "mysql.h"
#include "fstream.h"
HANDLE db_Wevent; //写数据库信号量
struct CONTROL_INFO
{
int iDirection;
int iStartNo;
int iTransferForm;
int iReturn;
int iRecordcount;
char cFilename[30];
char cSqlstate[300];
};
struct TRANSFER_DATA
{
char cMsg[15][300];
};
DWORD WINAPI ServerWorkerThread(LPVOID pParam);
int main(int argc, char* argv[])
{
SOCKET m_ListenSocket;
db_Wevent=CreateEvent(NULL,true,true,NULL); //初始化时能写
WSADATA wsaData;
SOCKADDR_IN InternetAddr;
int Ret;
if ((Ret = WSAStartup(0x0202,&wsaData)) != 0)
{
printf("WSAStartup failed with error %d\n", Ret);
WSACleanup();
}
if ((m_ListenSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
printf("Failed to get a socket %d\n", WSAGetLastError());
}
InternetAddr.sin_family = AF_INET;
InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
InternetAddr.sin_port = htons(5100);
if (bind(m_ListenSocket, (PSOCKADDR) &InternetAddr, sizeof(InternetAddr)) == SOCKET_ERROR)
{
printf("bind() failed with error %d\n", WSAGetLastError());
}
if (listen(m_ListenSocket, 5))
{
printf("listen() failed with error %d\n", WSAGetLastError());
}
if (CreateThread(NULL, 0, ServerWorkerThread, &m_ListenSocket, 0, 0) == NULL)
{
printf("CreateThread failed with error %d\n", GetLastError());
return 0;
}
while(true)
{
//使主线程不消失
Sleep(10000000);
}
return 0;
}
DWORD WINAPI ServerWorkerThread(LPVOID lpParam)
{
SOCKET *m_ListenSocket=(SOCKET *)lpParam;
SOCKET AcceptSocket;
MYSQL *db_handle,mysql;
MYSQL_RES *query_result;
MYSQL_ROW row;
int db_error;
int fieldcount;
fstream *file;
SYSTEMTIME sysTm;
int i,j,iStart;
AcceptSocket=accept(*m_ListenSocket,NULL,NULL);
if (CreateThread(NULL, 0, ServerWorkerThread, m_ListenSocket, 0, 0) == NULL)
{
printf("CreateThread failed with error %d\n", GetLastError());
return 0;
}
if(AcceptSocket==INVALID_SOCKET)
{
printf("INVALID_SOCKET");
return 0;
}
db_handle=new MYSQL;
mysql_init(&mysql);
db_handle=mysql_real_connect(&mysql,"localhost","root","","test",0,NULL,0);
CONTROL_INFO *controlinfo=new CONTROL_INFO;
TRANSFER_DATA *transferdata=new TRANSFER_DATA;
int iExit=0; //循环退出标志
while(!iExit)
{
recv(AcceptSocket, (char *)controlinfo, sizeof(*controlinfo), 0);
switch(controlinfo->iTransferForm)
{
case 0://将查询的结果数返回前台
WaitForMultipleObjects(1,&db_Wevent,false,INFINITE); //如果有写库操作,则不读
db_error=mysql_query(db_handle,controlinfo->cSqlstate);
if(db_error)
{
printf("query sql error");
controlinfo->iRecordcount=0;
fieldcount=0;
}
else
{
query_result=mysql_store_result(db_handle);
controlinfo->iRecordcount=mysql_num_rows(query_result);
fieldcount=mysql_field_count(db_handle);
}
//如果记录大于15,则将他们写入文件字符串AcceptSocket加上当前时间
if(controlinfo->iRecordcount<15)
controlinfo->iTransferForm=1;
else
{
controlinfo->iTransferForm=2;
::GetLocalTime(&sysTm);
sprintf(controlinfo->cFilename,"temp/%d%d%d%d%d%d%d%d%s",AcceptSocket,sysTm.wYear,sysTm.wMonth,sysTm.wDay,sysTm.wHour,sysTm.wMinute,sysTm.wSecond,sysTm.wMilliseconds,".txt");
file=new fstream;
file->open(controlinfo->cFilename,ios::in|ios::out);
char *cTemp=new char[300];
memset(cTemp,' ',300);
for(i=0;i<controlinfo->iRecordcount;i++) //将所有记录写入文件
{
file->seekg(i*300); //因为每条记录为300个字节
row=mysql_fetch_row(query_result);
iStart=0;
for(j=0;j<fieldcount;j++)
{
iStart += sprintf( cTemp + iStart, "%s$", row[j] );
}
file->write(cTemp,300);
file->flush();
}
delete cTemp;
}
send(AcceptSocket, (char *)controlinfo, sizeof(*controlinfo), 0);
break;
case 1://直接发送结果数据
for(i=0;i<controlinfo->iRecordcount;i++)
{
row=mysql_fetch_row(query_result);
iStart=0;
for(j=0;j<fieldcount;j++)
{
iStart += sprintf(transferdata->cMsg[i]+ iStart, "%s$", row[j] );
}
}
send(AcceptSocket, (char *)transferdata, sizeof(*transferdata), 0);
break;
case 2: //通过文件送结果
if(controlinfo->iStartNo>controlinfo->iRecordcount||controlinfo->iStartNo<0)
iExit=1;
else
{
if(controlinfo->iStartNo+15<=controlinfo->iRecordcount)j=controlinfo->iStartNo+15;
if(controlinfo->iStartNo+15>controlinfo->iRecordcount)j=controlinfo->iRecordcount;
for(iStart=0,i=controlinfo->iStartNo;i<j;i++)
{
file->seekg(i*300);
file->read(transferdata->cMsg[iStart],300);
++iStart;
}
send(AcceptSocket, (char *)transferdata, 4500, 0);
}
break;
case 3: //执行sql语句
WaitForMultipleObjects(1,&db_Wevent,false,INFINITE);
ResetEvent(db_Wevent);
db_error=mysql_query(db_handle,controlinfo->cSqlstate);
SetEvent(db_Wevent);
if(db_error)
{
controlinfo->iReturn=0;
printf("excute sql error");
}
else
controlinfo->iReturn=1;
send(AcceptSocket, (char *)controlinfo, sizeof(*controlinfo), 0);
break;
case 4:
iExit=1;
break;
}
}
if(lstrlen(controlinfo->cFilename)>0)
{
file->close();
delete file;
DeleteFile(controlinfo->cFilename);
}
if(controlinfo->iRecordcount>0)mysql_free_result(query_result);
delete controlinfo;
delete transferdata;
mysql_close(db_handle);
closesocket(AcceptSocket);
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -