- UID
- 3260
- 精华
- 积分
- 648
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
管道技术中的命名管道(Named Pipes),顾名思义,这个管道肯定是有名字的,联想到秒杀多线程面试题中的事件、互斥量、信号量
它们的名字主要是用于确保多个进程访问同一个对象。因此肯定也可以通过管道的名字来确保多个进程访问同一个管道。
事实上,命名管道不仅可在同一台计算机的不同进程之间传输数据,甚至能在跨越一个网络的不同计算机的不同进程之间,支持可靠的、单向或双向的数据通信。
管道名称,采用的形式是:\\servername\pipe\pipename。如果是本机管道,servername用“.”来表示。
操作很简单,建立接受线程
- Threaddetach ThreadCreate(Cast(Any Ptr,@管道接受),0) '必须多线程,不然会....
复制代码
接受,循环轮查
- '--------------------------------------------------------------------------
- Sub 管道接受(aa As Long) ' 服务端
- Dim hPipe As HANDLE
- 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)
- Dim szBuffer As ZString * 256, dwLen As Long, tt As String
- Do
- If ConnectNamedPipe(hPipe, Null) <> 0 Then
- ' 有客户端连接到服务端"
- FF_Control_SetText HWND_FORM1_TEXT2, tt
- Do
- If ReadFile(hPipe, @szBuffer, 256, @dwLen, Null) = 0 Then ';//读取管道中的内容(管道是一种特殊的文件)
- Exit Do '客户端断开连接
- Else
- If dwLen > 0 Then
- tt = Mid(szBuffer, 1, dwLen -1) '得到数据
- End If
- End If
- Loop
- ' Time & " 客户端断开连接"
- DisconnectNamedPipe(hPipe)
- End If
- Loop
- CloseHandle(hPipe) ';//关闭管道
- End Sub
复制代码
发送数据
- Dim szBuffer As ZString * 256, dwLen As Long, tt As String
- Dim hPipe As HANDLE
- tt="\\.\pipe\NamePipe_BBBBBBB" '对方服务端的名称,不能是自己服务端的名称
- If (WaitNamedPipe(StrPtr(tt), 1000) = False) Then
- ' 连接命名管道失败"
- Else
- hPipe = CreateFile(StrPtr(tt), GENERIC_READ Or GENERIC_WRITE, 0, Null, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, Null)
- If hPipe = INVALID_HANDLE_VALUE Then
- ' "打开命名管道失败"
- Else
- szBuffer = "发送的内容......"
- WriteFile(hPipe, @szBuffer, Len(szBuffer) + 1, @dwLen, Null)
- CloseHandle(hPipe) '发完了,断开连接
- End If
- End If
复制代码
连接后,只能1个读另1个写,不然就发生死锁
发完数据后,就断开,避免下次连接发生死锁
其实很简单,
注:本例题源码下载,请进 B语言编程群:78458582 |
|