728x90

이번에 개발한 프로그램이 서비스로 동작해야되는 상황이와서 검색하다보니 이미 잘 구현해놓은게 있어서 갖다쓰니 되었다.

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)서버접속 메시지 수신으로 서비스가 정상적으로 동작한다는 것을 알 수 있다.

 

ServiceSample.zip
0.02MB

 

참조 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=bmk5133&logNo=80090120069

 

C++ 서비스 프로그램 제작

1.예제로 쓸 프로그램을 준비한다.즉 서비스로 돌릴 프로그램이 있어야한다. -멀티쓰레드기반의 파일 전송...

blog.naver.com

 

728x90

+ Recent posts