节点定义管道通信

sd56526720 2012-03-01 03:14:03
各位大侠,本人想定义一个节点,想实现两个节点甚至更多个节点间的进程通信,且通信机制采取管道通信的方式,传递的数据是自定义的数据包,该如何创建,请大侠帮忙哈。
...全文
73 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
SLSnake 2012-03-06
  • 打赏
  • 举报
回复
http://www.cnblogs.com/phinecos/archive/2008/06/11/1217557.html
这是windows下的
SLSnake 2012-03-06
  • 打赏
  • 举报
回复
我哪算什么大侠,小鸟一只。
你可以看下这篇博文,以及他文章最后的参考链接,写得不错
http://blog.csdn.net/wbw1985/article/details/4944718
sd56526720 2012-03-05
  • 打赏
  • 举报
回复
大侠,那如果是在windows下,要实现我上面说的这些功能的话,能实现吗?我现在也是在尝试阶段,具体也不知道用哪种方式好,所以想请大侠指点下,大侠可以留个联系方式吗?
SLSnake 2012-03-05
  • 打赏
  • 举报
回复
Linux下的我倒不太熟悉
这个倒没法帮你了,问问熟悉这方面的人吧,我只在windows下搞过管道通信
sd56526720 2012-03-05
  • 打赏
  • 举报
回复
谢谢您的回答,我想在Linux下进行编程,不采用客户端和服务器端这种模式,多个节点之间是一种平等的关系,我想把这个节点定义为一个类或者是结构体,这个节点具有上传数据,下载数据,转发数据的功能等,其实一共要定义两个类 :一个类是节点类 ,用来产生节点对象的(实际上就是进程),另外一个类是提取方法后的类,用来处理任意两个节点之间的数据,节点与节点之间的关系用矩阵来实现,而这个节点数目我可以自己来手动输入哈,他们之间的通信用进程间管道通信,请问我大侠我该怎么实现,请大侠帮忙啊。
SLSnake 2012-03-01
  • 打赏
  • 举报
回复
服务端

#include "stdafx.h"
#include <conio.h>

HANDLE m_hPipe;

UINT ReadProc(LPVOID lpVoid)
{
char buffer[1024]; // 数据缓存
DWORD ReadNum;
//CServerView* pView = (CServerView*)lpVoid; // 获取视句柄
if (ConnectNamedPipe(m_hPipe, NULL) == FALSE) // 等待客户机的连接
{
CloseHandle(m_hPipe); // 关闭管道句柄
//pView->m_sMessage = "与客户机建立连接失败!"; // 显示信息
//pView->Invalidate();
printf("与客户机建立连接失败!\n");
return 0;
}
else
{
//pView->m_sMessage = "与客户机建立连接!"; // 显示信息
//pView->Invalidate();
printf("与客户机建立连接!\n");
}
if (ReadFile(m_hPipe, buffer, sizeof(buffer), &ReadNum, NULL) == FALSE)// 从管道读取数据
{
CloseHandle(m_hPipe); // 关闭管道句柄
//pView->m_sMessage = "从管道读取数据失败!"; // 显示信息
//pView->Invalidate();
printf("从管道读取数据失败!\n");
}
else
{
buffer[ReadNum] = '\0'; // 显示接收到的信息
//pView->m_sMessage = CString(buffer);
//pView->Invalidate();
printf("%s\n",buffer);
}
return 1;
}

int _tmain(int argc, _TCHAR* argv[])
{
BYTE sd[SECURITY_DESCRIPTOR_MIN_LENGTH];
SECURITY_ATTRIBUTES sa;

sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = &sd;

InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, TRUE, (PACL) 0, FALSE);

m_hPipe = NULL;
m_hPipe = CreateNamedPipe(TEXT("\\\\.\\Pipe\\Test"),
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 1024, 1024, 0, &sa);
if (m_hPipe == INVALID_HANDLE_VALUE)
{
printf("%d\n",GetLastError());
printf("创建命名管道失败!\n");
}
else
{
printf("成功创建命名管道!\n");
AfxBeginThread(ReadProc, NULL); // 开启线程
}

_getch();
return 0;
}


客户端
#include "stdafx.h"
#include <Windows.h>
#include <conio.h>
#include <atlstr.h>

int _tmain(int argc, _TCHAR* argv[])
{
CString Message = "[测试数据,由客户机发出]"; // 要发送的数据
DWORD WriteNum; // 发送的是数据长度
// 等待与服务器的连接
if (WaitNamedPipe(TEXT("\\\\.\\Pipe\\Test"), NMPWAIT_WAIT_FOREVER) == FALSE)
{
printf("等待连接失败!\n"); // 显示信息
_getch();
return -1;
}
// 打开已创建的管道句柄
HANDLE hPipe = CreateFile(TEXT("\\\\.\\Pipe\\Test"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hPipe == INVALID_HANDLE_VALUE)
{
// 显示信息
printf("管道打开失败!\n");
_getch();
return -2;
}
else
{
printf("成功打开管道!\n"); // 显示信息
}
// 向管道写入数据
if (WriteFile(hPipe, Message, Message.GetLength(), &WriteNum, NULL) == FALSE)
{
printf("数据写入管道失败!\n"); // 显示信息
}
else
{
printf("数据成功写入管道!\n");// 显示信息
}
CloseHandle(hPipe); // 关闭管道句柄

_getch();
return 0;
}

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