winapi : CreateNamedPipe - ³×ÀÓµå ÆÄÀÌÇÁ »ý¼º
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

CreateNamedPipe

³×ÀÓµå ÆÄÀÌÇÁÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÏ°í ÆÄÀÌÇÁ¸¦ Á¦¾îÇϱâ À§ÇÑ Çڵ鷯¸¦ ¹ÝȯÇÑ´Ù.

»ç¿ë¹ý

HANDLE WINAPI CreateNamedPipe( 
  __in      LPCTSTR lpName, 
  __in      DWORD dwOpenMode, 
  __in      DWORD dwPipeMode, 
  __in      DWORD nMaxInstances, 
  __in      DWORD nOutBufferSize, 
  __in      DWORD nInBufferSize, 
  __in      DWORD nDefaultTimeOut, 
  __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes 
); 
 
  • lpName
    À¯ÀÏÇÑ ÆÄÀÌÇÁÀÇ À̸§À¸·Î ¾Æ·¡ÀÇ Æ÷¸ËÀ» µû¸¥´Ù.

    \\.\pipe\pipename 
     
    ÆÄÀÌÇÁÀ̸§Àº ¹é½½·¡½¬¸¦ Á¦¿ÜÇÑ ¸ðµç ¹®ÀÚ¿Í ¼ýÀÚ Æ¯¼ö¹®ÀÚ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÆÄÀÌÇÁÀ̸§Àº 256ÀÚ¸¦ ÃʰúÇÒ ¼ö ÀÖ´Ù. ÆÄÀÌÇÁ À̸§Àº ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇÏÁö ¾Ê´Â´Ù.

¸Å°³ º¯¼ö

  • dwOenMode
    ÆÄÀÌÇÁÀÇ Á¢±Ù¹æ½Ä°ú ±ÇÇÑÀ» ¼³Á¤ÇÑ´Ù.
    Mode ¼³¸í
    PIPE_ACCESS_DUPLEX Àбâ&¾²±â ¸ðµå·Î ¼­¹ö¿Í Ŭ¶óÀÌ¾ðÆ®´Â ¾ç¹æÇâÀ¸·Î ÀÐ°í ¾µ ¼ö ÀÖ´Ù. ¼­¹ö´Â GENERIC_READ, GENERIC_WRITE ÆÄÀÏ Á¢±Ù±ÇÇѰú µ¿ÀÏÇÑ È¿°ú¸¦ °¡Áø´Ù. Ŭ¶óÀÌ¾ðÆ®´Â CreateFile ÇÔ¼ö·Î ÆÄÀÌÇÁ¸¦ ÀÌ¿ëÇÒ ¼ö Àִµ¥, GENERIC_READ, GENERIC_WRITE ȤÀº ¸ðµÎ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
    PIPE_ACCESS_INBOUD ¼­¹ö´Â Ŭ¶óÀÌ¾ðÆ®·Î ºÎÅÍ ÀÐÀ» ¼ö¸¸ ÀÖ´Ù. ¼­¹ö´Â GENERIC_READ È¿°ú¸¦ °¡Áø´Ù. Ŭ¶óÀÌ¾ðÆ®´Â GENERIC_WRITE·Î ¾²±â·Î ÆÄÀÌÇÁ¿¡ ¿¬°áÇÒ ¼ö ÀÖ´Ù.
    PIPE_ACCESS_OUTBOUND ¼­¹ö´Â Ŭ¶óÀÌ¾ðÆ®·Î ¾µ¼ö¸¸ ÀÖ´Ù. ¼­¹ö´Â GENERIC_WRITE È¿°ú¸¦ °¡Áø´Ù. Ŭ¶óÀÌ¾ðÆ®´Â GENERIC_READ·Î Àбâ·Î ÆÄÀÌÇÁ¿¡ ¿¬°áÇÒ ¼ö ÀÖ´Ù.
  • dwPipeMode
    ÆÄÀÌÇÁÀÇ µ¥ÀÌÅÍ Åë½Å ¹æ½ÄÀ» ¼³Á¤ÇÑ´Ù.
    PIPE_TYPE_BYTE ¹ÙÀ̳ʸ® Àü¼Û ¸ðµå
    PIPE_TYPE_MESSAGE ¸Þ½ÃÁö Àü¼Û ¸ðµå
    PIPE_READMODE_BYTE ¹ÙÀ̳ʸ® ¼ö½Å ¸ðµå
    PIPE_READMODE_MESSAGE ¸Þ½ÃÁö ¼ö½Å ¸ðµå
    PIPE_WAIT ºÀ¼â ¸ðµå
    PIPE_NOWAIT ºñºÀ¼â ¸ðµå
  • nMaxInstances
    »ý¼ºÇÒ ¼ö ÀÖ´Â ÃÖ´ë ÆÄÀÌÇÁ °¹¼ö 255±îÁö Çã¿ë
  • nOutBufferSize
    Ãâ·Â ¹öÆÛ »çÀÌÁî. 0ÀÌ¸é ±âº» °ª »ç¿ë
  • nInBufferSize
    ÀÔ·Â ¹öÆÛ »çÀÌÁî. 0ÀÌ¸é ±âº» °ª »ç¿ë
  • nDefaultTimeout
    WaitNamePipeÇÔ¼ö¿¡ Àû¿ëÇÒ ½Ã°£. 1/1000ÃÊ ´ÜÀ§
  • lpSecurityAttributes
    º¸¾È¼Ó¼º ±¸Á¶Ã¼

