计算机Windows软件的网络通信系统

(整期优先)网络出版时间:2010-06-16
/ 2

计算机Windows软件的网络通信系统

蒋红萍

(贵阳市白云区职业技术学校,贵州贵阳550000)

摘要:蓬勃发展的计算机网络要求更高可信性的通信,随着电子商务等关键业务的开展,信息服务器的广泛应用,以及特殊领域,如军事指挥、航空调度、实时控制、金融或交通联机事务处理等对可信度的要求,终端用户在追求高速度的同时,更为关心网络和系统的可信性,包括可用性、可靠性、可维护性和健壮性等。

关键词:Windows软件;网络通信;类型

中图分类号:TP316.7文献标识码:A文章编号:1673-0992(2010)06A-0055-01

Mcrosoft公司的Windows系统具有友好的人机图形界面,易于管理的用户和组,强大的服务器组件等优点,而且其自身丰富强大的网络功能为开发提供了良好的工作环境,因而成为当前的主流网络操作系统。

1LinuxSocket编程实现

在Linux操作系统下,通过调用下面的函数实现网络通信功能。

intsocket(intdomain,inttype,intprotocol)//创建Socket

intbind(intsockfd,structsockaddr*my_addr,intaddrlen)//绑定端口和IP地址

intlisten(intsockfd,intbacklog)//侦听客户连接

intaccept(intsockfd,void*addr,int*addrlen)//接受客户连接

intconnect(intsockfd,structsockaddr*serv_addr,intad-drlen)//同服务端连接

根据上述Socket的工作流程和函数介绍就可以编写网络程序了。在网络通信中,对服务器端有较高的要求。常用的服务器类型有:

①循环服务器:循环服务器在同一个时刻只可以响应一个客户端的请求;

②并发服务器:并发服务器在同一个时刻可以响应多个客户端的请求。

在该项目中,Linux做为服务器采用的是并发服务器,在收到客户请求后,建立一个新的进程来进行通信,算法如下:

socket(...);//建立socket套接字描述符

bind(...);//指定一个套接字端口

listen(...);//在该端口上进行侦听

while(1)

{

accept(...);//等待客户端发起连接,返回一个新的socket描述符

if(fork()==0)

{

while(1)//在新的socket描述符上进行通信

{

recv(...);//接收客户端发来的数据

process(...);//按用户要求对数据进行处理

send(...);//把处理结果发给客户

}

close(...);//关掉该描述符

exit()//退出子进程

}

}

2Windows环境下的网络编程

2.1Windows3.1下的网络编程

在Windows中,NetBIOS最好用异步命令以防止阻塞系统,在windows里,可以调用一个API函数NetBIOSCALL(在汇编语言中调用),以取代软中断调用。下面以数据报为例,简要说明工作站间实时通信程序的基本工作流程。

2.1.1在Windows窗口主函数WinMain中先确定通信双方的名称,并将远方名增加进Net-BIOS名字表中,然后发出异步实时数据接收请求;

2.1.2进入Windows消息处理循环,执行窗口函数MainWndProc,根据应用程序消息队列完成相应处理;

2.1.3用户关闭窗口时,终止消息循环,删除远方名字。

2.2Windows95下的网络编程

Windows95下与标准NetBIOS的网络编程存在着一些差异。首先它使用原NCB末尾保留的四个字节作Ncb_event项,它是一个事件句柄,在32位操作系统中指向异步事件处理线程,这更符合32位Windows环境下的抢先多任务进程的特点,减少消耗更多的资源。其次,摒弃了原来的汇编级POST例程,允许使用更简明易懂的C语言来处理NetBIOS命令的返回。同时NCB的移动问题也得到了解决,即NCB的保护和调用由系统自动完成,应用程序无需过问。再之,在DOS环境下,NetBIOS的编程设计中,需要对INT5CH中断进行编程。而在32位环境中,这些令人头痛和费解的编程规则和中断、寄存器等汇编代码已不再是一个问题,此时,只需简单地填写完成相应网络命令的NCB结构,然后调用NetBIOS函数即可,函数调用格式:UCHARNetBIOS(PNCBPncb);BetBIOS函数只有一个参数,该参数是指向NCB结构的指针。

