이번에 개발한 프로그램이 서비스로 동작해야되는 상황이와서 검색하다보니 이미 잘 구현해놓은게 있어서 갖다쓰니 되었다.
1.예제로 쓸 프로그램을 준비한다.즉 서비스로 돌릴 프로그램이 있어야한다.
-멀티쓰레드기반의 파일 전송서버를 예로 들겠다.
2.서비스클래스를 원래의 프로그램에 추가한다.
서비스 모듈인 Service.cpp와 Servie.h라는 파일을 추가한다.
3.코딩은 생각보다 아주 간단하다.
/*
원프로그램 제작자
(Author :- Nish [BusterBoy] EMail :- nishinapp@yahoo.com)
서비스프로그램화 : 자작
*/
#include "stdafx.h"
#include "MTServer.h"
#include <tchar.h>
#include "Service.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CWinApp theApp;
SOCKET server;
using namespace std;
UINT MTServerThread(LPVOID pParam);
UINT ClientThread(LPVOID pParam);
BOOL ParseCmd(char *str, CString& cmd, CString& params);
BOOL SendFile(SOCKET s, CString fname);
class CUpdateService: public CService
{
public:
VOID Main(void)
{
CService::Begin(_T("UpdateServer"));//내부에서 OnStarted호출
CService::End(); //내부에서 OnStopped호출
}
protected:
void OnStarted()//서비스 시작시 동작할 쓰레드나 타이머
{
AfxBeginThread(MTServerThread,0);
}
void OnStopped()//서비스가 멈추었을 때 해제코드
{
closesocket(server);
WSACleanup();
}
};
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
//원 소스에서 주석처리한 부분
/*int nRetCode = 0;
cout << "Press ESCAPE to terminate program\r\n";
AfxBeginThread(MTServerThread,0);
while(_getch()!=27);
closesocket(server);
WSACleanup();
return nRetCode;*/
CUpdateService upServ;
if(argc == 2)
{
if(_tcscmp(argv[1],_T("-i")) == 0)//서비스 설치
{
upServ.Install(_T("UpdateServer"));
}
else if(_tcscmp(argv[1],_T("-u")) == 0) //서비스 제거
{
upServ.Uninstall(_T("UpdateServer"));
}
return TRUE;
}
upServ.Main();
return TRUE;
}
UINT MTServerThread(LPVOID pParam)
{
.....중략 //파일을 다운받아서 보자.서비스와 관련하여 그렇게 중요한 내용이 없다.
}
4.서비스 프로그램 설치
(1)빌드를 하면 실행파일이 만들어지는데,위의 예제에서는 서비스이름이 UpdateServer니까
폴더도 UpdateServer로 만들고 거기에다가 실행파일을 두자.
만약에 환경설정파일(INI파일,이미지등등이 필요하다면 여기에 다 담아야한다.)
그리고 이 폴더 내에는 텍스트파일을 열어 확장자만 바꾼 install.bat과 uninstall.bat을 준비한다.
위 프로젝트의 실행파일은 MTServer로 되어 있다.(물론 프로젝트 설정으로 바꿀 수 있다.)
install.bat이라는 파일은 MTServer.exe -i 라고 적고(설치배치파일)
uninstall.bat에는 MTServer -u 라고 적는다.(제거배치파일)
(2)이렇게 만들어진 UpdateServer폴더를 Windows 혹은 WINNT 아래에 있는 System32폴더에 복사해 넣자.
주의:다른 폴더에 두어도 상관없지만,다른 폴더에 두는 경우에 환경설정파일이나 이미지파일은 절대경로로 설정하는 것이 좋다.
본인이 경험한 결과 서비스프로그램의 상대경로의 시작지점이 System32이라는 것을 알게되었다.
(3)이제 install.bat을 누르면 서비스가 등록된다.
(4)시작을 하려면 제어판 -관리도구 -서비스 로 들어가면 반갑게 UpdateServer라는 서비스가 만들어져 있을 것이다.
(5)서비스를 시작한다.제대로 프로그레스바가 진행되고 시작하면 제대로 된 것이다.
5.테스트
(1)텔넷으로 서버에 접속해보자.
실행에서 다음과 같이 입력하고 엔터클릭
telnet 127.0.0.1 20248
(2)서버접속 메시지 수신으로 서비스가 정상적으로 동작한다는 것을 알 수 있다.
참조 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=bmk5133&logNo=80090120069
'Basic Programming > C, C++' 카테고리의 다른 글
C/C++ - 윈도우즈 화면 잠금 여부 구하기/스크린 세이버 실행 여부 구하기 (0) | 2022.02.09 |
---|---|
C++ - Precise Sleep (0) | 2021.12.13 |
C++ - 난수 생성하기 (rand()를 사용하지 않기) (0) | 2020.10.14 |
C++ - MMF(Memory Mapping File) (0) | 2020.05.21 |
C++ - 60fps로 동작하게 하는 코드 (0) | 2020.03.11 |