网际网路程式设计(copy)

 网际网路程式设计
Chpater 16
16-1 Windows Networking基本概念
在Microsoft Windows的环境裏,"Windows Networking"泛指由Microsoft Windows NT/2000 Server或95/98所提供的网路资源,如分享目录,印表机等,可透过"连线网路磁碟机","中断网路磁碟机","网路印表机"及"网路芳邻"等功能来达成.
一般而言,网路架构大致如下:
网路服务提供者(Network Service Provider):如Windows NT/2000 Server,Novell NetWare,Linux,AppleTalk等.
网域(Domain).
伺服器(Server):如Windows NT Server.
资源分享(Network Resource):如目录,印表机等.
虽然Microsoft .NET提供不少的Class Library,但在网路资源应用程式上,并无相关的Class Library,因此必须使用Windows API处理.Microsoft Windows提供了一组API来支援网路资源应用(Windows Networking)此种类型的功能,称为Microsoft Windows Networking API,简称为WNet.
运用Microsoft Windows Networking API来建立网路资源的好处是,由於在网路中,网服务提供者(Network Provider)不一定是由Microsoft Windows NT/2000 Server所组成的,亦有可能是Novell,Linux,UNIX等其它类型的Server,因此若由应用程式来判断,将造成不少的麻类,也较不易达成.而Microsoft Windows Networking API的好处就是"Network Independence",不论网服务提供者为何,只要是已连上线的网路,并且提供网路资源分享,应用程式均可透过Microsoft Windows Networking API浏览,新增或结束网路上的资源.
有关Microsoft Windows Networking API函数,主要是透过MPR.DLL提供,Microsoft Windows Networking API共提供以下之函数功能:
WNetAddConnection:建立网路资源连线.
WNetAddConnection2:建立网路资源连线.
WNetAddConnection3:建立网路资源连线.
WNetCancelConnection:结束网路连线.
WNetCancelConnection2:结束网路连线.
WNetCloseEnum:结束网路资源列举.
WNetConnectionDialog:开启连线对话盒,以建立网路资源的连线.
WnetConnectionDialog1:开启连线对话盒,以建立网路资源的连线.
WNetDisconnectDialog:开启中断连线对话盒,以中断网路资源的连线.
WNetDisconnectDialog1:开启中断连线对话盒,以中断网路资源的连线.
WNetEnumResource:列举网路资源.
WNetGetConnection:取得本机(Local)或连线资源的网路名称.
WNetGetLastError:取得网路错误讯息.
WNetGetNetworkInformation:取得网路中Network Provider的资讯.
WNetGetProviderName:取得网路中Network Provider的名称.
WNetGetResourceInformation:取得网路中提供网路资源的Network Provider资讯.
WNetGetResourceParent:取得网路中提供网路资源的Network Provider.
WNetGetUniversalName:取得网路中一个文件的远程名称及UNC(Universal Naming Convention)名称.
WNetGetUser:取得用以连接网路资源的使用者名称.
WNetOpenEnum:启动网路资源列举.
WNetUseConnection:建立网路资源连线(类似WnetAdd Connection3).
MultinetGetConnectionPerformance:取得网路效能.
透过Microsoft Windows Networking API,应用程式可以:
浏览网路中可使用的网路资源(Enumerate Network Resource).
建立资源连线(Add Connection).
结束资源连线(Cancel Connection).
取得网资源的相关资讯,如使用者名称,Network Provider资讯等.
16-2 连线网路磁碟机/浏览印表机连接埠
在Microsoft Windows的系统中,欲使用网路中所共用的目录或档案,可使用档案总管中的"连线网路磁机"(Map Network Driver)的功能来达成,如下图所示:
欲开启连线网路磁碟机对话盒,最简单的方法是使用WNet API所提供的WNetConnectionDialog函数,其宣告方式:
Public Function WnetConnectionDialog _
(ByVal hwnd As Integer, _
ByVal dwType As Integer) As Integer
End Function
参数表:
参数
Integer
dwType
连线网路磁碟机对话盒之父视窗的hwnd
Integer
hwnd
说明
类型
参数
其中dwType参数为以下之设定值:
浏览印表机资源
2
RESOURCETYPE_PRINTER
浏览磁碟机资源
1
RESOURCETYPE_DISK
说明

