• 검색 결과가 없습니다.

네트워크 공유관리

N/A
N/A
Protected

Academic year: 2022

Share "네트워크 공유관리"

Copied!
4
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

J u m p U p

Jr.

43 2000.11

제는 어느 누구도 전세계의 사람과 자료를 주고받 는 것을 특별하다고 생각하지 않으며, 대화를 나 눈다거나 방명록에 글을 남기는 것이 신기하지 않은 아 주 자연스러운 일이 됐습니다. 그야말로 글로벌 네트워 크 시대가 도래한 것입니다. 하지만 글로벌 네트워크란 것은 이미 윈도우 95에서부터 지향하고 있었던 개념이 아닌가 싶습니다. 왜냐하면 그것은 누구든지 자신이 사 용하는 폴더를 네트워크에 연결된 다른 사람들과 공유하 고 있었기 때문입니다(그림 �). 아직도 윈도우의 공유 리소스 관리는 검색 기능이나 사용의 편리성 측면에서 많이 부족하지만 여기서 제공되는 기능을 사용하면 보다 쉽게 글로벌 네트워크 시대의 흐름에 합류할 수 있지 않 을까 싶습니다. 두 달간에 걸쳐 윈도우 공유 관리를 제어 하는 프로그램을 만들어 봄으로써 윈도우가 어떤 방법으 로 네트워크 공유를 관리하며, 이러한 기능을 어떻게 응 용하는지에 대해 함께 고민해 보도록 합시다.

네트워크 공유관리

윈도우가 네트워 크 공유 관리를 어

떻게 하고 있는지 살펴보는 가장 쉬운 방법은 직접 자신 의 폴더를 공유하는 것입니다. 우선 탐색기를 실행한 후

‘C:\Windows’에서 오른쪽 버튼을 눌러 공유를 선택합 니다. 그러면 그림 �와 같은 대화상자가 뜨는데, 이때 물 어보는 여러 가지 내용은 앞으로 살펴볼 공유 폴더 구조 체의 모든 변수로 채워지고 이 정보를 이용해 네트워크 공유를 관리하게 됩니다.

네트워크관리 ,

내맘대로

42

서우석 seaousak@hotmail.com

MFC 공모전에서 여러 차례 입상과 네트워크 검색엔진 프로그램인‘넷서치’개발, 영진출판사 프로그래밍 시삽 역임 등 다양한 경력의 소유자다. 현재는 4C소프트 연 구원과 개발자 천국 DevPia(www.devpia.com)의 C++ 시삽으로 분주한 나날을 보내고 있다.

W

윈도우/비주얼 C++

1회 2000.11 : 네트워크 관리, 내 맘대로 2회 : 유틸리티 제작의 마무리 요령 연 재 순 서

네트워크 공유 폴더

네트워크 공유 상자

(2)

네트워크 관리, 내 맘대로

44

J u m p U p

Jr.

공유리소스정보가져오기

우선 VC++을 실행한 후「File|New…|Win32 Console Application」을 선택하고 그림 �와 같이 Project name에

‘GetShare’라고 입력한 다음 확인 버튼을 누릅니다. 두 번 째는 그림 �과 같이‘A simple application’을 선택합니 다.

이렇게 만들어진 GetShare 프로젝트의 작업 공간을 보면 GetShare.cpp라는 파일이 새로 만든 프로젝트에 추가된 것 을 확인할 수 있습니다. 앞으로 우리는 이 파일을 수정해 예 제 프로그램을 만들어 보려고 합니다. 여기서 예제 프로그 램은 네트워크 공유 자원 리스트를 얻어오는 기능만 지원합 니다.

