首页 > Windows开发 > 详细

使用Win32控制台实现命名管道通信

时间:2020-07-05 19:59:25      阅读:54      评论:0      收藏:0      [点我收藏+]

接收端:

//server
//命名管道采用基于连接的可靠传输方式,只能一对一传输
#include <windows.h>
#include <iostream>

#define BUF_SIZE 1024

using std::cerr;
using std::cout;
using std::endl;

int main()
{
	HANDLE h_pipe;
	char buf_msg[BUF_SIZE];
	DWORD num_rcv; //实际接收到的字节数
	//创建命名管道,命名为MyPipe,消息只能从客户端流向服务器,读写数据采用阻塞模式,字节流形式,超时值置为0表示采用默认的50毫秒
	h_pipe = ::CreateNamedPipe(L"\\\\.\\pipe\\MyPipe", PIPE_ACCESS_INBOUND, PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, BUF_SIZE, BUF_SIZE, 0, nullptr);
	if (h_pipe == INVALID_HANDLE_VALUE)
	{
		cerr << "Failed to create named pipe!Error code: " << ::GetLastError() << "\n";
		system("pause");
		return 1;
	}
	else
	{
		cout << "Named pipe created successfully...\n";
	}
	//等待命名管道客户端连接
	if (::ConnectNamedPipe(h_pipe, nullptr))
	{
		cout << "A client connected...\n";
		memset(buf_msg, 0, BUF_SIZE);
		//读取数据
		if (::ReadFile(h_pipe, buf_msg, BUF_SIZE, &num_rcv, nullptr))
		{
			cout << "Message received: " << buf_msg << "\n";
		}
		else
		{
			cerr << "Failed to receive message!Error code: " << ::GetLastError() << "\n";
			::CloseHandle(h_pipe);
			::system("pause");
			return 1;
		}
	}
	::CloseHandle(h_pipe);
	::system("pause");
	return 0;
}

发送端:

//client
#include <windows.h>
#include <iostream>

#define BUF_SIZE 1024

using std::cerr;
using std::cout;
using std::endl;

int main()
{
	HANDLE h_pipe;
	char buf_msg[] = "Test for named pipe...";
	DWORD num_rcv; //实际接收到的字节数
	cout << "Try to connect named pipe...\n";
	//连接命名管道
	if (::WaitNamedPipe(L"\\\\.\\pipe\\MyPipe", NMPWAIT_WAIT_FOREVER))
	{
		//打开指定命名管道
		h_pipe = ::CreateFile(L"\\\\.\\pipe\\MyPipe", GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
		if (h_pipe == INVALID_HANDLE_VALUE)
		{
			cerr << "Failed to open the appointed named pipe!Error code: " << ::GetLastError() << "\n";
			::system("pause");
			return 1;
		}
		else
		{
			if (::WriteFile(h_pipe, buf_msg, BUF_SIZE, &num_rcv, nullptr))
			{
				cout << "Message sent successfully...\n";
			}
			else
			{
				cerr << "Failed to send message!Error code: " << ::GetLastError() << "\n";
				::CloseHandle(h_pipe);
				::system("pause");
				return 1;
			}
		}
		::CloseHandle(h_pipe);
	}
	::system("pause");
	return 0;
}

参考链接

https://www.cnblogs.com/jzincnblogs/p/5192763.html

使用Win32控制台实现命名管道通信

原文:https://www.cnblogs.com/rcg714786690/p/13249268.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!