LabVIEWCompactRIO 开发指南21
使用TCP/IP时处理孤立套接字
无法重新建立侦听TCP套接字是设计基于TCP/IP的应用程序时最常见的挑战之一。此症状是由终止客户端或服务器应用程序后发生的孤立套接字引起的。如果按照本节中所述的技术设计代码,则可以避免此问题。本节概述了孤立套接字以及使用TCP/IP进行网络通信时推荐的设计模式。
孤立套接字概述
使用基于TCP/IP的应用程序,有一个客户端/服务器方案,其中服务器侦听客户端打开连接的特定端口。建立连接后,客户端和服务器将交换数据,直到连接终止。终止可能由以下原因引起:
■故意终止(用户停止服务器或客户端应用程序)
■硬件断开连接或停机
■客户端或服务器应用程序崩溃
如果尝试在终止后立即恢复连接,则会看到一个错误对话框,错误代码为60,来自TCPListen.vi,类似于图4.27中的错误对话框。无法重新建立侦听TCPsocket是由孤立套接字引起的。孤立套接字是启动终止的套接字。如果在尝试重新建立连接之前等待60秒,错误消息将消失。但是,许多系统无法承受60秒的停机时间。
图4.27.客户端/服务器连接终止时生成错误代码60。
60秒超时是有意为之。识别孤立套接字后,TCP/IP会使该套接字在60秒内不可用,以便其他套接字无法与其通信。如果将TCP/IP与邮政服务进行比较,终止相当于一个家庭搬出家。邮政服务暂时关闭该邮箱,以便在新人搬进来时,他们不会收到不属于他们的邮件。TCP/IP故意使套接字不可用,以便它可以通过网络可靠地发送数据。
防止孤立套接字
本节提供了两种防止孤立套接字的方法。
设计应用程序,以便只有客户端才能终止连接
在大多数情况下,孤立套接字问题在服务器端更为严重。通常,客户端端口是动态分配的,但服务器端口是固定的。当服务器关闭连接时,服务器端口将被锁定。如果连接始终从客户端终止,则可以显著降低处理错误60的风险。
设计服务器应用程序时,需要遵循三个规则:
1.不要在超时时忽略超时错误来关闭连接。
2.如果要停止服务器应用程序,请向客户端发送消息并让客户端终止连接。等待非超时错误(62或56),并在出现错误时关闭服务器应用程序。
3.不要在发生事件时关闭服务器应用程序。如果发生应停止应用程序的事件,请向客户端发送消息并让客户端终止连接。然后在出错时关闭服务器应用程序。
图4.28.此示例VI阻止服务器关闭网络连接。
分配动态端口
避免孤立套接字的另一种方法是在客户端和服务器上分配动态端口。有两种方法可以做到这一点:手动使用UDP建立端口(如果安装了STM参考库,请参阅STM Distributed Clients示例)或使用NI服务定位器。要使用NI服务定位器,则需要必须有LabVIEW8.5或更高版本,并且NI服务定位器必须运行。使用NI服务定位器时,将服务名称传递到TCP开放连接和TCP创建侦器函数上的服务名称输入中。
图4.29.使用NI服务定位器确保客户端和服务器上的动态端口分配
需要说明的是,上述的例程和文档,都是可以下载的,双击即可打开,其中压缩文件是可以采用粘贴复制的方式,拷贝到硬盘上。这不是图片,各位小伙伴看到后尝试一下,这个问题就不用加微信咨询了。有关LabVIEW编程、LabVIEW开发等相关项目,可联系们。附件中的资料这里无法上传,可去公司网站搜索下载。