设定值
回传值:
(Integer)0表示成功.如使用者取消操作,则返回-1.如错误讯息为ERROR_EXTENDED_ERROR,则可使用WNetGetLastError取得额外的错误讯息.
错误讯息:
Insufficient memory
ERROR_NOT_ENOUGH_MEMORY
No network
ERROR_NO_NETWORK
Invalid password
ERROR_INVALID_PASSWORD
Network error
ERROR_EXTENDED_ERROR
说明

16-3 中断网路磁碟机/印表机
与连线网路WNetConnectionDialog相对应的,则是Wnet Disconnect Dialog函数,利用此函数,可出现如下图之对话盒,以便使用者中断网路磁碟机之连线.
WNetDisconnectDialog宣告方式如下:
Public Function WNetDisconnectDialog _
(ByVal hwnd As Integer, _
ByVal dwType As Integer) As Integer
End Function
参数表
设成RESOURCETYPE_DISK或RESOURCETYPE _PRINTER,决定要中断的是磁碟机或是印表机资源
Integer
dwType
中断连线对话盒之父视窗的hwnd
Integer
hwnd
说明
类型
参数
回传值:
(Integer)0表示成功.如使用者取消操作,则返回-1.如错误讯息为ERROR_EXTENDED_ERROR,则可使用WNetGetLastError取得额外的错误讯息.
错误讯息:
Insufficient memory
ERROR_NOT_ENOUGH_MEMORY
No network
ERROR_NO_NETWORK
Invalid password
ERROR_INVALID_PASSWORD
Network error
ERROR_EXTENDED_ERROR
说明

16-4 建立网路资源连线 - 1
Microsoft Windows Networking API提供了一组API,用以建立网路资源连线:
WNetAddConnection
WNetAddConnection2
WNetAddConnection3
这三个API都是用以建立网路源连线,其宣告方式大同小异.
WNetAddConnection宣告方式:
_
Public Function WNetAddConnection _
(ByVal lpszNetPath As String, _
ByVal lpszPassword As String, _
ByVal lpszLocalName As String) As Integer
End Function
参数表
磁碟机代号.(例如,G: or LPT1:)
String
lpszLocalName
密码.如为NULL,表示采用目前使用者的密码.如为一个空字串,则不用任何密码
String
lpszPassword
欲连线的网路名称
String
lpszNetPath
说明
类型
参数
WNetAddConnection一共有三个参数,分别代表:
欲连线的共享路径(lpszNetPath):例如笔者网路中有一Server名为"LeoHuang",其中"D"为其共享名称,则其共享路径为//LeoHuang/D.
密码(lpszPassword):为登录共享路径所须之密码.
磁碟机代码(lpszLocalName):则本机显示共享路径之代码,可为磁碟机名称或印表机连接埠,例如:F:或LTP1.
范例16-4 WNetAddConnection.sln
16-5 建立网路资源连线 - 2
相对於WNetAddConnection函数,WNetAddConnection2函数则更为复杂且完整,并适用各类Microsoft Windows系统,主要的差异在於WNetAddConnection2需定义:
欲连线的共享路径名称.
磁碟机代码.
使用者登录名称.
密码.
连线资源型态,如磁碟机,印表机等.
网路Provider名称,如Microsoft Windows Network.
WNetAddConnection2宣告方式:
Declare Function WNetAddConnection2 Lib "mpr.dll" _
Alias "WNetAddConnection2A"_
(ByRef lpNetResource As NETRESOURCE, _
ByVal lpPassword As String, _
ByVal lpUserName As String, _
ByVal dwFlags As Integer) As Integer
参数表
常数,CONNECT_UPDATE_PROFILE表示建立永久性连线.
Integer
dwFlags
用於连线的使用者名称.如为NULL,表示使用当前使用者.Windows 95/98:须为NULL或空字串.
String
lpUserName
密码.如为NULL,表示采用目前使用者的密码.如为一个空字串,则不用任何密码.
String
lpPassword
定义连线网路资源.
NETRESOURCE
lpNetResource
说明
类型
参数
其中NETRESOURCE结构参数之宣告:
Structure NETRESOURCE
Dim dwScope As Integer
Dim dwType As Integer
Dim dwDisplayType As Integer
Dim dwUsage As Integer
Dim lpLocalName As String
Dim lpRemoteName As String
Dim lpComment As String
Dim lpProvider As String
End Structure
其中:
dwScope:代表连线范围,可为以下之参数:
曾经被连线之资源
&H3
RESOURCE_REMEMBERED
所有可连线之资源
&H2
RESOURCE_GLOBALNET
已连线之资源
&H1
RESOURCE_CONNECTED
说明

