Yesky首页| 产品报价| 行情| 手机 | 数码 | 笔记本 | 台式机 | DIY硬件 | 外设 | 网络 | 数字家庭 | 评测 | 软件 | e时代 | 游戏 | 图片 | 壁纸 | 群乐 | 社区 | 博客 | 下载
您现在的位置: 天极网 > 开发频道 > Win32位程序设计初步之网络通信
全文

Win32位程序设计初步之网络通信

2004-11-09 00:05 作者: QQ新人类编译 出处: 天极网 责任编辑:方舟

  命名管道(Named Pipes)

  命名管道提供了一个确认的传送技术。与网络上的广播方式不同,你通过一个命名管道与另一台机器建立一个不同的连接。如果连接中断。例如是由于一台机器关掉或者网络的某部分有故障,连接的双方都可以在尝试发送或者接收时,马上知道中断的信息。通过一个命名管道,可确保包顺序到达。命名管道的唯一问题是你不能广播包了。要广播任何信息,所有的目标机器都必须与中央的服务器建立一个连接,服务器必须分别传送信息到各个不同的机器上。

  命名管道的创建只比mailslot难一点。列表4和5的程序展示了如何在两个使用命名管道的应用之间,创建一个简单的点对点连接。首先运行列表4中的接收程序,然后在同一机器上运行列表5中的发送程序。该程序将询问你要连接的机器名字。由于你在同一部机器上运行发送和接收的程序,因此可输入“.”或者是你的机器名。你将会看到每隔5秒左右,就有一个信息由发送者传到接收者上。当你关闭发送者的时候,在接收者上就会马上出现一个信息,指示它已经检测出管道连接中断。如果只启动发送的程序,发送者将会马上出错,因为它不能建立一个连接。与mailslot不同,管道可以告诉我们另一端的工作是否正常。

  命名管道连接在网络上的使用与在同一部机器上一样简单。例如,如果列表4中的服务器程序运行在一部称为“orion”的机器上,使用与该机器同样的帐号和密码在另一台不同的机器上登录,在上面运行列表5的程序,要求机器名时,输入“orion”的名字。这样连接就被正确地建立起来了。要注意一点,使用命名管道的时候,你必须要知道运行服务器的机器名字。

  你还要知道,如果使用另一个用户来尝试连接接收器时,连接将会失败。例如用户“jones”在“orion”的机器上运行接收程序,当用户“smith”尝试由另一台机器进行连接时,连接将会失败,并显示一个“拒绝访问”的错误。这是NT的安全系统造成的。你可以看NT书籍的相关部分,了解详细的原因和解决办法。

  在列表4的程序中,通过使用CreateNamedPipe来创建一个命名管道服务器。与CreateNamedPipe函数一起使用的名字通常有以下的形式:

   \\.\pipe\[path]name

与mailslot一样,你可以在管道名字的前面指定一个路径,以区分系统中不同的管道。

  传送给CreateNamedPipe的openMode参数用来决定管道的方向。命名管道可以是单向的,也可以是双向的,在于openMode参数使用的常数,包括有:

PIPE_ACCESS_DUPLEX
PIPE_ACCESS_INBOUND
PIPE_ACCESS_OUTBOUND

  CreateNamedPipe的pipeMode参数决定管道的工作方式,可以是字节流或者是称为信息的字节包。字节流是没有逻辑边界的。信息将一组的字节组合起来作为一个单元传送。你可以在读取和写入时指定一种方式:

PIPE_TYPE_MESSAGE
PIPE_TYPE_BYTE
PIPE_READMODE_MESSAGE
PIPE_READMODE_BYTE

  在一台机器上,一个管道可以有超过一个的实例。这可让一个程序处理多个的客户端,每个使用独立的线程,还必须创建一个命名管道服务器。由于列表4和5中的例子只是一个简单的点对点连接,只需要一个实例,一个实例的最大值在调用CreateNamedPipe时指定。

  列表4中的程序接着会等待一个通过ConnectNamedPipe函数建立的连接。当一个客户端程序使用正确的机器名和命名管道调用CreateFile时,就会与服务器建立起一个连接。在连接时,ConnectNamedPipe函数会返回。你可以选择指定一个交迭的结构,ConnectNamedPipe 将马上返回,然后产生连接的事件。

  列表4的程序然后进入一个循环,等待数据到达。ReadFile函数的工作与操作文件时有点不同。因为这个命名管道是信息的模式,ReadFile只要一接收到一个完整的信息,就会立刻返回。这里使用的是一个阻塞的读取,你也可以选择一个交迭的读取。

  列表5的程序是列表4的一个简单的客户。列表5首先通过CreateFile函数创建连接到命名管道。然后通过使用WriteFile函数写入信息。每次调用WriteFile都会在命名管道的接收端建立一个信息,因此接收者的ReadFile函数将在接收信息时除去阻塞,服务器就会在屏幕上显示一个信息。

  如果两个客户的副本同时尝试连接列表4中的程序,服务器将会拒绝第二个客户。不论是终止客户或者服务器,另一方都将在检测出连接中断时马上终止。
共7页。 9 7 1 2 3 4 5 6 7 8 :
文章阅读排行
周排行
月排行
欢迎订阅天极网RSS聚合资讯:http://www.yesky.com/index.xml