进程间通信-命名管道-服务器端与客户端代码示范

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/txwtech/article/details/90138453

进程间通信-命名管道-服务器端与客户端代码示范

服务器端:

void CNamedPipeServerDlg::OnBnClickedButtonListen()
{
	// TODO: 在此添加控件通知处理程序代码
	m_hPipe = CreateNamedPipe("\\\\.\\Pipe\\NamedPipeSample", PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, 0, 0, 1000, NULL);
	if (m_hPipe == INVALID_HANDLE_VALUE)
	{
		m_Log = "创建命名管道失败!\r\n";
		UpdateData(FALSE);
		return;

	}
	else
	{
		m_Log = "创建命名管道成功咯。txwtech\r\n";
		UpdateData(FALSE);
		AfxBeginThread(ListenProc,this);
	}
}


//UINT CNamedPipeServerDlg::ListenProc(LPVOID lpVoid)
//{
//	return 0;
//}
UINT ListenProc(LPVOID lpVoid)
{
	char buffer[1024];
	DWORD dwReadBytes;
	CNamedPipeServerDlg* pDlg = (CNamedPipeServerDlg*)lpVoid;
	if (ConnectNamedPipe(pDlg->m_hPipe, NULL) == FALSE)
	{
		CloseHandle(pDlg->m_hPipe);
		pDlg->m_Log += "与命名管道客户端建立连接失败\r\n";
		pDlg->m_editLog.SetWindowTextA(pDlg->m_Log);//线程里面不能使用UpdateDate(FALSE);
		return 0;
	}
	if (ReadFile(pDlg->m_hPipe, buffer, sizeof(buffer), &dwReadBytes, NULL) == FALSE)
	{
		CloseHandle(pDlg->m_hPipe);
		pDlg->m_Log += "从管道读取数据失败!txwtech\r\n";
	}
	else
	{
		buffer[dwReadBytes] = '\0';
		pDlg->m_Log += "txwtech接受到客户端命名管道发送的数据=\r\n";
		pDlg->m_Log += CString(buffer);
	}
	if (DisconnectNamedPipe(pDlg->m_hPipe) == FALSE)
	{
		pDlg->m_Log += "txwtech终止连接失败\r\n";
	}
	else
	{
		CloseHandle(pDlg->m_hPipe);
		pDlg->m_Log += "txwtech成功终止连接\r\n";
	}
	pDlg->m_editLog.SetWindowTextA(pDlg->m_Log);
	return 1;
}

客户端:

void CNamedPipeClientDlg::OnBnClickedButtonConnect()
{
	// TODO: 在此添加控件通知处理程序代码
	CString content = "{测试数据,我是命名管道客户端}\r\n";
	DWORD dwWriteBytes;
	if (WaitNamedPipe("\\\\.\\Pipe\\NamedPipeSample", NMPWAIT_WAIT_FOREVER) == FALSE)
	{
		m_Log = "等待连接失败!\r\n";
		UpdateData(FALSE);
		return;
	}
	HANDLE hPipe = CreateFile("\\\\.\\Pipe\\NamedPipeSample",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if (hPipe == INVALID_HANDLE_VALUE)
	{
		m_Log += "打开命名管道失败\r\n";
		UpdateData(FALSE);
		return;
	}
	else
		m_Log += "打开命名管道成功\r\n";

	if (!WriteFile(hPipe, content, content.GetLength(), &dwWriteBytes, NULL))
		m_Log += "向命名管道写入数据失败!\r\n";
	else
	{
		m_Log += "向命名管道写入数据成功\r\n";
	}
	UpdateData(FALSE);
	CloseHandle(hPipe);
}

猜你喜欢

转载自blog.csdn.net/txwtech/article/details/90138453