본문 바로가기
IT창고/System

파이프

by 창구창고 2007. 1. 22.

📑 목차

    반응형
    //server
    #include<windows.h>
    #include<stdio.h>
    DWORD WINAPI foo( void *p)
    {
    	HANDLE hPipe = CreateNamedPipe("\\\\.\\pipe\\source_server",	//UNC
    									PIPE_ACCESS_OUTBOUND,			// 출력전용
    									PIPE_TYPE_BYTE,					//stream방식
    									1,								//최대 instance개숫
    									4096,4096,						//최대 입출력 버퍼 크기
    									1000,							//WaitNamedPipe()로 대기할 시간
    									0);								//KO보안
    	if(hPipe == INVALID_HANDLE_VALUE)
    	{
    		printf("파이프를 생성할 수 없습니다.\n");
    		return 0;
    	}
    	//--------------------------------------------------------------------------
    	while(1)
    	{
    		BOOL b = ConnectNamedPipe(hPipe , 0 ); //Client의 접속을 대기한다.
    		//이부분에서 클라이언트가 접속할때까지 Blocking
    		
    		if( b == FALSE && GetLastError() == ERROR_PIPE_CONNECTED) b = TRUE;
    
    		if( b )//접속이 되었다면
    		{
    			char buf[4096] = { 0 };
    			//아래의 영역은 클립보드에서 data를 꺼낸다.
    			//===========================================================
    			if(OpenClipboard(0))
    			{
    				HANDLE hData = GetClipboardData(CF_TEXT);
    
    				char * p = (char *)GlobalLock(hData);
    				strcpy(buf,p);
    				GlobalUnlock(hData);
    				CloseClipboard();
    			}
    			//===========================================================
    			//Pipe에 쓰기
    			DWORD len;
    			WriteFile(hPipe, buf, strlen(buf)+1, &len, 0);
    
    			FlushFileBuffers(hPipe);
    			DisconnectNamedPipe(hPipe); //강제로 접속을 끊는다.
    		}
    	}
    	return 0;
    }
    void main()
    {
    	HANDLE h1 = CreateThread(0,0,foo,0,0,0);
    	WaitForSingleObject(h1,INFINITE);
    	CloseHandle(h1);
    }
    //client
    #include<windows.h>
    #include<stdio.h>
    
    LRESULT CALLBACK WndProc(HWND hwnd,UINT iMessage,WPARAM wParam,LPARAM lParam);
    
    TCHAR lpszClass[] = TEXT("first");
    int WINAPI WinMain(HINSTANCE hInstance,
    				   HINSTANCE hPrev,
    				   LPSTR lpCmdLine,
    				   int nShowCmd)
    {
    	AllocConsole();	//	콘솔창 생성
    
    	freopen("CONOUT$",	//콘솔을
    		"wt",			//text write모드로
    		stdout);		//stdoutrhk 연결
    	MSG Message;
    	//1. 위도우 클래스 만들기 (10가지를 다 정확히 입력하지 않으면 화면이 뜨지 않는다.)
    	WNDCLASS wc;		//미리정의된 10개 항목을 채우는 클래스 (WNDCLASSEX 12개 항목 10개 항목에 작은 아이콘, 구조체 크기를 포함한다.)
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	wc.hbrBackground	=	(HBRUSH)GetStockObject(	WHITE_BRUSH);
    
    	wc.hCursor		=	LoadCursor	(	0, IDC_CROSS);
    	wc.hIcon		=	LoadIcon	(	0, IDI_WINLOGO	);
    	wc.hInstance	=	hInstance;
    	wc.lpfnWndProc	=	WndProc;	//<~ 이부분을 자신이 만드는 함수로 바꿔줘야 한다.	메시지 함수등록
    	wc.lpszClassName=	lpszClass;
    	wc.lpszMenuName	=	0;
    	wc.style		=	0;
    
    	//2. 윈도우 클래스 등록하기.
    	RegisterClass( & wc	);	// 등록을 하는 함수도 2가지가 있다. RegisterClass와 RegisterClassEx가 있다.
    	//WNDCLASS로 만들었으면 RegisterClass로 등록하고 WNDCLASSEX로 만들었으면 RegisterClassEx로 등록
    
    	//3. 등록된 클래스를 사용해서 윈도우 만들기.
    	// typedef long HWND;	//	윈도우의 번호를 담을때 사용
    	HWND hwnd	=	CreateWindowEx(0 ,			// 확장 윈도우 스타일
    									lpszClass,				// 윈도우 클래스 이름
    									TEXT("첫시작"),					// 창이름
    									WS_OVERLAPPEDWINDOW,	// 기본 Window Styles : & ~ 연산으로 기존스타일 제거하기
    															// WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX
    									20,	20,	839,	660,	// X,Y,W,H
    									0,						// 부모 윈도우 핸들( 번호 )
    									0,						// 메뉴 핸들( 번호 )
    									hInstance,				// 인스턴스 핸들
    									0);						// 생성인자.( MDI 만들때 사용 )
    	
    	//4. 윈도우 보여주기
    	ShowWindow(hwnd, nShowCmd);
    
    	while(GetMessage(&Message,0,0,0))	//메시지 큐에 가서 메시지를 꺼내오고 가져온 메시지를 윈도우 클래스에 등록된 메세지 처리함수로 전달한다.
    	{
    		//여기서 메시지를 처리하면 부모뿐 아니라 모든 자식윈도우로 전달되는 메시지도 먼저 처리할 수 있다.
    
    		TranslateMessage(&Message);
    		if (Message.message	==	WM_SYSKEYDOWN && Message.wParam == 'X')
    		{
    			PostQuitMessage(0);
    			MessageBox(hwnd, "종료","질문",MB_OK);
    			//SendMessage(hwnd, WM_CLOSE,0,0);
    			continue;
    		}
    
    		//PreTranslateMessae(&Message);
    		DispatchMessage(&Message);//가져온 메시지를 윈도우 클래스에 등록된 메시지 처리함수로 전달한다.
    	}
    	
    	//MessageBox(0, "이제 알겠죠?","물음",MB_OKCANCEL);//종료되지 않게 하기 위해
    	return 0;
    }
    LRESULT CALLBACK WndProc(HWND hwnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
    {
    	static HWND hEdit, hIP, hBtn;
    	switch(iMessage){
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return 0 ;
    	case WM_CREATE:
    		hIP = CreateWindow("edit","",
    			WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE,
    			10,10,100,30,hwnd,(HMENU)1,0,0);
    		hBtn = CreateWindow("button","Connect",
    			WS_CHILD | WS_VISIBLE | WS_BORDER,
    			120,10,170,30,hwnd,(HMENU)2,0,0);
    		hEdit = CreateWindow("edit","",
    			WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE,
    			10,50,500,500,hwnd,(HMENU)3,0,0);
    		return 0 ;
    //버튼을 누를때 Pipe서버에 접속한다.
    	case WM_COMMAND:
    		{
    			switch(LOWORD(wParam))
    			{
    			case 2:
    				{
    					//결국 Pipe는 파일처럼 사용하면 된다.
    					char name[256] = "\\\\";
    					char ip[256];
    
    					GetWindowText(hIP,ip,256);
    					strcat(name, ip);
    					strcat(name, "\\pipe\\source_server");
    
    					HANDLE hPipe = CreateFile(name, GENERIC_READ,
    								FILE_SHARE_WRITE | FILE_SHARE_READ,
    								0, OPEN_EXISTING,
    								FILE_ATTRIBUTE_NORMAL, 0);
    					if(hPipe == INVALID_HANDLE_VALUE)
    					{
    						MessageBox(0, "실패" , "" ,MB_OK);
    						return 0;
    					}
    
    					char buf[4096] = {0};
    					DWORD len;
    					ReadFile(hPipe, buf, 4096, &len, 0);
    
    					CloseHandle(hPipe);
    					SetWindowText(hEdit, buf);
    				}
    			}
    		}
    		return 0;
    	}
    	//꺼내온 메시지를 처리하지 않은경우 -> 바드시 아래 함수를 처리한다.
    	return(DefWindowProc(hwnd,iMessage,wParam,lParam));
    }
    반응형

    "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."