贾志先
摘 要: 在单网卡情况下,实现Socket通信比较简单。在双网卡情况下,如何实现Socket通信,文献报道尚不多见。以开发维吾尔语口语考试系统为例,研究了在双网卡下Socket通信的算法。在维吾尔语口语考试中,通过管理机和考试机之间的Socket通信,实现了对考试机端登录的控制。在管理机端具有双网卡的情况下,可以充分利用网络资源。实验结果表明,所讨论的双网卡Socket通信的方法可行和有效。
关键词: Socket通信;双网卡; 考试软件
中图分类号:TP393.09 文献标识码:A 文章编号:2095-2163(2014)06-
Abstract: It is relatively simple to implement the Socket communication in a single network adapter. However, the literature about how to achieve Socket communication in dual network adapter is rarely reported. In this article, we studied the algorithm of Socket communication in dual network adapter. Take for example the development of the Uyghur oral exam system. Using Socket communication between the management terminal and the exam terminal in the Uyghur oral exam system, it actualized the control of login on exam terminal. In the Uyghur oral exam, it can take full advantage of network resources when exam management terminal has dual network adapter. Experimental results show the method is feasible and effective.
Key Words: Socket Communication; Dual Network Adapter; Test Software
0 引 言
在常用的考试软件中,大部分是基于C/S结构,包括服务器端、管理机端和考试机端。管理机主要功能是对考试机进行控制,通常情况下,利用Socket通信来实现这一功能。
Socket(套接字)是网络通信的基本构件,最初是由加利福尼亚大学Berkeley学院为UNIX开发的网络通信编程接口,目前已成为windows网络编程事实上的标准[1-2]。在单网卡情况下,实现Socket通信比较简单,但是,在双网卡下,如何实现Socket通信,有关的文献报道尚不多见。
本文将讨论双网卡Socket通信的实现算法,以及在维吾尔语口语考试系统中的应用。
1 双网卡Socket通信实现算法
Socket是一组接口,是应用层与TCP/IP协议族通信的中间软件抽象层。具体是将复杂的TCP/IP协议族隐藏在Socket接口的背后,通过Socket函数调用进行数据传输以符合指定的协议[1]。
Socket一般用来描述IP地址和端口,即Socket = IP地址 + 端口。其中,IP地址是主机的标识,端口是使用特定协议的某一通信进程的标识。
?Socket通信机制提供了两种通信方式,有连接方式(TCP)与无连接方式(UDP)[1,3]。其中,TCP协议是面向连接的可靠传输协议,具有数据确认和数据重传机制,保证了发送数据一定能到达通信的对方,适合于对数据完整性要求比较高的场合使用。?而UDP协议则是无连接,不可靠的传输协议,不具有数据确认和数据重传机制,更适合于对数据完整性要求比较低的场合使用。
在单网卡下,实现Socket通信相对比较简单,这里不再赘述。下面主要讨论在服务器端具有双网卡的情况下实现Socket通信的算法。在服务器端具有双网卡(或多网卡)的情况下,服务器端和客户端Socket通信的具体实现步骤可分别详述如下。
1.1 服务器端
(1)对于服务器端的每一块网卡,分别建立一个Socket,绑定(Bind)服务器端网卡的IP地址和端口号(这些不同Socket之间可以共用同一个端口),开始侦听整个网络中的连接请求;
(2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接;
(3)根据协议,服务器端和客户端进行数据的交互,直至一端请求关闭连接,服务器端和客户端的Socket连接终止;
(4)返回2)等待另一客户端的连接请求;
(5)关闭服务器端的Socket。
1.2客户端
(1)建立客户端的Socket;
(2)根据服务器端的主机名,获得服务器端的所有IP地址。通过Ping确定服务器端上可连接的网卡的IP地址;
(3)利用服务器端的IP地址和端口,客户端Socket发送连接(Connect)请求到服务器端,并等待服务器端的回馈信息;
(4)与服务器端连接成功后,同服务器端进行数据的交互;
(5)数据处理完毕后,关闭自身的Socket连接。
无论是服务器端程序还是客户端程序,通信结束时,必须断开连接并释放所占用的资源。在服务器端具有双网卡的情况下,服务器端与客户端Socket通信流程图[2]如图1所示。
2 Socket通信在维吾尔语口语考试中的应用
维吾尔语口语考试采用人机对话交互的形式进行口语测试,其基本功能包括:考生登录,设备测试,口语考试和音频文件上传等。硬件主要包括着服务器、管理机和考试机,软件则主要表现为考试系统、考试管理系统等模块。维吾尔语口语考试系统基于C/S结构,运行在管理机上的考试管理系统的主要功能是对考试过程进行控制,应用Socket通信实现管理机与考试机之间的交互。
在维吾尔语口语考试管理系统的界面中,“考试控制”菜单下有“允许登录”和“禁止登录”的选项,如图2所示。当监考人员在管理机上用鼠标单击了“允许登录”选项后,即可通过Socket通信管理机端向考试机端发送允许登录的信息。
在维吾尔语口语考试系统中,应用Socket向管理机端发送连接(Connect)请求,并等待管理机端的回馈信息。系统中定义了一个控制用户登录的逻辑型变量AllowLogin,当通过Socket通信接收到考试管理系统发送来的允许登录的信息后,AllowLogin变量值变为True,此时考生可以在考试机上登录。同样,当通过Socket通信接收到考试管理系统发送来的禁止登录的信息后,AllowLogin变量值即变为False,考生将不能在考试机上登录。
在管理机端具有双网卡的情况下,应用双网卡Socket通信的技术,可以充分利用网络资源,提高系统的使用效率。
3 管理机端Socket通信
在管理机端,考试管理系统利用Socket通信监听是否有考试机端连接请求,如果有,则处理考试机端的请求,给出回应,此后继续监听。管理机端上的Socket通信,需从管理机上的网卡信息中选取可用于Socket通信的IP地址,并绑定(Bind)管理机上网卡的IP地址和端口号。
3.1 获取可用于Socket通信的IP地址
在Windows 7或Windows Server 2008中,用ipconfig命令可以查看到在计算机上存有许多的网卡信息和IP地址,需从这些网卡信息中选取可用于Socket通信的IP地址。
在Visual Studio 2010中,可使用下面的两个类,获取管理机端的网卡信息[4]:
(1)NetworkInterface类:提供访问主机所有网络接口信息的功能。利用该类可以方便地检测到计算机上有多少个网卡,哪些网络连接可用,并获取每个网卡的型号、Mac地址等信息。在该类中封装着本地计算机上的网络接口(也称作适配器)的数据。调用GetAllNetworkInterfaces方法将可返回一个此类的实例数组,对于本地计算机上的每个网络接口,该数组中都包含一个实例。
(2)IPInterfaceProperties类:用于访问支持 IPv4 或 IPv6 的网络接口的配置和地址信息, 可检测到所有网卡支持的各种IP地址。调用NetworkInterface类的GetIPProperties方法即可返回一个此类的实例。
在Visual Studio 2010中,获取管理机端的网卡IP地址的算法实现可表述为:
(1)定义IP地址数组IPAddress()和可用网卡数变量AvailableIPNum;
(2)利用NetworkInterface类的GetAllNetworkInterfaces()方法,返回一个管理机端的所有网络接口(NetworkInterface)实例数组;
(3)对于每一个网络接口实例,判别其中的IP地址是否是以太网适配器本地连接的IP地址。如果是,选取其IPv4地址或IPv6地址,将IP地址保存在数组变量IPAddress中,并将可用网卡数变量AvailableIPNum加1。
其中,判别是否是以太网适配器本地连接的IP地址的条件是:在利用NetworkInterface类的GetAllNetworkInterfaces()方法建立的网络接口实例中,其NetworkInterfaceType属性等于"Ethernet",且Name属性中不包含字符"*"(在ADSL分配的动态IP地址的网络接口实例中,Name属性中均包含有字符"*")。
对于以太网适配器本地连接的网络接口实例,将可利用GetIPProperties()方法返回一个IPInterfaceProperties类的实例,此实例的UnicastAddresses.Item(0).Address属性为IPv6地址,UnicastAddresses.Item(1).Address属性为IPv4地址。
3.2 管理机端双网卡Socket通信
对于管理机上的每一块网卡,建立一个独立的线程,进行Socket数据的访问和交互操作。管理机端双网卡Socket通信的部分程序流程,如图3所示。
4 考试机端Socket通信
考试机端与管理机端Socket通信的过程是:考试机端向管理机端发送请求信息,管理机端接收并处理请求,并将回应数据发送给考试机端,考试机端读取数据,再关闭连接,一次交互结束。
与管理机端连接时,考试机端必须知道管理机端的IP地址和端口号。在管理机端具有双网卡的情况下,根据管理机端的计算机名,考试机端将能获取管理机端可连接的IP地址。
考试机端与管理机端进行连接和通信的算法实现过程是:
(1)定义管理端的IP地址数组mcIPAddress,网卡个数变量IPNum和允许登录(逻辑型)变量AllowLogin, AllowLogin变量值的初值为False;
(2)利用管理端计算机名获取管理端计算机的所有IP地址,区别出IPv4地址或IPv6地址,并将IP地址保存在数组变量mcIPAddress中,网卡个数变量IPNum加1;
(3)调用ping函数,检测出管理机端的可连接网卡的IP地址;
(4)使用管理机上可连接网卡的IP地址和端口号Port,建立与管理机端通信的Socket对象socket;
(5)通过socket向管理机端发送请求登录信息"Request Test";
(6)若考试机端收到来自管理端发送的允许登录信息"Permit Test",则AllowLogin变量值变为True,考生可以在考试机上登录,关闭socket。否则,转向(5),继续通过socket向管理机端发送请求登录信息"Request Test"。
在(2)中,通过Dns类的GetHostEntry()方法可实现利用管理端计算机名获取管理端计算机的IP地址。Dns 类是一个静态类,可从 Internet 域名系统 (DNS) 检索关于特定主机的信息,而利用Dns类的GetHostEntry()方法则可将主机名解析为 IPHostEntry 实例。
在(3)中调用的ping函数,其功能是与管理机端进行Ping操作,确定管理机端上可连接的网卡的IP地址[5]。可利用System.Net.NetworkInformation命名空间中的Ping类以及其它类的方法来运行并实现。
Ping类的构造函数为Ping(),用于初始化Ping类的实例。通过调用Ping类中的Send方法,即能确定是否可通过网络访问远程计算机。
Send方法的重载有多个,其中,Send(IPAddress, Int32, Byte(), PingOptions)的功能是尝试将包含指定数据缓冲区的Internet控制消息协议(ICMP)回送消息发送到具有指定IPAddress地址的计算机,并接收来自该计算机的相应ICMP回送答复消息。此重载允许指定操作的超时值(Int32),并控制ICMP回显消息数据包的碎片和生存时间值。PingOptions参数用于控制如何传输Ping数据包。在PingOptions类中提供了Ttl和DontFragment属性以控制如何传输Internet控制消息协议(ICMP)回送请求数据包。Send方法返回值为一个System.Net.NetworkInformation.PingReply类型的对象,如果收到了 ICMP 回显回复消息,则该对象提供相应消息的相关信息;如果未收到消息,则该对象提供失败原因。利用返回的PingReply对象的Status属性,可获取发送Internet控制消息协议(ICMP)回送请求并接收相应ICMP回送答复消息的尝试的状态。如果返回的PingReply对象的Status属性为System.Net.NetworkInformation.IPStatus.Success,则表示Ping成功。
5 结束语
应用本文中所给出的双网卡Socket通信实现算法,考试机端只需要知道管理机端的计算机名和端口号,就可以与管理机端连接和通信。在管理机端具有双网卡的情况下,考试机端将不再需要考虑在哪一个网段上,以及使用管理机端哪一个网卡的IP地址。在维吾尔语口语考试系统中,通过管理机和考试机之间的Socket通信,实现了对考试机端登录的控制。在管理机端具有双网卡的情况下,即可获得对网络资源充分利用的理想效果。
参考文献:
[1] 吴功宜,董大凡,王珺,等. 计算机网络高级软件编程技术[M]. 北京:清华大学出版社,2008.
[2] 刘骏,颜钢锋. 基于Socket的网络编程技术及其实现[J]. 江南大学学报(自然科学版),2004,3(3):249-251.
[3] 蒋东兴. Windows Sockets网络程序设计大全[M]. 北京:清华大学出版社,1999.
[4] 黄嘉辉. Visual Basic.NET网络程序设计:TCP/IP与Internet Programming[M]. 北京:清华大学出版社,2003.
[5] 马骏. C#网络应用编程(第2版)[M]. 北京:人民邮电出版社,2010.