반응형
프로세스 간에 통신을 하기 위해서 PIPE 를 이용한 통신 예제를 작성해 보았다.
예제는 단방향 이지만 조금만 응용하면 양방향으로도 사용이 가능하다.
PIPE 는 Client 와 Server 클래스가 각각 존재 하며 이를 주의 해야 함.
클라이언트 PIPE
Thread m_pipe_thread;
bool m_bTerminate = false;
NamedPipeClientStream m_pipeClient;
public FrmClientMain()
{
InitializeComponent();
CheckVisionAppTimer.Enabled = false;
//PIPE 식별 GUID {0B444AB3-70A6-4486-9020-D14A78FF4533}
m_pipeClient = new NamedPipeClientStream(".", "0B444AB3-70A6-4486-9020-D14A78FF4533",
PipeDirection.InOut, PipeOptions.None,
TokenImpersonationLevel.Impersonation);
m_pipe_thread = new Thread(cb_thread_pipeworker);
m_pipe_thread.Start();
}
public void cb_thread_pipeworker()
{
while (!m_bTerminate)
{
if (!m_pipeClient.IsConnected)
{
try
{
m_pipeClient.Connect(1000); // TIMEOUT 1 sec
Console.WriteLine("PIPE SERVER CONNECTED...", true);
}catch(Exception ee)
{
Console.WriteLine(ee.Message);
}
Thread.Sleep(2000);
continue;
}
else
{
if (CheckVisionAppTimer.Enabled == false)
CheckVisionAppTimer.Enabled = true;
}
try
{
StreamWriter writer = new StreamWriter(m_pipeClient);
writer.WriteLine("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
writer.Flush();
}catch(Exception ee)
{
Console.WriteLine(ee.Message);
}
Thread.Sleep(2000);
}
}
PIPE 서버
NamedPipeServerStream m_pipeServer;
Thread m_pipe_client_thread;
bool m_bTerminate = false;
private void button1_Click(object sender, EventArgs e)
{
m_bTerminate = false;
try
{
//PIPE 식별 GUID {0B444AB3-70A6-4486-9020-D14A78FF4533}
m_pipeServer = new NamedPipeServerStream("0B444AB3-70A6-4486-9020-D14A78FF4533",
PipeDirection.InOut);
}catch(Exception ee)
{
Console.WriteLine(ee.Message);
}
// 통합 제어 시스템 클라이언트와 통신하기 위한 스래드 생성
m_pipe_client_thread = new Thread(cb_thread_PipeWorker);
m_pipe_client_thread.Start();
}
public void cb_thread_PipeWorker()
{
while (!m_bTerminate)
{
m_pipeServer.WaitForConnection();
Console.WriteLine("Connected.");
while (m_pipeServer.IsConnected)
{
var read = new byte[4096];
int iRet = m_pipeServer.Read(read, 0, read.Length);
if (iRet > 0)
{
var msg = Encoding.UTF8.GetString(read).TrimEnd('\0');
Console.WriteLine(msg);
}
}
Thread.Sleep(10);
}
}
반응형
'Development > Visual C#' 카테고리의 다른 글
[C#] System.InvalidOperationException 에러 (0) | 2021.07.16 |
---|---|
[C#] System.InvalidOperationException 에러 (0) | 2021.07.16 |
[C#] 콜백 함수 사용 방법 (call back function) (0) | 2021.07.16 |
프린터 드라이버 인쇄 하는 방법 C# (0) | 2021.03.22 |
(C#) Image to Bitmap 변환, 해상도 변경 (SetResolution) (1) | 2021.03.22 |
댓글