Windows Socket介绍

来源:互联网 发布:淘宝开店多久自动关闭 编辑:程序博客网 时间:2024/06/08 16:07

在windows平台上,创建网络应用程序通常会借助于Windows Sockets ,Sockets译为套接字,一个套接字是通信的一端,客户与服务器之间即可通过套接字彼此通信。Windows Sockets是Windows下网络编程的规范,简称Winsock,虽然不同的应用服务和所使用的应用协议均有所不同,但所有的网络程序都能简化为一个简单的Winsock网络编程模型。

要想使用Winsock创建网络应用程序,需要遵守一定的编程约定,下面将对Winsock技术进行简要说明。

1.Winsock介绍

Windows Sockets是一套开放的、支持多种协议的Windows下的网络编程接口。1991年发布了1.0版,在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,已成为Windows网络编程事实上的标准。

Windows Sockets规范建立在Bekeley套接口模型上,是以U.C. Berkeley 大学UNIX中流行的Socket接口为范例而设定的一套Windows网络编程接口。这个规范针对Windows的增加了扩展库函数,这样一来程序员使用Winsock在windows上编程时,能充分利用其消息驱动机制。

Winsock主要有两个版本,即Winsock 1和Winsock 2,现在使用较多的是第二版,同第一版相比,第二版增加了很多功能。要使用winsock2编写应用程序,需要添加winsock2.h头文件,同时还要链接到WS2_32.lib库,如果使用MFC,这一切已经被自动设定,就无需再手动添加。

Winsock工作的层次位于应用程序与底层通信协议之间,应用程序可调用Winsock的API实现相互之间的通讯,而实际的通信工作由Winsock利用下层的网络通讯协议功能和操作系统调用完成。

2.WinSock编程过程

对于网络上任意两个应用程序来说,彼此之间开始工作的绝对时间是难以确定的。而且由于网络本身的特性(流量负载变化等因素的影响),使得数据包到达对方的时间是不可预计的。鉴于上述原因,在设计每一对网络应用程序时,都应让它们按顺序执行互补的网络操作,而不是同时执行。对于客户端/服务器模式的应用来说,服务器端的程序首先启动,然后等待连接信息,客户端程序后启动,并发起连接,连接创建之后,二者之间就可以通信了。

经过初始阶段的联系后,无论客户端还是服务器都能够正常发送和接收数据了。利用初始通信阶段来描述两者的关系特点,仅仅是为了定义的目的。在经过了双方的第一次通信后,应用程序所提供的服务能够在任意时刻改变两者的相对关系。

这个创建过程如图3.2所示。服务器端创建监听套接字,并为它绑定一个本地地址(指定Ip和端口号),然后进入监听状态准备接受客户的连接请求。为了接受客户端的连接请求,服务器端必须调用accept函数。

客户端创建套接字后即可调用connect函数去试图连接服务器监听套接字。当服务器端的accept函数返回后,connect函数也返回。此时客户端使用socket函数创建的套接字,服务端使用accept函数创建的套接字,双方就可以通信了。

 3.Winsock套接字I/O模型

套接字模式简单的决定了操作套接字时,Winsock函数是如何运转的。WinSock以两种模式执行I/O操作:阻塞和非阻塞。在阻塞模式下,执行I/OWinSock调用(如sendrecv)一直到操作完成才返回。在非阻塞模式下,Winsock函数会立即返回。

Winsock提供了一些I/O模型帮助应用程序以不同的方式在一个或者多个套接字上管理I/O.这样的I/O模型共有6种:阻塞(blocking)模型,选择(select)模型,WSAAsyncSelect模型,WSAEventSelect模型,重叠(overlapped)模型和完成端口模型。

套接字创建时,默认工作在阻塞模式下。这是最简单的I/O模型,此时当调用sendrecv函数,程序会一直阻塞直到发送或接受完数据才返回。阻塞套接字的好处是使用较为简单,但通信效率较低,此外当需要处理多个套接字时,就必须创建多个线程。

select模型是WinSock中应用最广泛的模型之一,它使用select函数判断套接字状态,或者一个套接字是否可读写。该函数可有效地防止应用程序在socket处于阻塞模式时,调用send或recv函数进入阻塞状态,同时也可以防止产生大量的WSAEWOULDBLOCK错误。select模型的优势是能够从单线程的多个套接字上进行多重连接及I/O操作。这样就避免了因套接字阻塞和多重连接所产生的线程剧增。

WSAAsyncSelect模型以windows窗口消息为基础,将socket操作消息发送到窗口上,然后在窗口的消息循环里处理相应的FD_READ、FD_WRITE等消息。这样可将套接字操作,与windows消息机制很好的结合起来,因此特别适合有GUI的应用程序,MFC中CSocket类就采用了这种模型。

WSAEventSelect模型也是以事件通知为基础的I/O模型,与WSAAsyncSelect不同的是,它是将socket句柄同事件对象进行关联,而不是通过窗口。当这个套接字有新连接到来,或有数据需要读写时,该事件对象就会受信。从而应用程序得到事件通知。

重叠(overlapped)模型能达到更佳的系统性能。上面两种I/O模型都提供了读写数据能力的异步通知,但它们不提供异步数据传送,而重叠(overlapped)模型提供异步数据的传送,而且它可以在系统开销不大的情况下同时处理很多连接。重叠模型充分利用了底层的NDIS驱动机制,可以让应用程序使用重叠的数据结构,一次投递一个或多个I/O请求。针对这些提交的请求,在他们完成之后,应用程序可为他们提供服务。它又分为两种实现方法:在事件中使用,还有就是完成例程。完成例程方式较少使用。

完成端口提供了最好的伸缩性,往往可以使系统达到最好的性能,是处理成千上万的套接字的首选。从本质上说,完成端口模型要求创建一个windows完成端口对象,该对象通过指定数量的线程,对重叠I/O请求进行管理,以便为已经完成的重叠I/O请求提供服务。

                             WinSock I/O模型对比

Winsock I/O模型

优点

缺点

阻塞模型

实现较简单,容易理解

效率不高

select模型

单线程可操作多个套接字

测试状态需遍历数组,因此CPU占用率较高。

WSAAsyncSelect模型

同Windows消息机制很好的结合

需要创建窗口,另外当待处理消息较多时,会阻塞消息泵,造成处理速度降低

WSAEventSelect模型

使用事件传递消息,不需创建窗口。

每个线程每次最多等待64个事件,伸缩性较差,另外只提供了收发消息的通知,发送和接受数据过程还是同步。

重叠I/O模型

性能较好,可以异步传送数据

同样因为使用了等待事件的WSAwaitformultipleevents函数,单个线程每次最多等待64个事件

完成端口模型

伸缩性最好

设计较为复杂

  从表中可以看出,这几种Winsock各有优缺点,设计网络程序的时候可以根据需求,选择最适当的方式.。

0 0
原创粉丝点击