如何用命名管道实现局域网上两台主机间的文件拷贝

作者&投稿:满良 (若有异议请与网页底部的电邮联系)
VC 命名管道如何局域网通信~

本地套接字链接如果正确的话,两台主机之间通信就不应该有问题,如果通信不成功,现考虑一下防火墙。

管道?

能实现局域网上两台主机间文件拷贝的方法有很多种,这里介绍的“命名管道”(Named Pipe )是一种比较可靠的进程间通信机制,可用在同一台计算机不同进程间,也可用在不同计算机的不同进程间,可以是单向的,也可以是双向的,Windows NT、Windows 2000、Windows 95和Windows 98均提供了对它的支持,而且在Unix下也有类似的概念。它是在Microsoft LAN管理器和IBMLAN服务器网络操作系统上实现的。
命名管道使用了MSNP(微软网络提供者)重定向器,这样应用程序便可以不用了解网络协议的细节而利用该机制实现网络上的数据传输。它采用“命名管道文件系统”(Named Pipe File System)接口,其命名是采用UNC(通用命名规范)格式的:
\\ServerName\Pipe\[pipename]
\\ServerName指明命名管道是在那个服务器上创建的,ServerName既可以是一个实际的计算机名,也可以是小数点(“.”)以指明是在本机上创建;\Pipe是一个硬编码(Hardcode)不用区分大小写的字符串用以指明这是一个管道名,该文件名从属于NPFS;[pipename]是实际的自定义的管道名,该名称在前面指定的服务器上必须是唯一的,该名称可以包含多级目录,但目录名必须不是已经创建的管道名,例:
\\.\Pipe\xyPipe’这是一个合法管道名
\\.\Pipe\xyPipe\Pipe’这不是一个合法的管道名,因为前面的目录\\.\Pipe\xyPipe是一个已经创建的管道名了。
\\.\Pipe\xxyPipe\Pipe’这也是一个合法的文件名
命名管道有两种基本通信模式:字节模式和消息模式。在字节模式中,数据是以字节流的形式在管道种传输,数据之间没有边界,在管道写入和读出操作中是以字节流即数据块为基本单位操作的,这适合传输大容量数据;在消息模式中,数据是以一条条不连续的消息为基本传输单元,消息和消息之间有边界,在管道写入和读出操作中也是以消息为单位进行操作的,这种方式适合传输量小的数据。因为现在的文件大小常常有几百K甚至更大,所以程序中选择使用字节模式。
下面详细介绍一下CreateNamedPipe()这个函数,该函数C原型如下:
HANDLE CreateNamedPipe(
LPCTSTR lpName, // pointer to pipe name
DWORD dwOpenMode, // pipe open mode
DWORD dwPipeMode, // pipe-specific modes
DWORD nMaxInstances, // maximum number of instances
DWORD nOutBufferSize, // output buffer size, in bytes
DWORD nInBufferSize, // input buffer size, in bytes
DWORD nDefaultTimeOut, // time-out time, in milliseconds
LPSECURITY_ATTRIBUTES lpSecurityAttributes // pointer to security attributes
);
lpName:为前面所述的命名管道名。
dwOpenMode:为命名管道打开的模式,有PIPE_ACCESS_DUMPLEX(双向)、PIPE_ACCESS_INBOUND(输入)、PIPE_ACCESS_OUTBOUND(输出)这三种,这些标志还可以和一些附加的I/O控制和安全模式的常数组合使用,详细可参考MSDN。
dwPipeMode:为管道传输模式,有前面所述的PIPE_TYPE_BYTE(字节模式)和PIPE_TYPE_MESSAGE(消息模式)两种,可以和PIPE_READMODE_BYTE和PIPE_READMODE_MESSAGE常数组合使用以限定客户端的读取模式。可以使用PIPE_TYPE_MESSAGE 和 PIPE_READMODE_BYTE组合来指定发送者以消息模式向管道发送数据,而接收者一次可以读取任意数量的字节。注意不可将PIPE_TYPE_BYTE和PIPE_READMODE_MESSAGE组合使用,这样会导致CreateNamedPipe()函数调用失败,因为字节模式没有边界,在接收端用消息模式读取的时候无法判断消息的边界。
nMaxInstances:管道最大的连接实例句柄,其范围在1到255之间。
nOutBufferSize和nInBufferSize分别指明管道输出和输入缓冲区的大小,如设为0则使用系统默认大小。
nDefaultTimeOut以毫秒为单位设定客户机等待同命名管道建立连接的最长时间。
LpSecurityAttruibutes为一个安全描述符,设为Null表示使用系统默认的描述符,同时句柄不可继承。
要注意的是在程序中命名管道的写操作中一次最大只能写64K字节的数据,
下面是服务器端程序:
(模块中):
Public Declare Function CreateNamedPipe Lib "kernel32" Alias "CreateNamedPipeA" (ByVal lpName As String, ByVal dwOpenMode As Long, ByVal dwPipeMode As Long, ByVal nMaxInstances As Long, ByVal nOutBufferSize As Long, ByVal nInBufferSize As Long, ByVal nDefaultTimeOut As Long, ByVal lpSecurityAttributes As Long) As Long
Public Declare Function ConnectNamedPipe Lib "kernel32" (ByVal hNamedPipe As Long, ByVal lplong As Long) As Long
Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lplong As Long) As Long
Public Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lplong As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function WaitNamedPipe Lib "kernel32" Alias "WaitNamedPipeA" (ByVal lpNamedPipeName As String, ByVal nTimeOut As Long) As Long
Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Public Declare Function DisconnectNamedPipe Lib "kernel32" (ByVal hNamedPipe As Long) As Long
Public Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long Public Const PIPE_ACCESS_DUPLEX = &H3
Public Const PIPE_ACCESS_INBOUND = &H1
Public Const PIPE_ACCESS_OUTBOUND = &H2
Public Const PIPE_CLIENT_END = &H0
Public Const PIPE_NOWAIT = &H1
Public Const PIPE_READMODE_BYTE = &H0
Public Const PIPE_READMODE_MESSAGE = &H2
Public Const PIPE_SERVER_END = &H1
Public Const PIPE_TYPE_BYTE = &H0
Public Const PIPE_TYPE_MESSAGE = &H4
Public Const PIPE_UNLIMITED_INSTANCES = 255
Public Const PIPE_WAIT = &H0
Public Const FILE_SHARE_READ = &H1
Public Const FILE_SHARE_WRITE = &H2
Public Const GENERIC_READ = &H80000000
Public Const GENERIC_WRITE = &H40000000
Public Const GENERIC_EXECUTE = &H20000000
Public Const GENERIC_ALL = &H10000000
Public Const OPEN_EXISTING = 3
Public Const ERROR_PIPE_BUSY = 231&
Public Const ERROR_PIPE_CONNECTED = 535&
Public Const ERROR_PIPE_LISTENING = 536&
Public Const ERROR_PIPE_NOT_CONNECTED = 233&
Public Const ERROR_NO_DATA = 232& Public Const BufferSize& = 51200
Public hNamePipe&, hFile&, strNamePipe$ Form中有三个按钮,分别是“创建命名管道”(CreateNPipe)、“发送文件”(SendFile)、“关闭命名管道”(CloseNamePipe),窗口中还有一个CommonDialog控件,命名为“CDlg1”。Form中代码:
Dim outBuffer() As Byte, inBuffer() As Byte, BytesRead As Long, BytesWrite As Long, BytesReaded As Long, BytesWrited As Long
Private Sub CloseNamePipe_Click()
DisconnectNamedPipe hNamePipe
CloseHandle hNamePipe
CreateNPipe.Enabled = True
SendFile.Enabled = False
CloseNamePipe.Enabled = False
End Sub Private Sub CreateNPipe_Click()
Dim hReturn&
strNamePipe = "\\.\pipe\xyvanPipe"
hNamePipe = CreateNamedPipe(strNamePipe, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE Or PIPE_READMODE_BYTE, 1, 0, 0, 0, 0)
If hNamePipe <> -1 Then
hReturn = ConnectNamedPipe(hNamePipe, 0)
If hReturn = 0 Then
MsgBox "管道无法等待客户端的连接!", vbInformation Or vbOKOnly
Unload Me
Else
Label1 = "已同客户机连接上!"
End If
CreateNPipe.Enabled = False
SendFile.Enabled = True
CloseNamePipe.Enabled = True
Else
MsgBox "无法创建命名管道!", vbInformation Or vbOKOnly
Unload Me
End If
End Sub Private Sub Form_Load()
With CDlg1
.CancelError = True
.DialogTitle = "请选择要传输的文件:"
.filename = ""
.Filter = "所有文件(*.*)|*.*"
.Flags = cdlOFNExplorer Or cdlOFNFileMustExist Or cdlOFNPathMustExist
.InitDir = "d:\"
End With
SendFile.Enabled = False
CloseNamePipe.Enabled = False
End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
DisconnectNamedPipe hNamePipe
CloseHandle hFile
CloseHandle hNamePipe
End Sub Private Sub SendFile_Click()
On Error Resume Next
Dim strFileName$, lpFileSize&, lpFileSizeHigh&, lpFileSizeLeast&, byteEnd() As Byte
Dim strShortName$
CDlg1.ShowOpen
If Err.Number = 32755 Then Exit Sub
strFileName = CDlg1.filename
strShortName = CDlg1.FileTitle
hFile = CreateFile(strFileName, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)
If hFile = -1 Then
MsgBox "无法打开文件" & strFileName, vbInformation Or vbOKOnly
Exit Sub
End If
lpFileSize = GetFileSize(hFile, lpFileSizeHigh)
If lpFileSize = 0 Then
MsgBox "该文件大小为零,不用发送!", vbInformation Or vbOKOnly
CloseHandle hFile
Exit Sub
End If
lpFileSizeLeast = lpFileSize byteEnd() = StrConv(strShortName, vbFromUnicode)
ReDim outBuffer(UBound(byteEnd))
ByteCopy byteEnd, outBuffer
WriteFile hNamePipe, byteEnd(0), UBound(byteEnd) + 1, BytesWrited, 0 '发送短文件名
ReDim inBuffer(5)
ReadFile hNamePipe, inBuffer(0), 6, BytesReaded, 0 '读取客户端对话信息
If StrConv(inBuffer, vbUnicode) = "Cancel" Then
MsgBox "客户端保存时选择了取消,发送终止!", vbInformation Or vbOKOnly
CloseHandle hFile
Exit Sub
End If
Label1.Caption = "正在传输中…"
While lpFileSize > 0
If lpFileSize > BufferSize Then
ReDim outBuffer(BufferSize - 1)
ReadFile hFile, outBuffer(0), BufferSize, BytesReaded, 0
WriteFile hNamePipe, outBuffer(0), BytesReaded, BytesWrited, 0
Else
ReDim outBuffer(lpFileSize - 1)
ReadFile hFile, outBuffer(0), lpFileSize, BytesReaded, 0
WriteFile hNamePipe, outBuffer(0), lpFileSize, BytesWrited, 0
End If
lpFileSize = lpFileSize - BytesReaded
ReadFile hNamePipe, inBuffer(0), 6, BytesReaded, 0
Wend byteEnd() = StrConv("EOF", vbFromUnicode)
ReDim outBuffer(UBound(byteEnd))
ByteCopy byteEnd, outBuffer
WriteFile hNamePipe, outBuffer(0), 3, BytesWrited, 0
CloseHandle hFile
Label1 = "传送文件完毕!"
End Sub
Public Sub ByteCopy(bySrc() As Byte, byDes() As Byte)
Dim I As Long
For i = LBound(bySrc) To UBound(bySrc)
byDes(i) = bySrc(i)
Next
End Sub 剩下的你加我QQ我发肥你给你83989024


