Пример #1
0
DWORD WINAPI InspectionManager(LPVOID lpParameter)
{
	HANDLE hEvent = CreateEvent(
		NULL,
		FALSE,
		FALSE,
		EVENT_NAME
		);
	ThreadObject* tpThreads[DRIVES];
	for (int iIndex = 0; iIndex < DRIVES; iIndex++)
		tpThreads[iIndex] = NULL;
	DetectAlreadyConnectedDevices(tpThreads);
	try
	{
		int iOptionValue = 1;
		SocketObject* spSocketServer = new SocketObject();
		spSocketServer->SetSockOpt(SOL_SOCKET, SO_REUSEADDR, (char*)&iOptionValue, sizeof(iOptionValue));
		spSocketServer->Bind(IP, PORT);
		spSocketServer->Listen(BACKLOG);
		SetEvent(hEvent);
		SocketObject* spSocketClient = spSocketServer->Accept();

		char szData[BUFFER];
		bool bRunning = true;
		while (bRunning)
		{
			int iLength = spSocketClient->Recv(szData, BUFFER);
			szData[iLength] = '\0';
			if (strstr(szData, IN_DRIVE) != NULL)
			{				
				char cDrive = szData[strlen(IN_DRIVE)];
				int iIndex = cDrive - 'A';
				printf("%c:\\ will be watched\n", cDrive);
				tpThreads[iIndex] = new ThreadObject(Inspection, (LPVOID)cDrive);
				tpThreads[iIndex]->Start();
			}
			else if (strstr(szData, OUT_DRIVE) != NULL)
			{
				char cDrive = szData[strlen(OUT_DRIVE)];
				int iIndex = cDrive - 'A';
				/*
				If the drive is already being watched
				by the ReadDirectoryChangesW function
				than stop watching it.
				*/
				if (tpThreads[iIndex] != NULL)
				{
					printf("%c:\\ will no longer be watched\n", cDrive);
					tpThreads[iIndex]->Kill();
					delete tpThreads[iIndex];
					tpThreads[iIndex] = NULL;
				}
			}
			else
			{
				spSocketClient->Close();
				bRunning = false;
			}
		}
	}
	catch (SocketError& socketError)
	{
		printf("Main [%d] %s", socketError.GetErrorCode(), socketError.ErrorFormat());
	}
	return 0;
}