找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2052|回复: 1

【VFB】进程通信之命名管道

[复制链接]

51

主题

31

回帖

648

积分

用户组: 大·技术宅

UID
3260
精华
7
威望
12 点
宅币
506 个
贡献
1 次
宅之契约
0 份
在线时间
23 小时
注册时间
2017-12-26
发表于 2018-5-19 22:30:23 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
管道技术中的命名管道(Named Pipes),顾名思义,这个管道肯定是有名字的,联想到秒杀多线程面试题中的事件、互斥量、信号量

它们的名字主要是用于确保多个进程访问同一个对象。因此肯定也可以通过管道的名字来确保多个进程访问同一个管道。

事实上,命名管道不仅可在同一台计算机的不同进程之间传输数据,甚至能在跨越一个网络的不同计算机的不同进程之间,支持可靠的、单向或双向的数据通信。

管道名称,采用的形式是:\\servername\pipe\pipename。如果是本机管道,servername用“.”来表示。

操作很简单,建立接受线程
  1. Threaddetach ThreadCreate(Cast(Any Ptr,@管道接受),0) '必须多线程,不然会....
复制代码

接受,循环轮查
  1. '--------------------------------------------------------------------------
  2. Sub 管道接受(aa As Long) ' 服务端
  3.   Dim hPipe As HANDLE
  4.   hPipe = CreateNamedPipe(@"\\.\pipe\NamePipe_AAAAAAAAA", PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE Or PIPE_READMODE_MESSAGE Or PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 0, 0, 100, 0)
  5.   Dim szBuffer As ZString * 256, dwLen As Long, tt As String
  6.   Do
  7.       If ConnectNamedPipe(hPipe, Null) <> 0 Then
  8.           ' 有客户端连接到服务端"
  9.           FF_Control_SetText HWND_FORM1_TEXT2, tt
  10.           Do
  11.               If ReadFile(hPipe, @szBuffer, 256, @dwLen, Null) = 0  Then  ';//读取管道中的内容(管道是一种特殊的文件)
  12.                   Exit Do '客户端断开连接
  13.               Else
  14.                   If dwLen > 0 Then
  15.                       tt = Mid(szBuffer, 1, dwLen -1) '得到数据
  16.                   End If
  17.               End If
  18.           Loop
  19.           ' Time & " 客户端断开连接"
  20.           DisconnectNamedPipe(hPipe)
  21.       End If
  22.   Loop
  23.    CloseHandle(hPipe) ';//关闭管道
  24. End Sub
复制代码

发送数据
  1.   Dim szBuffer As ZString * 256, dwLen As Long, tt As String
  2.   Dim hPipe As HANDLE
  3.   tt="\\.\pipe\NamePipe_BBBBBBB"  '对方服务端的名称,不能是自己服务端的名称
  4.   If (WaitNamedPipe(StrPtr(tt), 1000) = False) Then
  5.       ' 连接命名管道失败"
  6.   Else
  7.       hPipe = CreateFile(StrPtr(tt), GENERIC_READ Or GENERIC_WRITE, 0, Null, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, Null)
  8.       If hPipe = INVALID_HANDLE_VALUE Then
  9.           '  "打开命名管道失败"
  10.       Else
  11.           szBuffer = "发送的内容......"
  12.           WriteFile(hPipe, @szBuffer, Len(szBuffer) + 1, @dwLen, Null)
  13.           CloseHandle(hPipe) '发完了,断开连接
  14.       End If
  15.   End If
复制代码

连接后,只能1个读另1个写,不然就发生死锁

发完数据后,就断开,避免下次连接发生死锁

其实很简单,

注:本例题源码下载,请进 B语言编程群:78458582  
回复

使用道具 举报

1

主题

159

回帖

628

积分

用户组: 大·技术宅

UID
7535
精华
0
威望
0 点
宅币
468 个
贡献
0 次
宅之契约
0 份
在线时间
71 小时
注册时间
2021-10-16
发表于 2022-5-17 10:21:02 | 显示全部楼层

珍惜生命,果断回帖。
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-26 04:22 , Processed in 0.040352 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表