如何用命名管道实现局域网上两台主机间的文件拷贝
能实现局域网上两台主机间文件拷贝的方法有很多种,这里介绍的“命名管道”(Named Pipe )是一种比较可靠的进程间通信机制,可用在同一台计算机不同进程间,也可用在不同计算机的不同进程间,可以是单向的,也可以是双向的,Windows NT、Windows 2000、Windows 95和Windows 98均提供了对它的支持,而且在Unix下也有类似的...

命名管道是什么意思?
1. 持久性:命名管道在文件系统中作为文件存在,这意味着它们可以跨越多个进程的生命周期存在。一旦命名管道被创建,只要它不被显式删除,它就可以持续存在,供不同的进程在不同的时间进行通信。2. 通信机制:命名管道提供了一种单向的通信机制。一个进程可以将数据写入管道,而另一个进程可以从管道中读...

命名管道是什么意思?
不同计算机的不同进程之间,支持可靠的,单向或双向的数据通信.用命名管道来设计应用 程序实际非常简单,并不需要事先深入掌握基层网络传送协议(如T C P \/ I P或I P X)的知识.这 是由于命名管道利用了微软网络提供者(M S N P)重定向器,通过一个网络,在各进程间建立 通信.这样一来,应用程序便不...

什么是命名管道漏洞?
不同计算机的不同进程之间,支持可靠的,单向或双向的数据通信.用命名管道来设计应用 程序实际非常简单,并不需要事先深入掌握基层网络传送协议(如T C P \/ I P或I P X)的知识.这 是由于命名管道利用了微软网络提供者(M S N P)重定向器,通过一个网络,在各进程间建立 通信.这样一来,应用程序便不...