프로젝트의 강좌를 자세히 진행하기 앞서 여러분은 마소 홈페이지(http://maso.zdnet.co.kr)에서�이달의 디스켓’

으로 제공되는 파일을 다운로드 하기 바랍니다. 그런 다음 프로그램 소스를 살펴보고 직접 컴파일해 결과를 확인해 보 세요. 그래야만 우리가 공부할 소스에 대한 이해가 훨씬 빨 라집니다. <리스트 1>은 GetShare.cpp 파일에서 네트워크 공유 리스트를 얻기 위한 GetShare() 함수의 소스입니다.

W

윈도우/비주얼 C++

네트워크공유관련API

네트워크 공유 관리에 대한 소스는 이미 많은 곳에 공개돼 있습니다. 그 유명한(?) 백오피스 2000 소스에도 있으며, 플랫폼 SDK에서도 예제로 제공하고 있습니다. 이러한 예제 를 통해 네트워크 API(Application Programming Interfa ce)에는 어떤 것들이 있으며, 어떤 식으로 사용해야 하는지 에 대한 정보를 얻을 수 있습니다. 그림 �과 같은‘네트워 크 관리자’라는 프로그램을 자세히 살펴보면 실제로 윈도우 가 어떤 종류의 함수를 사용했는지 보다 명확하게 알 수 있 습니다(그림 �). 일반적으로 사용하는 네트워크 API는<표 1>과 같습니다.

이 함수들이 공통적으로 사용해 온 구조체는 아쉽게도 윈 도우 95/98 계열과 윈도우 NT/2000 계열에서 서로 다릅니

다(기존에 비해 윈도우 NT/2000에 추가된 대부분의 내용 은 보안과 연관되지만 네트워크 관련 함수뿐만 아니라 많은 부분에서 API가 서로 다릅니다). 하지만 함수의 구조나 사 용되는 변수의 의미가 달라져도 윈도우 NT/2000에서 사용 하는 구조체의 값이 좀더 많은 의미를 지니고 있을 뿐 근본 은 비슷하므로 프로그래밍하는 데에는 큰 영향을 받지 않습 니다. 여기서는 윈도우 98에 관련된 API 함수만 사용했습니 다. 공유 관련 구조체를 살펴보면 다음과 같습니다.

struct _share_info_50 {

char shi50_netname[LM20_NNLEN+1];

unsigned char shi50_type;

unsigned short shi50_flags;

char FAR * shi50_remark;

char FAR * shi50_path;

char shi50_rw_password[SHPWLEN+1];

char shi50_ro_password[SHPWLEN+1];

};

앞 구조체의 각 변수는 그림 �에 사용된 각각의 값들과 연관돼 있으며, 구체적인 의미는<표 2>에서 확인할 수 있습 니다. 그러면<표 1>에서 나열한 함수 중�NetShareEnum’

함수를 사용해 현재 내 컴퓨터에서 공유하는 폴더 정보를 얻 는 예제를 작성해 보겠습니다.

45 2000.11 네트워크 관리자를 실행한 모습

네트워크 관리자를 자세히 본 모습

프로젝트 선택 새로운 프로젝트 생성

<표 1> 네트워크 공유 관리에 쓰이는 API 함수

함수 이름 설명

NetShareAdd 특정 서버의 리소스(폴더나 프린터 등)를 공유 리스트에 추가 NetShareCheck 특정 서버의 장치 공유 여부를 검사

NetShareDel 특정 서버가 공유하는 리소스를 리스트에서 제거 NetShareEnum 특정 서버가 공유하는 리소스 리스트를 가져옴 NetShareGetInfo 특정 서버가 공유하는 리소스에 대한 정보를 가져옴 NetShareSetInfo 특정 서버가 공유하는 리소스에 대한 정보를 저장

<표 2> share_info_50 구조체의 변수 설명

변수 이름 설명

shi50_netname 공유한 리소스의 이름

shi50_type 공유한 리소스의 종류(예를 들어, 폴더나 프린터 등) shi50_flags 공유한 리소스에 대한 접근 권한

shi50_remark 공유한 리소스에 대한 설명 shi50_path 공유한 리소스의 실제 경로명 shi50_rw_password 읽기/쓰기 가능한 암호 shi50_ro_password 읽기 전용 암호

플랫폼 SDK의 네트워크 공유를 위한 소스는 다음 사이트 에서 받을 수 있습니다.

http://msdn.microsoft.com/downloads/sdks/platform/platform.asp

그리고 예제 프로그램의 위치는 다음과 같습니다(단, 윈도 우 NT 전용).

<Microsoft Platform SDK>\Samples\NetDS\WinNT\NetApi\NetShare

네트워크 관련 개발소스가 있는 곳

void ShareEnum() {

// *--- // * 전체 과정

// *--- // 1. 공유 자원 리스트의 크기 구하기 // 2. 공유 자원 리스트의 메모리 관리하기 // 3. 공유 자원 Enumerate 하기 // 4. 공유 자원 리스트를 메모리에서 해제하기

// ‘share_info_50’구조체가 공유 자원에 대한 // 모든 정보를 가지고 있습니다.

struct share_info_50 *BufPtr,*pShareInfo;

// 공유 자원 리스트를 관리하기 위한 변수를 // 선언하고 초기화합니다.

NET_API_STATUS res;

WORD er=0,tr=0,resume=0, i;

// 초기 메시지 변수 선언 및 출력 CString msg;

msg = “Share:\tLocal Path:\tUses:\t\tDescriptor:\n”;

RESULT_OUT(msg);

msg = “- ---\n”;

RESULT_OUT(msg);

// [과정 1] - 공유 자원 리스트의 크기 구하기 // 새로운 공유 자원을 얻습니다.

BufPtr = new struct share_info_50;

res = NetShareEnum (NULL, 50, (char FAR *)BufPtr, sizeof(struct share_info_50)*2, &er, &tr);

// 현재 네트워크 공유 자원이 존재하는가?

if(tr > 1) { delete BufPtr;

// 전체 공유 자원 리스트의 크기만큼 다시 메모리를 할당합니다.

BufPtr = new struct share_info_50[tr];

}

// [과정 2] - 공유 자원 리스트의 메모리 관리하기 // 새로운 크기로 공유 자원을 얻습니다.

res = NetShareEnum (NULL, 50, (char FAR *)BufPtr, sizeof(struct share_info_50)*2*tr, &er, &tr);

// 공유 자원을 얻는데 성공했는가?

if(res == ERROR_SUCCESS || res == ERROR_MORE_DATA) {

// 공유 자원의 임시 포인터를 얻습니다.

pShareInfo=BufPtr;

<리스트 1> GetShare 함수에 관련한 소스

(3)

무리할 수 있습니다. 여기서는 프로그램의 이름을 NetMana ger라 하고, 그 기능은<표 3>에 설명해 놓았습니다.

프로그램을 만들기 위한 접근 방식은 두 가지가 있습니다.

하나는 겉모습을 먼저 만들고 기능을 추가하는 방식이며, 또 는 필요한 기능을 먼저 구현하고 예제 프로그램을 만들어 본 후 전체적인 모습을 완성할 수도 있습니다. 이러한 방법은 프로그램에 대한 설계만 완벽하다면 모두 특별한 문제가 발 생하지 않지만 자칫 프로그래밍을 중도 포기하는 경우가 생 길 수 있습니다. 첫 번째 방법은 기능의 검증 없이 겉모습만 완성해 놓았기 때문에 아무리 잘 만들어졌더라도 기능의 여 러 가지 특성으로 인해 결국 많은 부분을 수정해야 하는 상 황에 놓일 수 있습니다. 하지만 완성될 프로그램의 모습을 보면서 프로그래밍하기 때문에 능률면에서는 오히려 효율적 이라고 볼 수도 있죠. 두 번째 방법은 첫 번째 방법과는 반대 의 장단점을 지니고 있는데, 필자는 기능에 필요한 예제를 많이 만들어본 다음 기능별로 코드를 나눈 후 프로그램을 완 성해 가는 방법을 주로 사용했습니다.

이번호에서는 <표 3>에서 나열한 기능을 구현할‘CNet Man’이라는 클래스 중에서 공유 리소스 추가 및 삭제 기 능, 그리고 공유 리스트 나열까지 알아보고 해당 기능을 테 스트하는 예제를 만들어 보겠습니다.

46

J u m p U p

Jr. W

윈도우/비주얼 C++ 네트워크 관리, 내 맘대로

앞으로 나올 소스의 이해를 돕기 위해<리스트 1>에서는 구조체의 값을 어떻게 얻어오고 사용하는지에 대해 중점적 으로 살펴보기를 권합니다. ‘struct share_info_50’이라는 구조체는 네트워크 공유에 대한 정보를 담고 있습니다. 1에 서 26번째 줄까지는 변수를 선언하거나 화면을 초기화하는 작업을 수행하며, 전체 과정에서는 별다른 의미가 없습니 다. 31에서 46번째 줄에서는 현재 내 컴퓨터가 가진 네트워 크 공유 리소스의 전체 크기를 구해 메모리로 읽어오는 과

정을 보여주고 있습니다.

이때 사용한 함수가 NetShareEnum()로 32번째 줄의 첫 번째 호출에서는 공유 리소스의 전체 크기를, 46번째 줄 의 두 번째 호출에서는 전체 크기만큼 리소스를 얻어오기 위해 쓰입니다. 이 방법은 일반적인 API 함수에 자주 사용 되므로 알아두면 상당히 유용합니다. 이렇게 NetShare Enum() 함수를 두 번에 걸쳐 호출해 네트워크 공유 리소스 를 얻어오는데 성공했다면 이제 남은 일은 얻어온 리소스를 차례대로 분석하는 것입니다. 이 과정이 57에서 87번째 줄 까지 나타나 있는데, 앞서 언급한 struct _share_info_50 구 조체의 변수를 비교하는 것을 제외하면 전체 과정은 특별한 작업을 수행하지 않습니다.

프로그램의 실행 결과는 그림 �로 현재 내 컴퓨터에서는

‘C:\CPoint’라는 폴더를‘읽기 전용’으로 공유하고 있음을 보여주고 있습니다.

<리스트 1>을 통해‘네트워크 공유 관리 프로그램을 어떤

식으로 만들면 되겠다’라는 감을 익혔죠. 지금부터는 이러 한 기본기를 바탕으로 유용한 유틸리티를 만들어 보기로 하 겠습니다.

프로그램기능설계

프로그램을 만들기로 맘을 먹었다면 가장 먼저 프로그램이 갖게 될 기능을 정의해 봐야 합니다. 그래야만 프로그램이 완성되는 단계에 뜻하지 않은 혼란을 겪지 않고 깔끔하게 마

47 2000.11

// [과정 3] - 공유 자원 Enumerate 하기 // 공유 자원 리스트 전체를 Enumerate 합니다.

for (i=0 ; i<er ; i++) {

// 공유 자원의 네트워크 이름을 얻습니다.

msg = pShareInfo->shi50_netname;

msg += “\t”;

// 공유 자원의 경로를 얻습니다.

msg += pShareInfo->shi50_path;

msg += “\t”;

// 공유 자원의 접근 권한을 얻습니다.

if(pShareInfo->shi50_flags & SHI50F_RDONLY) msg += “ReadOnly+\t”;

if(pShareInfo->shi50_flags & SHI50F_FULL) msg += “FullShare+\t”;

// 공유 자원의 타입을 얻습니다.

switch(pShareInfo->shi50_type) {

case STYPE_DISKTREE: msg += “Disk\t”; break;

case STYPE_PRINTQ: msg += “Printer\t”; break;

case STYPE_DEVICE: msg += “Device\t”; break;

case STYPE_IPC: msg += “IPC\t”; break;

default: msg += “Unknown Share Type\t”; break;

}

// 결과를 출력합니다.

msg += “\n”;

RESULT_OUT(msg);

// 다음 공유 자원을 얻습니다.

pShareInfo++;

} } else

RESULT_OUT(“Error:”);

// [과정 4] - 공유 자원 리스트를 메모리에서 해제하기 delete BufPtr;

return;

}

GetShare( ) 예제 프로그램 실행 화면

<표 3> NetManager의 기능

기능 설명

공유 리소스 추가/삭제 특정 공유 리소스를 추가하거나 삭제 접근 사용자 나열 및 삭제 공유한 리소스에 접근한 사용자를 나열하고,

특정 사용자의 접근 차단

공유 리소스 리스트 관리 여러 개의 공유 리소스를 리스트로 관리 공유 리소스 저장 및 복원 공유 리소스를 파일로 저장해 복원

// 공유 리소스를 추가하기 위한 함수

void CNetMan::ShareAdd(CString strPath, CString strName,

CString strRemark, int nType, CString strReadPwd, CString strWritePwd) {

struct share_info_50 *shi = new struct share_info_50;

// 멤버 변수에 값을 저장합니다.

strcpy(shi->shi50_netname, strName);

shi->shi50_remark = (char *) (LPCTSTR) strRemark;

shi->shi50_path = (char *) (LPCTSTR) strPath;

shi->shi50_type = STYPE_DISKTREE;

if (nType == READONLY)

shi->shi50_flags = SHI50F_RDONLY;

else

shi->shi50_flags = SHI50F_FULL;

strcpy(shi->shi50_ro_password, strReadPwd);

strcpy(shi->shi50_rw_password, strWritePwd);

WORD err = sizeof( share_info_50)*2;

// 공유 리소스 추가

NetShareAdd(NULL, 50, (const char FAR *)shi, err);

// 포인터 삭제 delete shi;

}

// 공유 리소스를 삭제하기 위한 함수

BOOL CNetMan::ShareDelete(LPCSTR lpszShareName) {

BOOL bReturn = TRUE;

// NetShareDel 함수를 호출합니다.

if ( NetShareDel(NULL, lpszShareName, 0) != 0) bReturn = FALSE;

return bReturn;

}

// 현재의 공유 리소스를 가져오기 위한 함수 void CNetMan::ShareRefresh() {

// 구조체 포인터를 초기화 합니다.

SafeDelete(m_pShareList);

m_pShareList = new struct share_info_50;

NET_API_STATUS res;

WORD er, tr;

// 공유 자원의 개수를 얻기 위해 함수를 호출합니다.

res = NetShareEnum (NULL, 50, (char FAR *)m_pShareList, sizeof(struct share_info_50), &er, &tr);

if(tr > 1) {

SafeDelete(m_pShareList);

m_pShareList = new struct share_info_50[tr*2];

} else

<리스트 2> CNetMan 클래스 중 CNetMan.cpp의 일부

네트워크 공유 관련 API를 사용하려면 프로젝트에 다음과 같은 파일들이 있어야 합니다. 그런 다음 그림과 같이 운영체제에 알 맞게 프로젝트를 셋팅해 줍니다.

◆ 윈도우 95/98 사용자 : Svrapi.h 헤더 파일과 Svrapi.lib 라이브 러리 파일 (콘솔 프로젝트에서는 Windows.h 헤더 파일이 먼저 포함돼 있어야 합니다.)

◆ 윈도우 NT/2000 사용자 : Lmshare.h 헤더 파일과 Netapi 32.lib 라이브러리 파일

프로젝트에 필요한 파일

프로젝트 셋팅

(4)

49 2000.11

네트워크 관리, 내 맘대로

CNetMan 클래스작성

CNetMan 클래스는‘share_info_50’구조체에 대한 데이터 를 가져야 합니다. 또 프로그래머가 원할 때에는 구조체의 데 이터를 넘겨주거나 최신의 정보로 업데이트할 수 있어야 합 니다. 이 기능을 구현한 코드는<리스트 2>와 같습니다.

다음은<리스트 2>에서 사용하는 SafeDelete() 함수로

CNetMan.h 파일의 일부를 가리킵니다.

// 포

포인인터터를를 안안전전하하게게 삭삭제제합합니니다다.

void SafeDelete(LPVOID lpVoid) {

if (lpVoid != NULL) {

delete lpVoid;

lpVoid = NULL;

} }

앞 소스에서 사용한 네트워크 API는 NetShareAdd, NetShareDel, NetShareEnum입니다. 함수의 사용 방법이 마치 여러분이 탐색기에서 공유를 추가/삭제하는 것과 비슷 하게 느껴지죠. 이제 잠시 책을 덮고 MSDN(MicroSoft De velo per Network)에 가서 앞서 말한 함수에 관한 설명과 함께 사용되는 인자값이 무엇을 의미하는지 살펴보기 바랍 니다. MSDN의 내용을 자세히 읽다보면 아주 사소한 정보 도 유용하며, 정확한 사용 방법을 익힘에 따라 나중에 혼란 을 줄일 수 있다는 것을 경험할 것입니다. <리스트 2>에서 구현한 함수를 이용해 만든 예제 프로그램을 실행하면 그림

�와 같은 결과가 나옵니다. 여기에 들어 있는 기능의 사용 법은 아주 간단한데, 예를 들어 공유를 추가하려면 공유 추 가 그룹에 있는 변수에 값을 넣고‘공유 추가’버튼을 누르

기만 하면 됩니다.

누구도하지않은분야에도전하라

지금까지 네트워크 공유 리소스가 어떻게 관리되며, 그것을 다루기 위해서는 어떤 함수를 사용해야 하는지에 대해 알아 봤습니다. 이러한 개념은 그다지 어렵지 않고 거대한 윈도우 가 제공하는 수많은 기능 중의 하나지만 많이 알려지지 않 은, 여러분의 실력을 한 차원 높일 수 있는 분야입니다. 다음 번에는 오늘 제작한 클래스를 완벽하게 구현해보고 유틸리 티 제작을 마무리짓도록 하겠습니다. 궁금한 사항이나 다음 호에에 추가하고 싶은 내용이 있다면 주저말고 전자우편을 보내주세요.

정리 : 박은정 기자 whoami@sbmedia.co.kr

48

J u m p U p

Jr. W

윈도우/비주얼 C++

{

SafeDelete(m_pShareList);

return;

}

// 공유 정보 얻기

res = NetShareEnum (NULL, 50, (char FAR *)m_pShareList, sizeof(struct share_info_50)*2*tr, &er, &tr);

// er에는 공유 리스트의 전체 개수가 들어 있습니다.

if( res == ERROR_SUCCESS || res == ERROR_MORE_DATA ) m_nShareNum = er;

else

SafeDelete(m_pShareList);

}

