您现在的位置是: 软件 > 开发者网络 > 程序方舟 > 系统编程 > 正文


-Win xp中的多种网络
-试验试验试验试验
-用Freehand实现位图矢量化
-网络电话面面观

Win32程序设计之网络通信
2001-05-31· ·QQ新人类编译··yesky

上一页  1 2 3 4 5 6 7  下一页


  mailslot连接

  使用Win32 API来进行通信时,Mailslots是最简单的方式。在同一网段中,Mailslots提供了一条单向的通信路径,将信息由一个发送者传送到一个或者多个接收者中。如果你想同时发送数据到许多接收者时,可以考虑使用mailslot的方式。

  要创建mailslots是非常简单的,读取和写入都是通过API常见的ReadFile和WriteFile函数进行的。在创建mailslot时,一个特别的路径名会传送到CreateMailslot函数中,可让系统知道要创建一个mailslot而不是一个通常的文件。(这里提到的函数,你都可以从Win32编程者的参考指南、SDK或者Visual C++ V2的Win32帮助文件中找到)

  文章最后有一些程序的列表,在列表1和2中的程序已经尽量地简化,从中你可以很容易地了解到通过一个mailslot来传送和接收数据的必要步骤。列表1展示了如何通过CreateMailslto函数来创建一个mailslot服务器,服务器保存有接收信息的一个队列,直到你使用ReadFile函数来读取它们。存储在队列中的信息以它们到达的顺序排列。

  mailslot的名字必须以\\.\mailslot\[path]name的形式排列。这看来象一个文件名,事实上,它的ReadFile函数操作也与一个文件类似。有点不同的是,该函数并不会创建任何真正的文件:mailslot保存在内存中。在列表1中使用的mailslot名字是:"\\.\mailslot\sms"。为了进一步对mailslot进行分类,你可以在路径中加入“子目录”。

  在你创建mailslot时,你可以指定信息的最大长度,以及读取的超时时间。在网络上,mailslots在一个信息(message)中可传送不超过400字节的信息。如果你将超时的值设置为0,那么不管缓冲中是否有信息,对ReadFile的任何调用都会马上返回。如果你将超时时间设置为一个特定值(以毫秒计),若在定义时间内都没有任何信息到达,读取的操作将会失败。你还可以使用MAILSLOT_WAIT_FOREVER常数来创建一个阻塞的读取。

  列表1使用的是无阻塞的方式,并且使用GetMailslotInfo函数来确保在进行一个读取操作前,mailslot队列中有信息存在。该函数返回队列中信息的最大长度、下一信息的长度和等待的信息数目。程序不断地检测mailslot中是否有信息存在,如果有的话,它就读取第一个,从mailslot中读取信息的操作与读取一个文件类似。

  在网络上的任何计算机,如果要发送信息给一台运行列表1程序的机器,需要提供发送者和接收者的mailslot名字。列表2展示了如何发送信息给一个mailslot。它首先通过常用的CreateFile函数来打开一个到mailslot的可写连接。该程序作为一个mailslot客户端使用,因为它写信息到已经在网络上运行的mailslot服务器上。CreateFile函数通过检查mailslot文件的名字,就知道不是要创建一个文件,而是要与一个mailslot通信。文件名可有4种不同的格式:

\\.\mailslot\[path]name
\\*\mailslot\[path]name
\\domain\mailslot\[path]name
\\machine\mailslot\[path]name


上面的例子中,这些名字分别指定了网络上的本地机器或者某台特定的机器。第二种形式指定了一个到本地主域所有机器的广播操作。第三种形式指定了到某个域的所有机器。对于域和域控制器的详细信息,可参考NT的书籍。

  在打开mailslot后,列表2使用GetComputerName得到本地的计算机名字,然后广播该名字给当前域的所有mailslot,每5秒广播一次。

  列表1使用一个轮询的技术来检查信息。每隔半秒,它就会调用GetMailslotInfo并且检查slot中是否有信息。通常轮询在一个多线程的环境中并不是一个好的技术,因为效率比较低。你可以不用轮询,而是通过设置CreateMailslot中的超时时间为一个适当的值,然后以缓冲为0的参数调用ReadFile来等待信息的到来。一旦ReadFlie返回,你就知道有信息存在,接着可调用GetMailslotInfo和ReadFile,如列表1所示。

  当你运行列表2的程序时,它将广播给网络上的所有机器。如果你在同一或者不同的机器上运行读取器的多个副本,它们都将看到由写入者产生的信息。你也可以在网络上运行多个写入者,读取者都将会看到所有写入者产生的信息。在列表1和2的程序中,要注意到它们都是假定该程序将会从外部终止。你可以使用CloseHandle函数来关闭一个mailslot服务器或者客户端。

上一页  1 2 3 4 5 6 7  下一页

【责任编辑:方舟】
【发表评论】【关闭窗口】
■ 相关内容
 C++BUILDER动态建立菜单及菜单事件
 Win32程序设计之系统安全
 Win32程序设计之服务
 WIN32程序设计之线程
感谢 访问天极网,如果您觉得该文章涉及版权问题,请看这里!