¼³¸í

¸®´ª½º¿Í ¸¶Âù°¡Áö·Î ÆÄÀÏó·³ ´Ù·ê ¼ö ÀÖ´Ù. CreateFileÀ¸·Î ÆÄÀÌÇÁ¿¡ ¿¬°áÇϰí ReadFile, WriteFile·Î µ¥ÀÌÅ͸¦ ÀÐÀ» ¼ö ÀÖ´Ù.

´ÜÁö Áö¿ª ÄÄÇ»ÅÍ¿¡ ÀÖ´Â ÇÁ·Î¼¼½º»çÀÌÀÇ Åë½ÅÀÌ °¡´ÉÇÑ ¸®´ª½ºÀÇ ³×ÀÎµå ÆÄÀÌÇÁ¿Í ´Þ¸®, À©µµ´Â LAN ȤÀº ÀÎÅͳݿ¡¼­ÀÇ Åë½Åµµ Áö¿øÇÑ´Ù. Áö¿ª ÄÄÇ»ÅÍ¿Í LAN ¿µ¿ª¿¡¼­ÀÇ Åë½ÅÀº ÃæºÐÇÑ ¼º´ÉÀ» º¸¿©ÁÖÁö¸¸ ÀÎÅÍ³Ý ¿µ¿ªÀ¸·Î ³Ñ¾î°¥ °æ¿ì TCP ¼ÒÄÏ Åë½Å¿¡ ºñÇØ ¸Å¿ì ´À¸° ¼º´ÉÀ» º¸¿©ÁØ´Ù.

¿¹Á¦

³×ÀÓµå ÆÄÀÌÇÁ·Î echo ¼­¹ö Ŭ¶óÀÌ¾ðÆ®¸¦ ±¸ÇöÇØ º¸±â·Î Çß´Ù. ¼­¹ö ÇÁ·Î±×·¥ÀÇ À̸§Àº echo_server_np.c, Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÇ À̸§Àº echo_client_np.c·Î Çß´Ù.

ÄÄÆÄÀÏÀº Å×½ºÆ®µÇ¾úÀ½. ÀÛµ¿ Å×½ºÆ®ÇÏÁö ¾Ê¾ÒÀ½

¿¹Á¦ : echo_server_np.c
#include <stdio.h> 
#include <time.h> 
#include <windows.h> 
 
#define PIPE_NAME "\\\\.\\pipe\\echo" 
#define BUF_SIZE  1024     // IN, OUT 
 
int main(int argc, char **argv) 
{ 
    HANDLE ph = NULL; 
    time_t ctime = 0; 
    struct tm *ltm=NULL; 
    char buf[256]; 
    DWORD nread =0, nwrite=0; 
    BOOL brtv = FALSE; 
 
 
    ph = CreateNamedPipe( 
        PIPE_NAME, 
        PIPE_ACCESS_DUPLEX, 
        PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 
        PIPE_UNLIMITED_INSTANCES, 
        BUF_SIZE, 
        BUF_SIZE, 
        NMPWAIT_USE_DEFAULT_WAIT, 
        NULL); 
    if (ph == INVALID_HANDLE_VALUE) 
    { 
        printf("Pipe create failure!!\n"); 
        return 1; 
    } 
 
    while(1) 
    { 
        if(ConnectNamedPipe(ph, NULL)) 
        { 
            brtv = ReadFile(ph, buf, 256, &nread, NULL); 
            if(!brtv || (nread == 0)) 
            { 
                printf("Read Pipe Error\n"); 
                return 1; 
            } 
            brtv = WriteFile(ph, buf, nread, &nwrite, NULL); 
            if(!brtv || (nwrite != nread)) 
            { 
                printf("Write Error\n"); 
            } 
        } 
    } 
} 
 

¿¹Á¦ : echo_client_np.c
#include <stdio.h>  
#include <time.h>  
#include <windows.h>  
  
#define PIPE_NAME "\\\\.\\pipe\\echo"  
#define BUF_SIZE  1024     // IN, OUT  
  
int main(int argc, char **argv)  
{  
    HANDLE ph = NULL;  
    time_t ctime = 0;  
    struct tm *ltm=NULL;  
    char buf[BUF_SIZE];  
    LPDWORD nread =0, nwrite=0;  
    BOOL brtv = FALSE;  
  
 
    ph = CreateFile((LPCWSTR)PIPE_NAME, GENERIC_READ | GENERIC_WRITE, 
        0, 
        NULL, 
        OPEN_EXISTING, 
        0, 
        NULL); 
    if (ph == INVALID_HANDLE_VALUE)  
    {  
        printf("Pipe open failure!!\n");  
        return 1;  
    }  
  
    while(1)  
    { 
        printf("> "); 
        fgets(buf, BUF_SIZE, stdin); 
        if(strncmp(buf, "quit\n",5) == 0) 
        { 
            break; 
        } 
        WriteFile(ph, buf, strlen(buf), nwrite, NULL); 
        memset(buf, 0x00, BUF_SIZE); 
        ReadFile(ph, buf, BUF_SIZE, nread, NULL); 
        printf("Server -> %s", buf); 
    }  
    return 0; 
} 
 

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.