1. def ¶
MSDN
A named pipe is a named, one-way or duplex pipe for communication between the pipe server and one or more pipe clients. All instances of a
named pipe share the same pipe name, but each instance has its own buffers and handles, and provides a separate conduit for client-server communication. The use of instances enables multiple pipe clients to use the same named pipe simultaneously.
A named pipe is a named, one-way or duplex pipe for communication between the pipe server and one or more pipe clients. All instances of a
named pipe share the same pipe name, but each instance has its own buffers and handles, and provides a separate conduit for client-server communication. The use of instances enables multiple pipe clients to use the same named pipe simultaneously.
Any process can access named pipes, subject to security checks, making named pipes an easy form of communication between related or unrelated processes. Named pipes can be used to provide communication between processes on the same computer or between processes on different computers across a network.
Any process can act as both a server and a client, making peer-to-peer communication possible. As used here, the term pipe server refers to a process that creates a named pipe, and the term pipe client refers to a process that connects to an instance of a named pipe.
Pipe๋ ๋ ํ๋ก์ธ์ค๊ฐ์ ํต์ ์ ์ํด ๋ง๋ค์ด์ง ๊ฒ์ผ๋ก Named Pipe๋ ๋ง ๊ทธ๋๋ก ์ด๋ฆ์ด ์๋ ํ์ดํ๋ผ๋ ๊ฒ์ด๋ค. ์ด๋ ๋ค๋ฅธ ์ปดํจํฐ์๋ ๋คํธ์ํฌ๋ฅผ
ํตํด Server / Client ํต์ ์ด ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด ์ฃผ๋ ์ญํ ์ ํ๋ค.
ํตํด Server / Client ํต์ ์ด ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด ์ฃผ๋ ์ญํ ์ ํ๋ค.
2. using ¶
Server
~cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
VOID InstanceThread(LPVOID); // ์ฐ๋ ๋ ํจ์
VOID GetAnswerToRequest(LPTSTR, LPTSTR, LPDWORD); // ์ค๋ ๋
int xx = 0;
DWORD main(VOID)
{
BOOL fConnected;
DWORD dwThreadId;
HANDLE hPipe, hThread; // ์ฐ๋ ๋ ํธ๋ค
LPTSTR lpszPipename = "\\.\pipe\mynamedpipe"; // ํ์ดํ ์ด๋ฆ
// The main loop creates an instance of the named pipe and
// then waits for a client to connect to it. When the client
// connects, a thread is created to handle communications
// with that client, and the loop is repeated.
for (;;)
{
// ์ฐ๋๋ ํจ์๋ฅผ ์์ฑํ๋ค.
hPipe = CreateNamedPipe(
lpszPipename, // pipe name
PIPE_ACCESS_DUPLEX, // read/write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_READMODE_MESSAGE | // message-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances
BUFSIZE, // output buffer size
BUFSIZE, // input buffer size
PIPE_TIMEOUT, // client time-out
NULL); // no security attribute
if (hPipe == INVALID_HANDLE_VALUE)
MyErrExit("CreatePipe");
// Wait for the client to connect; if it succeeds, // ํด๋ผ์ด์ธํธ๋ฅผ ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ฆฐ๋ค.
// the function returns a nonzero value. If the function returns // ์ ์์ด ๋ ๊ฒฝ์ฐ 0 ์๋ ๊ฐ์ด ๋ฆฌํด ๋๋ฉฐ
// zero, GetLastError returns ERROR_PIPE_CONNECTED. // ๋ง์ฝ 0 ๊ฐ์ด ๋ฆฌํด์ด ๋ ๊ฒฝ์ฐ ERROR_PIPE_CONNECTED๋ฅผ ๋ฆฌํดํ๋ค.
fConnected = ConnectNamedPipe(hPipe, NULL) ?
TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
// ์ฐ๊ฒฐ์ด ๋์ fConnected๊ฐ์ด TRUE๊ฐ ๋์์ผ๋ฏ๋ก
if (fConnected)
{
// Create a thread for this client. // ์ฐ๊ฒฐ๋ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ฐ๋ ๋๋ฅผ ์์ฑ์ํจ๋ค.
hThread = CreateThread(
NULL, // no security attribute
0, // default stack size
(LPTHREAD_START_ROUTINE) InstanceThread, // InstanceThread๋ฅผ ์์ฑ์ํจ๋ค.
(LPVOID) hPipe, // thread parameter // ์ฐ๋ ๋ Parameter๋ก hPipe ํธ๋ค๊ฐ์ด ๋ค์ด๊ฐ๋ค.
0, // not suspended
&dwThreadId); // returns thread ID
// ์ฐ๋ ๋๊ฐ ์์ฑ์ด ๋๋ฉด hThread ๊ฐ์ด NULL ์ด๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด์ด ๋์ Handle๊ฐ์ ๋ซ์์ค๋ค.
if (hThread == NULL)
MyErrExit("CreateThread");
else
CloseHandle(hThread);
}
else
// The client could not connect, so close the pipe.
CloseHandle(hPipe);
}
return 1;
}
VOID InstanceThread(LPVOID lpvParam)
{
CHAR chRequest[BUFSIZE]; // ์์ ๋ฒํผ
CHAR chReply[BUFSIZE]; // ์ก์ ๋ฒํผ
DWORD cbBytesRead, cbReplyBytes, cbWritten;
BOOL fSuccess;
HANDLE hPipe;
// The thread's parameter is a handle to a pipe instance.
hPipe = (HANDLE) lpvParam;
while (1)
{
// Read client requests from the pipe.
// hPipe ํธ๋ค์์ chRequst์ BUFSIZE๋งํผ ์ฝ์ด ๋ค์ฌ์จ๋ค.
fSuccess = ReadFile(
hPipe, // handle to pipe
chRequest, // buffer to receive data
BUFSIZE, // size of buffer
&cbBytesRead, // number of bytes read
NULL); // not overlapped I/O
if (! fSuccess || cbBytesRead == 0)
break;
// Request ์ ๋ํ ๋๋ต์ chReply ๋ฒํผ์ ๋ฃ์ด์ค๋ค.
GetAnswerToRequest(chRequest, chReply, &cbReplyBytes);
// chReply๋ฅผ ๋๋ตํ๋ค.
// Write the reply to the pipe.
fSuccess = WriteFile(
hPipe, // handle to pipe
chReply, // buffer to write from
cbReplyBytes, // number of bytes to write
&cbWritten, // number of bytes written
NULL); // not overlapped I/O
if (! fSuccess || cbReplyBytes != cbWritten) break;
}
// Flush the pipe to allow the client to read the pipe's contents
// before disconnecting. Then disconnect the pipe, and close the
// handle to this pipe instance.
// ๋ฒํผ์ ๋จ์ Data๋ฅผ Flush ํด์ค๋ค.
FlushFileBuffers(hPipe);
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);
}
Client~cpp
#include <windows.h>
DWORD main(int argc, char *argv[])
{
HANDLE hPipe;
LPVOID lpvMessage;
CHAR chBuf[512];
BOOL fSuccess;
DWORD cbRead, cbWritten, dwMode;
LPTSTR lpszPipename = "\\.\pipe\mynamedpipe";
// Try to open a named pipe; wait for it, if necessary.
while (1)
{
hPipe = CreateFile( // ํ์ผ์ ์ฐ๋ค
lpszPipename, // pipe name
GENERIC_READ | // read and write access
GENERIC_WRITE,
0, // no sharing
NULL, // no security attributes
OPEN_EXISTING, // opens existing pipe
0, // default attributes
NULL); // no template file
// Break if the pipe handle is valid.
if (hPipe != INVALID_HANDLE_VALUE)
break;
// Exit if an error other than ERROR_PIPE_BUSY occurs.
if (GetLastError() != ERROR_PIPE_BUSY)
MyErrExit("Could not open pipe");
// All pipe instances are busy, so wait for 20 seconds.
if (! WaitNamedPipe(lpszPipename, 20000) )
MyErrExit("Could not open pipe");
} // ํ์ผ์ ์ด๊ณ Pipe๋ฅผ ์๋ฒ์ ์ ์ํ๊ธฐ ์ ๊น์ง ๋๊ธฐ ์ํ๋ก ๋ง๋ค์ด๋๋ค.
// The pipe connected; change to message-read mode.
// ํ์ดํ๊ฐ ์ฐ๊ฒฐ์ด ๋๋ฉด ํ์ดํ๋ฅผ ์ฝ๊ธฐ์ฉ์ผ๋ก ๋ฐ๊พผ๋ค.
// ์ฌ๊ธฐ์ ์ ๊น PIPE_READMODE_MESSAGE๋ ์ฝ๊ธฐ์ฉ์ด๋ผ๊ณ ๋์์์ง๋ง MSDN์๋ ์ด ๋ชจ๋๊ฐ ์๋ก์ด ๋ชจ๋๋ก
// ์ฝ๊ธฐ์ ์ฐ๊ธฐ ๋ชจ๋ ๊ฐ๋ฅํ ๋ชจ๋๋ผ๊ณ ๋์ ์๋ค.
// Default๋ PIPE_READMODE_DATA ์ด๊ณ PIPE_READMODE_MESSAGE๊ฐ ์คํจํ ๊ฒฝ์ฐ default๋ก ์ ํด์ง๋ค.
dwMode = PIPE_READMODE_MESSAGE;
fSuccess = SetNamedPipeHandleState(
hPipe, // pipe handle
&dwMode, // new pipe mode
NULL, // don't set maximum bytes
NULL); // don't set maximum time
if (!fSuccess)
MyErrExit("SetNamedPipeHandleState");
// Send a message to the pipe server.
// ํ์ดํ๋ก ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ธ๋ค.
lpvMessage = (argc > 1) ? argv[1] : "default message";
fSuccess = WriteFile(
hPipe, // pipe handle
lpvMessage, // message
strlen(lpvMessage) + 1, // message length
&cbWritten, // bytes written
NULL); // not overlapped
if (! fSuccess)
MyErrExit("WriteFile");
// ํ์ดํ๋ก ๋ถํฐ ๋ฉ์ธ์ง๋ฅผ ์ฝ์ด์จ๋ค.
do
{
// Read from the pipe.
// ํ์ดํ๋ก๋ถํฐ ์ฝ๊ธฐ
fSuccess = ReadFile(
hPipe, // pipe handle
chBuf, // buffer to receive reply
512, // size of buffer
&cbRead, // number of bytes read
NULL); // not overlapped
if (! fSuccess && GetLastError() != ERROR_MORE_DATA)
break;
// Reply from the pipe is written to STDOUT.
// STDOUT๋ก Reply ์ฐ๊ธฐ
if (! WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),
chBuf, cbRead, &cbWritten, NULL))
{
break;
}
} while (! fSuccess); // repeat loop if ERROR_MORE_DATA
CloseHandle(hPipe);
return 0;
}
3. example ¶
์ค์ ์์ ํ์ผ NamedPipe๋ฅผ ์ด์ฉํ Chat Program http://www.zeropage.org/pds/20031103027/NamedPipe.zip
4. function ¶
~cpp CallNamedPipe | ๋ฉ์ธ์ง ํ์์ Named Pipe๋ฅผ Connectํ ๋ ์ฐ์ด๋ ํจ์ |
~cpp ConnectNamedPipe | Named Pipe ์ Connectํ ๋ ์ฐ์ด๋ ํจ์ |
~cpp CreateNamedPipe | Named Pipe๋ฅผ ์์ฑํ๋ค. |
~cpp CreatePipe | anonymous Pipe๋ฅผ ์์ฑํ๋ค. |
~cpp DisconnectNamedPipe | Named Pipe Server์ ์ฐ๊ฒฐ์ ๋๋๋ค. |
~cpp GetNamedPipeHandleState | ํน์ Named Pipe์ ๋ํ ์ ๋ณด๋ฅผ ์ป๋๋ค. |
~cpp GetNamedPipeInfo | ํน์ Named Pipe์ ๋ํ ์ ๋ณด๋ฅผ ์ป๋๋ค. |
~cpp PeekNamedPipe | anonymous / Named Pipe๋ก๋ถํฐ Data๋ฅผ ์ป์ด์จ๋ค. |
~cpp SetNamedPipeHandleState | ~cpp NamedPipe์ ~cpp ReadMode , ~cpp Block ์ํ๋ฅผ Setํ๋ค. |
~cpp TransactNamedPipe | Single Operation์ผ๋ก Read & Write๋ฅผ ํ ์ ์๋ function ์ด๋ค. |
~cpp WaitNamedPipe | Connection ์ํ์์ Time-Out OR ์ ํด์ค ์๊ฐ์ด ๋๊ธฐ ์ ๊น์ง Waitํ๋ค. |
contributor fnwinter