在linux下可以用命名管道实现c程序与qt的数据通信吗?
当然可以了。不过可以直接使用dbus进行进程间通讯,C程序发送数据(libdbus),Qt去捕获信号(QDbus),这样来的更方便点,否则你要自己封装管道的收发接口。

如何通过CreateNamedPipe实现不同机器两个进程间的通信?
如你要创建一个名为MyPipe的命名管道 就这样在MFC中写:HANDLE hPipe;hPipe=CreateNamedPipe("\\\\\\.\\\\pipe\\\\MyPipe",PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,0,1,1024,1024,0,NULL);\/\/注意"\\\\.\\pipe\\pipename"在实际写的过程中是双斜杠"\\\\\\.\\\\pipe\\\\pipename"你要不同电脑的话就把圆...

unix系统中,哪些可以用于进程间的通信?
一、管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。二、命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过...

createnamedpipe 管道有什么用
windows底 进程间进行管道通信其相干进程间用命名管道 进程创建管道(server)另外进程(client)连接管道连接称作 instance (实例)每实例与管道handle 捆绑 instance概念连接实例 捆绑 同命名通道由实现一管道通

什么是Named Pipes
任何进程都可以访问命名管道, 都可以接受安全检查, 这使得命名管道成为关联进程和非关联进程之间通信的一种简单方式.任何进程都可以既做server, 又做client, 这使得点对点的对等通信成为可能. 正如这里用到的那样, 术语"pipe server”指的是创建named pipe的进程, 术语"pipe client"指的是连接到一个...