네트워크 API를 사용한 예제 프로그램

초보자가 VC++ 프로그램을 공부하면서 생기는 궁금증은 주로 어떻게 해결할까요. 대부분의 사람들은 초기에 인터넷의 질문/답 변 사이트에서 자신의 궁금증을 해결합니다. 그러다가 어느 정도 노하우가 생기면 다른 사람들의 소스를 분석해 응용하거나 한국 어 사이트를 벗어나 뉴스 그룹에서 여러 가지 정보를 구할 것입 니다. 하지만 이것으로도 문제가 해결되지 않는다면 MSDN 사 이트(http://msdn.microsoft.com/library) 방문을 권합니다.

여러분은 이미 1.5GB가 넘는 자료의 보관창고인 MSDN에서 대부분의 해결책을 찾을 수 있다는 사실에 감탄할 것입니다. 영 어로 작성돼 있고 익숙해지기까지 많은 시간이 걸리지만 MSDN 을 자기것으로 소화하면서 여유있게 프로그래밍 하는 자세를 가 졌으면 합니다.

MSDN은 개발자를 위한 보물 창고

visualC++.zip

http://maso.zdnet.co.kr/maso.html

이달의디스켓

참조

관련 문서

기관들 간의 네트워크 활동에서 자원을 제공한 정도가 다른 모든 기관들에게 상대적으로 많은 지명을 한 기관을 나타냄..

❖ 추상 클래스인 Reader와 Writer의 하위 클래스. ▪ 문자 중심의 입출력을

어떤 사람들은 그것에 대해 불평했지만, 많은 다른 사람들은 그것을 좋아했다.. 며칠 후, 박부인이 두 개의 의자를 사서

이를 해석하면, A 의원이 대표발의 혹은 공동발의를 통해 다른 의원과 연 결된 정도를 의미하며, 규제법률안을 발의하는데 다른 의원과 공조(즉, 로그롤링)가

[r]

Google Android에서 무선네트워크

지역 인적자원개발에서 가장 중요한 것은 인적자원개발 주체 간의 상호 협력 관계(물적 분업 및 상호 학습 네트워크)이다. 지역 인적자원개발은 지역을 학습 지역으로

시스코 부품 번호 안테나 종류 설명 이득 AIR-ANT1949 Yagi RP-TNC 커넥터가 있는 하이게인 실외 지향성 안테나입니다. 이 안테나는