参数
dwType:代表连线资源为磁碟机或印表机,可为以下之参数:
印表机
&H2
RESOURCETYPE_PRINT
磁碟机
&H1
RESOURCETYPE_DISK
所有资源
&H0
RESOURCETYPE_ANY
说明

参数
dwDisplayType
共享
&H3
RESOURCEDISPLAYTYPE_SHARE
Server
&H2
RESOURCEDISPLAYTYPE_SERVER
Domain
&H1
RESOURCEDISPLAYTYPE_DOMAIN
任意
&H0
RESOURCEDISPLAYTYPE_GENERIC
说明

参数
dwUsage
可由WNetOpenEnum列举之网路资源
&H2
RESOURCEUSAGE_CONTAINER
可连线之资源
&H1
RESOURCEUSAGE_CONNECTABLE
说明

参数
lpLocalName:磁碟机代号,如F:或LTP1.
lpRemoteName:欲连线的网路名称.
lpProvider:网路Provider名称.
回传值:
(Integer)0表示成功.如使用者取消操作,则返回-1.如错误讯息为ERROR_EXTENDED_ERROR,则可使用WNetGetLastError取得额外的错误讯息.
16-6 建立网路资源连线 - 3
除了WNetAddConnection与WNetAddConnection2之外,外,WNet API另外提供WnetAddConnection3建立网路资源连线.
Declare Function WNetAddConnection3 Lib "mpr.dll" _
Alias "WNetAddConnection3A" _
(ByVal hwnd As Integer, _
ByRef lpNetResource As NETRESOURCE, _
ByVal lpPassword As String, _
ByVal lpUserName As String, _
ByVal dwFlags As Integer) As Integer
参数表
常数,CONNECT_UPDATE_PROFILE表示建立永久性连线.
Integer
dwFlags
用於连线的使用者名称.如为NULL,表示使用当前使用者.Windows 95/98:须为NULL或空字串.
String
lpUserName
密码.如为NULL,表示采用目前使用者的密码.如为一个空字串,则不用任何密码.
String
lpPassword
定义连线网路资源.
NETRESOURCE
lpNetResource
Handle of Window.
Integer
hwnd
说明
类型
参数
回传值:
(Integer)0表示成功.如使用者取消操作,则返回-1.如错误讯息为ERROR_EXTENDED_ERROR,则可使用WNetGetLastError取得额外的错误讯息.
16-7 中断网路资源连线 - 1
在Microsoft Windows系统中,欲中断某一网路资源连线,可利用档案总管在连线资源上按下滑鼠右键,当出现Popup Menu选单时,选取"中断(D)"则可完成中断网路连线的程序.
WNet API中用以中断网路资源连线的API有:
WNetCancelConnection
WNetCancelConnection2
此API与之前所介绍的WNetDisconnectDialog雷同,均为中断资源连线之用,不同的是WNetDisconnectDialog会出现"中断网路资源"对话盒,而WNetCancelConnection与WNetCancelConnection2,则直接中断所指定之磁碟机代号.
WNetCancelConnection宣告方式
Declare Function WNetCancelConnection Lib "mpr.dll" _
Alias "WNetCancelConnectionA"_
(ByVal lpszName As String, _
ByVal fForce As Integer) As Integer
参数表
如为TRUE,即使连线的资源上有正在打开的文件或作业,则依然中断连线.
如为FALSE,则若连线的资源上有正在打开的文件或作业,则中断连线失败.
Integer
fForce
已连线资源的远程名称或本地名称.
String
lpszName
说明
类型
参数
16-8 中断网路资源连线 - 2
WNet API在支援中断网路连的函数上,除了WNetDisconnectDialog,WNetDisconnectDialog1及WNetCancelConnection之外,另外一个API则是WNetCancelConnection2.
WNetCancelConnection2与WNetCancelConnection雷同,除了之前的lpName及fForce参数之外,另外加入dwFlags参数.
WNetCancelConnection2的宣告方式
Declare Function WNetCancelConnection2 Lib "mpr.dll" _
Alias "WNetCancelConnection2A" _
(ByVal lpName As String, _
ByVal dwFlags As Integer, _
ByVal fForce As Integer) As Integer
参数表
如为TRUE,即使连线的资源上有正在打开的文件或作业,则依然中断连线.
如为FALSE,则若连线的资源上有正在打开的文件或作业,则中断连线失败.
Integer
fForce
常数CONNECT_UPDATE_PROFILE,表示结束永久性连线
Integer
dwFlags
已连线资源的远程名称或本地名称
String
lpName
说明
类型
参数
16-9 取得连线资源名称
在Microsoft网路中,欲表达某一网路资源名称,是用以下方式表示之:
而在Microsoft Windows系统中,当成功的连结至网路上的资源后,档案总管中会显示其连结资源名称,并用以下方式表示之:
///
"共享资源名称"於'Server'(本机磁碟机名称)
若想取得此连线资源名称,可使用WNet API的WnetGetConnection.
Declare Function WNetGetConnection Lib "mpr.dll" _
Alias "WNetGetConnectionA" _
(ByVal lpszLocalName As String, _
ByVal lpszRemoteName As String, _
ByRef cbRemoteName As Integer) As Integer
参数表
lpszRemoteName的长度.
Integer
cbRemoteName
指定字串buffer,用於取得回传连线资源的网路名称.
String
lpszRemoteName
磁碟机代号,例如F:.
String
lpszLocalName
说明
类型
参数
16-10 取得网路连线用者名称
在Microsoft Windows网路环境中,不论登入本机或网路上所共享的资源,均需使用者名称以兹登入确认,欲取得此使用者名称,可使用WNetGetUser函数取得用以连接网路资源的使用者名称.
Declare Function WNetGetUser Lib "mpr.dll" _
Alias "WNetGetUserA" _
(ByVal lpName As String, _
ByVal lpUserName As String, _
ByRef lpnLength As Integer) As Integer
参数表
lpUserName的长度
Integer
lpnLength
指定字串buffer,用於取得回传连接网路资源的使用者名称.
String
lpUserName
磁碟机代号,例如F:.若为NULL,则取得本机的使用者名称.
String
lpName
说明
类型
参数
16-11 WNet API延伸错误讯息
如同所有函数一般,WNet API也提供了错误讯息的控制 - WNetGetLastError.
大部份的WNet API都会回传一Integer值(dwResult),若执行成功,则dwResult会等於NO_ERROR(=0),若执行失败,则会回传相对应的错误码,其中若错误码为ERROR_EXTENDED_ERROR(=1208),则可以利用WNetGetLastError函数取得更进一步的延伸错误讯息.
WNetGetLastError的宣告方式
Declare Function WNetGetLastError Lib "mpr.dll" _
Alias "WNetGetLastErrorA" _
(ByRef lpError As Integer, _
ByVal lpErrorBuf As String, _
ByVal nErrorBufSize As Integer, _
ByVal lpNameBuf As String, _
ByVal nNameBufSize As Integer) As Integer
参数表
lpNameBuf的长度
Integer
nNameBufSize
指定字串,用於回传网路Provider名称
String
lpNameBuf
lpErrorBuf的长度
Integer
nErrorBufSize
指定字串,用於回传网路错误的说明
String
lpErrorBuf
用於回传网路错误代码.具体的代码由网路Provider决定
Integer
lpError
说明
类型
参数
回传值:
(Integer)0表示成功.ERROR_INVALID_ADDRESS表示无效.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值