태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.


댓글 하나가 운영자에겐 커다란 힘이 됩니다!

이름 있는 파이프(name pipe)

 - 양방향 가능

 -  이름을 붙일수 있다

    (이름 붙이는 규칙 : "\pc이름\pipe\원하는 이름") Universal Name Convention

 

서버쪽에서 파이프를 생성한 후 대기(ConnectNamedPipe)하면 클라이언트에서

연결(CreateFile())한다

 

 

---------------------------- Server 부분 ---------------------------------

서버쪽에서 파이프를 생성한 후 대기한다

 

 

#include <windows.h>

#include <stdio.h>

 

DWORD WINAPI foo(void *p)

{

        HANDLE hPipe = CreateNamedPipe(\\\\.\\pipe\\MyPipe, // 이름

                                PIPE_ACCESS_INBOUND,        // 입력 전용

                                PIPE_TYPE_MESSAGE,          // <-> stream

                                3,                        // 최대 갯수

                                1024, 1024,   // 버퍼 크기

                                1000,     // WaitNamedPipe()함수가

                                          // 대기할 수 있는 Timeout 사용

                                0);       // KO 보안

 

        if( hPipe == INVALID_HANDLE_VALUE) // -1

        {

                printf("Error\n");

                return 0;

        }

 

        while(1)

        {

                // 클라이언트를 대기한다

                // (누군가가 pipe에 접속할때까지 대기한다)

                DWORD ret = ConnectNamedPipe(hPipe, 0);

               

 

                if(ret == TRUE)

                {       

                        // 화면에 출력하는 부분

                        while(1)

                        {

                                char data[4096] = {0};

                                DWORD len;

                                ReadFile(hPipe, data, 4096, &len, 0);

           

                                if(len <= 0)// Client의 접속이 종료 된 경우

                                {

                                        break;

                                }

 

                                printf("%s\n", data);

                                if(strcmp(data,"quit") == 0) break;

                        }

 

                        DisconnectNamedPipe(hPipe);

                        printf("대기중입니다\n");

                }

        }

 

}

 

void main()

{

        HANDLE hThread1 = CreateThread(0, 0, foo, 0, 0, 0);
        HANDLE hThread2 = CreateThread(0, 0, foo, 0, 0, 0);
        HANDLE hThread3 = CreateThread(0, 0, foo, 0, 0, 0);

 

        HANDLE h[3] = {hThread1, hThread2, hThread3};

 

        WaitForMultipleObjects(3, h, TRUE, INFINITE);

 

        CloseHandle(hThread1);
        CloseHandle(hThread2);
        CloseHandle(hThread3

}

 

 

---------------------------- Client -----------------------------

파이프에 접속하는 프로그램

 

#include <stdio.h>

#include <windows.h>

 

void main()

{

        char name[256] = "\\\\.\\pipe\\MyPipe";

        // . 대신 ip주소를 쓸수 있다

 

        HANDLE hPipe = CreateFile(name, GENERIC_WRITE,

                           FILE_SHARE_READ | FILE_SHARE_WRITE,

                           0, OPEN_EXISTING,

                           FILE_ATTRIBUTE_NORMAL, 0);

 

        if(hPipe == INVALID_HANDLE_VALUE)

        {

                printf("파이프에 접속할 수 없습니다 \n");

                return;

        }

 

        while(1)

        {

                char data[4096] = {0};

                gets(data);

                DWORD len;

                WriteFile(hPipe, data, 4096, &len, 0);

 

                if(strcmp(data, "quit") == 0) break;

        }

        CloseHandle(hPipe);

}

// 서버를 먼저 실행하세요..

// 클라이언트 실행하세요..

// 클라이언트에서 문자열 입력 후 Enter....

위의 정보가 도움이 되셨나요? 그렇다면 댓글 하나만 남겨주세요.
댓글 하나가 운영자에겐 커다란 힘이 됩니다!

  1. 김태우

    | 2009/05/24 02:36 | PERMALINK | EDIT | REPLY |

    깔끔한 정리 감사드려요~ ^ㅇ^)/

  2. 서퍼

    | 2009/10/29 18:14 | PERMALINK | EDIT | REPLY |

    좋은 자료 감사합니다.

  3. dev

    | 2009/12/29 17:58 | PERMALINK | EDIT | REPLY |

    우와우~ 정말 감사합니다~ 좋은 자료에요 ㅠㅠ

Write your message and submit
« PREV : 1 : ... 53 : 54 : 55 : 56 : 57 : 58 : 59 : 60 : 61 : ... 432 : NEXT »