c#中怎样实现进程间通信,如何表示管道、共享内存、消息队列?(高分请教)

阿来007 2003-08-26 07:13:21
c#中有没有名字空间用于描述进程间通信(IPC)?
有无管道、共享内存、消息队列?
...全文
2400 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
saucer 2003-08-26
  • 打赏
  • 举报
回复
"P/Invoke", the Platform Invocation facility in .NET used to call DLL functions
alphawin 2003-08-26
  • 打赏
  • 举报
回复
up
daou101 2003-08-26
  • 打赏
  • 举报
回复
saucer(思归, .NET MVP) ,又见到你,好耶!
消息队列,socket,管道都可以,还有web service,Enterprise Service都可以实现,甚至分布式计算(通讯)。
saucer 2003-08-26
  • 打赏
  • 举报
回复
消息队列, see System.Messaging.MessageQueue

共享内存: no

管道: use P/Invoke and API
cppTrier 2003-08-26
  • 打赏
  • 举报
回复
saucer的意思是你用P/Invoke 调用win32 API
阿来007 2003-08-26
  • 打赏
  • 举报
回复
up
阿来007 2003-08-26
  • 打赏
  • 举报
回复
c#中怎么用?
我是用在单机进程间通信,各进程共享同一数据块
alaisalaix 2003-08-26
  • 打赏
  • 举报
回复
Look up these Win32 APIs:

CreateFileMapping
MapViewOfFile
CreateMutex
WaitForSingleObject
_weiKun_ 2003-08-26
  • 打赏
  • 举报
回复
在Windows环境下,实现进程间通信的方式有很多种,如套接字、管道、远程过程调用和NETBIOS等,邮槽是其中实现单通道进程间通信的一种。创建邮槽的进程被称为邮槽服务器,而其它发送消息给邮槽的进程被称为邮槽客户端。邮槽客户端能发送消息给本机的邮槽,也可发送消息给局域网内其他计算机内的邮槽,所有这些消息都存储在邮槽内,直到邮槽服务器读取它。这些消息通常是以广播的方式发送,建立在面向无链接的数据报的基础上,因此在线路不好时传输质量不可靠。

  这种进程间通信的方式比较适用于在局域网环境内传送和接收短消息,也可在局域网内向所有计算机广播消息。

  用邮槽进行进程间通信主要通过三个步骤来实现:创建邮槽服务器,向邮槽发送消息和从邮槽中读取消息。下面笔者将用Windows的API函数来完成这三个步骤。


  一、创建邮槽服务器


  以下代码用于创建一个名叫sample_mailslot的邮槽:

  BOOL FAR PASCAL Makeslot( )

  {

   // 邮槽名称都定义在\\.\mailslot\目录下

  LPSTR lpszSlotName = "\\\\.\\mailslot\\sample_mailslot";

   // 邮槽句柄"hSlot1" 是一个全局变量

   hSlot1 = CreateMailslot(lpszSlotName,0,

  // 对接受的消息没有最大值限制

   MAILSLOT_WAIT_FOREVER, // 没有最大读延迟时间

  (LPSECURITY_ATTRIBUTES) NULL); // 无安全属性

   if (hSlot1 == INVALID_HANDLE_VALUE)

  //创建邮槽失败

   return FALSE;

   return TRUE;

  }


  二、客户端与邮槽服务器通信


  客户端通过API函数向邮槽发送消息,然后消息被广播到域内的每一台计算机上,但只有指定的邮槽接收这些消息。在这里要注意被广播的消息每条不能超过400个字节,但对每个邮槽能接受的消息的数量没有限制。

  BOOL FAR PASCAL Writeslot( ) {

  BOOL fResult;

  HANDLE hFile;

  DWORD cbWritten;

   LPSTR lpszMessage = "Message for sample_mailslot in primary domain";

  hFile = CreateFile("\\\\*\\mailslot\\sample_mailslot",

   GENERIC_WRITE,

   FILE_SHARE_READ,

   (LPSECURITY_ATTRIBUTES) NULL,

   OPEN_EXISTING,

   FILE_ATTRIBUTE_NORMAL,

   (HANDLE) NULL);

  if (hFile == INVALID_HANDLE_VALUE)

  // 创建客户端邮槽句柄失败

   return FALSE;

   fResult = WriteFile(hFile, lpszMessage,

   (DWORD) lstrlen(lpszMessage) + 1,

   &&cbWritten,

  (LPOVERLAPPED) NULL);

   if (!fResult)

  // 发送消息错误

   return FALSE;

  fResult = CloseHandle(hFile);

   return TRUE;

   }


  三、从邮槽中读取数据


  邮槽服务器通过GetMailslotInfo函数判断邮槽中是否有数据,如果有,则通过ReadFile函数从邮槽中读取。下面的代码完成从邮槽中读取一条消息。

  BOOL FAR PASCAL Readslot()

  {

  DWORD cbMessage, cMessage, cbRead;

   BOOL fResult;

   LPSTR lpszBuffer;

   cbMessage = cMessage = cbRead = 0;

  //邮槽句柄hSlot1是一个全局变量

  fResult = GetMailslotInfo(hSlot1,

  // 邮槽句柄

   (LPDWORD) NULL, // 对消息的大小没有最大限制

   &&cbMessage, // 下一条消息的大小

   &&cMessage, // 消息的数量 (LPDWORD) NULL); if(cbMessage == MAILSLOT_NO_MESSAGE)

  // 邮槽内无消息

   { printf( "No waiting messages.");

   return TRUE; }

  // 为消息分配内存

   lpszBuffer = (LPSTR) GlobalAlloc(GPTR, cbMessage);

   lpszBuffer[0] = '\0'; fResult = ReadFile(hSlot1, lpszBuffer, cbMessage, &&cbRead,

   (LPOVERLAPPED) NULL);

   // 显示消息

   Printf("%s",lpszBuffer);

   GlobalFree((HGLOBAL) lpszBuffer);

   return TRUE; }
阿来007 2003-08-26
  • 打赏
  • 举报
回复
to saucer(思归, .NET MVP)
P/Invoke是什么?
哪些API函数用于进程间通信?
消息队列System.Messaging.MessageQueue需不需要把消息队列组件装上?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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