linux系统下进程通信的6种方式分别是什么?它们的区别在什么地方?线程通 ...
管道可以用于shell重定向,也就是命令管道类似grep 命名管道可以实现通信,通过makefifo传递消息 消息队列也可以实现通信,不过相比命名管道有消息过滤的好处 信号其实就是KILL的应用 信号量是对临界共享资源的合理调度 共享内存, 就是字面意思共享的内存 而线程通信方式有:互斥锁,条件变量,读写锁 ...

历城区14751705877: 用命名管道进行两台机器的通信,即在网络上两个进程进行通信,WaitNamedPipe函数的第一个参数应该怎么样写 -
壬中泰托: Win32位API集支持的命名管道(named pipe)是实现网络进程间通信的一种有效手段.命名管道的接口比较简单,在程序中实现比较方便,由其开发的应用程序也很容易使用,只要知道机器及管道的名称即可连接两台机器上的两个进程....

历城区14751705877: 如何只用路由器建立2台电脑的共享
壬中泰托: XP用户:在任意一个文件夹上单击右键,选择[属性],在[共享]选项卡中按提示向导操作即可. Vista用户:回到[网络和共享中心],点击[网络]右边的[自定义],将网络类型设置为[专用网络] 在[共享和发现]中,分别将[网络发现]、[文件共享]、[密码...

历城区14751705877: 怎么利用命名管道实现进程间的通信 -
壬中泰托: 我还是比较socket,命名管道要求两个程序共享资源,从某种意义讲,其模块间耦合度高.而socket则逻辑上彼此无关,是一种弱耦合(协议耦合)的方式 再说,某天你想把程序放两台机器上,只要改配置文件即可,命名管道严重限制你的scalability

历城区14751705877: 如何实现两台计算机互连? -
壬中泰托: Vista与XP实现局域网互连互通 网络问题一直是网民所关心的问题,不通、速度慢单机电脑出现的问题都很好解决.然尔随着vista平台的问市,网络中面临着跨新式平台的局域网组网与共享问题,其是否象windows2000系统与windowsxp系统的...

历城区14751705877: 怎么用命令提示符实现两台计算机之间的通信 -
壬中泰托: 首先打开你机器中的messenger服务,确定你们属于同一个局域网 然后在命令提示行中使用net send +ip +你的消息

历城区14751705877: 如何设置局域网两台电脑同时上网
壬中泰托: 使用路由器并设置相应参数就可以,路由器是组建局域网实现网络共享的设备,一般的连接和设置方法如下:将宽带猫出来的网线连接到路由器的WAN口,各个计算机连接到路由器的LAN口,计算机网卡的IP地址设置为自动获取,在计算机浏览器的地址栏输入192.168.1.1(有的是192.168.0.1,具体要查看你计算机网卡得到的网络参数,通过网关的IP地址来登录)登录路由器,一般用户名和密码都是admin,选择WAN口设置,将你申请宽带时候运营商分配给你的宽带网络参数设置到路由器中,让路由器实现自动连接就可以共享上网了

历城区14751705877: 如何利用路由器建立2台电脑的局域网
壬中泰托: 首先保证两台电脑的工作组名字是一样的,再就是IP前三段是相同的,后一段不超过255.再就是网关相同 之后在你想共享的资源上设置共享就能看到了!

历城区14751705877: 怎么样让两台电脑形成局域网?
壬中泰托: 如果仅仅只要形成局域网而不是需要共同访问Internent,最起码有2种方式,硬件连接:1. 用对绞线直接连接2台电脑;2. 采购一台交换机或者路由器(视电脑数量,4口或8口都可以),把所有电脑都用网线连接到交换机(或路由器)上就可以了...

历城区14751705877: 怎么用一个宽带连接两台电脑? -
壬中泰托: 购买一台路由器并设置相关网络参数就可以实现,一台路由器也就100以下的.路由器是组建局域网实现网络共享的设备,一般的连接和设置方法如下:将宽带猫出来的网线连接到路由器的WAN口,各个计算机连接到路由器的LAN口,计算机网卡的IP地址设置为自动获取,在计算机浏览器的地址栏输入192.168.1.1(有的是192.168.0.1,具体要查看你计算机网卡得到的网络参数,通过网关的IP地址来登录)登录路由器,一般用户名和密码都是admin,选择WAN口设置,将你的宽带帐号和密码设置到PPPOE方式中(如果是固定IP要选择静态IP方式),保存重启就可以了

历城区14751705877: 我有两台电脑,用路由器共享上网,如何组建一个局域网? -
壬中泰托: 这个很简单! 首先保证你的接线没有问题.WAN接MODEL,1x,2x,3x,4x其中任意两个接口分别接你的两台电脑. 然后,组建局域网必须建立相同的工作组: 右击“我的电脑”→属性→计算机名 在此选项卡的右下面有个更改的按钮,是用来更改该计算机所假如的“域”的名称,也就是工作组名称.把两台电脑的工作组名称改成同样名称(如“123456”)即可. 最后,按照提示,把修改过工作组的计算机重启.OK!局域网建立完毕! 如果都是自己的电脑,应该对病毒互传比较放心,所以最好把防火墙关掉.然后进CS或者魔兽试试吧,相信应该没问题了!

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网