在任意节点首先发出任意侦听(Listen)命令,以便能侦听到其它任何一节点发来的呼叫连接请求。当侦听到一个请求后NCB成功返回,同时NetBIOS分配一个本地会话号,会话连接建立成功。此时,节点应再发生任意侦听(Listen)命令以便能继续接收其它节点的呼叫请求,同时,还应发出一个任意接收(ReceiveAny)命令,用来接收已建立会话联系的呼叫端发来的数据。当接收到数据时NCB命令返回,此时和侦听相同也应当再次发出任意命令,在应用程序通信期间,应当始终保持有一个Listen命令和一个ReceiveAny命令处理悬挂状态。如果命令出错,再重新发出命令,这样可以随时响应其它节点的呼叫请求并及时接收其它节点发来的数据。发出连接请求的节点发出请求时,只需呼叫一次建立会话,会话建立后,不必再次呼叫,除非会话异常终止或会话结束后再次建立。对于NCB命令的提交,应当每次检查有无未返回的命令和命令返回的状态,悬挂的网络命令不能太多。对于接收或发送大量的数据包,可建立接收或缓冲队列。

3中间层驱动程序开发工具NDIS

NDIS是由微软和3COM公司共同发布用于Windows系列平台下不同层次网络驱动程序开发的软件包。NDIS提供了强大的功能函数库,将微端口和中间驱动程序从操作系统中分离了出来。开发时通过NDIS可以进行系统调用,因此编写驱动程序时只需要编写必要的代码,就可以完成对系统硬件的驱动。NDIS从4.0版本开始支持IMD的开发,NDIS位于协议驱动程序和网卡驱动程序之间。它主要用于连接不同网络媒体,即协议转换过滤来自上下层的数据包;并根据各个网卡的工作状态合理分配数据包,实现多块网卡的负载平衡。NDIS的地位特殊,相对于网卡驱动程序它是协议驱动程序,而对协议驱动而言,它又是虚拟的网卡驱动程序。

IMD的主要功能。由于IMD的特殊地位使得它要起到承上启下的作用,因此IMD的主要功能是:

3.1关联上下程序。在NDIS的上/下边界分别要提供一系列Miniportxxx/Protocolxxx函数,完成同TCP/TP协议栈、NIC驱动程序的关联。

3.2初始化环境。NDIS的主入口点DriverEntry要完成端口和协议注册,实现硬件资源定位,建立指向其他驱动程序函数的指针等初始化工作,使得加载程序被准确识别。具体说,在IMD中DriverEntry至少应该完成:

3.2.1对NdisMitializeWrapper的调用,并保存NdiswWrapperHandle中返回的句柄;

3.2.2传递上一步保存的句柄,调用NdisIMRegisterLayeredMiniport注册驱动程序的MiniportXxx函数;

3.2.3如果驱动程序随后要绑定到低层NDIS驱动程序上,则调用NdisRegisterProtocol注册驱动程序的ProtocolXxx函数;

3.2.4如果驱动程序导出了Miniport和ProtocolXxx函数,那么调用NdisIMAssociateMiniport向NDIS通告有关驱动程序的微端口下边界和上边界协议的信息。

3.2管理好数据包。中间层驱动程序从高层驱动程序接收数据包描述符,并在网络上发送,如果驱动程序下边界面向无连接,则调用Ndissend或NdissendPackets函数完成数据包的管理。如果驱动程序下边界面向了连接,则调用NdiscosendPackets函数完成数据包管理。

3.4实时绑定和解绑定IMD和多块网卡的关联。这可用动态绑定和解除例程(ProtocolBindAdapter/ProtocolUnbindAdapter)来实现。

3.5平衡负载和替换失效。负载平衡和失效替换(LoadBalancing&FailOver,LBFO)特性是通过一张网卡列表实现网络流量的平衡和并行传输,它合理地分配多个网卡之间的流量。该列表也用切换故障设备的方法提供系统自动恢复功能,达到系统容错效果。

3.6判断媒体。为了减少工作量,最大限度地降低因为并行处理而对系统性能的影响,还要实时检测链路状态,判断使用的媒体(MediaSense)。

参考文献:

[1]丁刚,丁峰,基于Windows下的网络实时通信技术.[J]安徽建筑工业学院学报2009.11

[2]宋晓丽,邱际光,Linux与Windows系统间的网络通信.[J]科技广场2008.10

[3]梁伍七,基于Windows套接字实现网络异步通信的原理和实现.[J]安徽广播电视大学2009.01