2023年6月22日发(作者:)
第13卷 第4期2000年 12月 武 汉 科 技 学 院 学 报JOURNALOFWUHANINSTITUTEOFSCIENCEANDTECHNOLOGY Vo1.13No.4Dec. 2000WindowsSockets网络编程李红军 赵玉娇 赵 伟(机械系) (图书馆) (教务处)摘 要 在对WindowsSockcts网络编程作简要介绍的基础上,对在VisualC++6.0环境下如何进行网络编程以及如何使用多线程进行网络编程作了介绍和示范。关键词 网络 套接字 阻塞 多线程 中图分类号 TP3931 WindowsSockets简介Windowssockets(简称Winsock)是微软的窗口系统结构(WOSA)的一部分。它是起源于UNIX上的BerkeleySoftwareDistribution(BSD)版本的套接字、并为Windows进行了专门地扩展。Internet是在UNIX系统上发展起来的,在UNIX上有许多成熟的编程接口,其中最通用的是一种叫做sockets(套接字)的接口。套接字的实质是通信端点的一种抽象,它提供一种发送和接收数据的机制。网络软件商为Windows开发一套标准的、通用的TCP/IP编程接口,并使之类似于UNIX下的sockets,这就是Windowssockets;Windowssocket的实现一般都由两部分组成:开发组件和运行组件。开发组件是供程序员开发Winsock应用程序使用的、它包括介绍Winsock实现的文档、Winsock应用程序接口(API)引入库和一些头文件。运行组件是Winsock应用程序接口的动态连接库(DLL),文件名为,应用程序在执行时通过装入它来实现网络通信功能。最初,Winsocket1.1版是专门为Internet设计的,现在的2.x版己经不再限于Internet和TCP/IP协议,它通过提供扩展的API编程接口,把自己的应用范围扩大到现存的和正在出现的各种网络和协议,包括PSTN、ISDN、无线网、所有的局域网协议、异步传输模式ATM等等;并且允许应用程序对所建立连接的可靠性、冗余度和带宽进行控制。由此可见,Winsock有着广泛的应用。Windowssockets是Windows下网络编程的规范。这套规范是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。它定义并记录了如何使用API与Internet协议族(IPs、通常我们指的是TCP/IP)连接,尤其要指出的是所有的Windowssockets实现都支持流套接字和收稿日期:2000-8-25作者简介:李红军,男,(1974-);武汉,武汉科技学院(430073)© 1994-2007 China Academic Journal Electronic Publishing House. All rights reserved. 第4期 李红军 等: WindowsSockets网络编程 71数据报套接字。当我们为客户机/服务器开发一个特殊的应用程序时,我们可以通过套接字来交换我们的数据结构和数据报,以完成应用程序之间的通信。应用程序调用Winsock的API实现相互之间的通讯。Winsock又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。它们之间的关系如图1所示:应用程序1 应用程序2网络编程界面,例如WindowsSockets网络通讯协议服务界面,例如TCP/IP操作系统,例如Windows98,WindowsNT,Dos6.22物理通讯介质图1 应用程序与WinsoCk关系图ξ ξψψξ ψξ ψξ ψ2 套接字的两种主要形式在Windows套接字中,它主要有两种形式:数据报套接字(Datagramsocket)和流式套接字(Streamsocket)。流式(也称面向连接方式)套接字采用的是TCP协议,它提供了双向的,有序的,无重复并且无记录边界的数据流服务。在这种方式下,两个通讯的应用程序之间先要建立一种虚拟的连接。流方式的特点是:通讯可靠,对数据有校验和重发的机制,通常用来作数据文件的传输如ftp,telnet等,适合于大量数据的传输。数据报套接字采用的是UDP协议,它建立在IP协议上,提供无连接数据报传输,支持双向的数据流,但并不保证是可靠、有序、无重复的。也就是说,一个从数据报套接字接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。数据报文方式由于取消了重发校验机制,能够达到较高的通讯速率,可以用作一些对数据可靠性要求不高的遮讯,如实时的语音、图象传输等。另外,数据报套接字支持广播发送,使用setsockopt()函数可以使指定的套接字发送广播消息。相比之下,流式套接字不支持广播发送。是使用流式套接字还是使用数据报套接字,对通信效率影响较大。在编程中,流式套接字与数据报套接字是有区别的。在流式套接字中,服务器首先启动,遮过调用socket()建立一个套接字,然后调用bind()将该套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。客户在建立套接字后就可调用connect()和服务器建立连接。连接一旦建立,客户机和服务器之间就可以调用receive()和send()来发送和接收数据。最后,待数据传送结束后,双方调用close()关闭套接字,如图2所示。与流式套接字不同的是,在数据报套接字中,服务器不调用accept(),客户机不调用connect()。在发送数据之前,客户机和服务器之间尚未建立完整相关。无连接服务器通过sockct()和bind()建立了本地半相关,在传输数据之前,无连接的两个端点已建立起来,分别以一个本地socket号和信宿端socket地址。于是,一个完整的相关在数据收发过程中动态地建立起来,实现无连接客户和服务器彼此识别。如图3所示:© 1994-2007 China Academic Journal Electronic Publishing House. All rights reserved. 武 汉 科 技 学 院 学 报 2000年723 在VC下开发套接字程序在实际编程中,我们一般采用面向对象技术,特别采用消息驱动机制实现多任务的Windows编程思想,VC由于它的强大的功能而被广泛采用。3.1 在VC下开发套接字程序的基本步骤在VC++6.0中,我们可以用WindowssocketsAPI来编写网络程序,其特点是十分灵活,可以充分利用众多的WindowssocketsAPI函数,相比之下编程比较烦琐。另外我们可以使用MFC封装的CAsyncSocket和CSocket两个类来进行网络编程,它把与套接字有关的Windows消息转换为回调函数。CAsyncSocket类比CSocket更加面向低层,它提供的低级接口几乎与WinSocketAPI调用直接对应,使用比较灵活,但它对编程人员的要求也高,需要对网络了解得更多。CSocket是CAsyncSocket的导出类,通过MFC中的CArchive类的对象提供了更高层次的抽象,它封装了socket实现中的许多细节,并将socket与CArchive相结合,使用它与使用MFC中的文档串行化协议相类似,使用便利。CSocket编程的主要步骤如下;(1)构造套接字对象。(2)使用该对象构造基本的套接字。对于CSocket客户端对象,使用缺省参数Creat;对于CSockct服务器对象,应指明一个端口号作为Create的一个参数,用于监听。(3)建立客户端CSocket,调用CAsyncSocket::Connect()建立与服务器端的连接。服务器端套接字调用CAsyncSocket::Listen()监听,并在收到客户端请求后调用CAsyncSocket::Accept()。(4)构造CSocketFile对象,并使Csocket对象与之关联。(5)构造CArchive对象,用于接收或发送数据。(6)使用CArchive对象来进行客户端与服务器端的套接字通信。(7)删除CArchive、CSocketFile、CSocket对象。流程图如图4所示。© 1994-2007 China Academic Journal Electronic Publishing House. All rights reserved. 第4期 李红军 等: WindowsSockets网络编程 73(2) 服务器 客户端 CSocketSockSrvr CsocketSockClient; (nPort) () CSocketsockRew, (sockrew), CsocketFilefile(&SockClient), CSockFilefile(&sockrew)CArchivein(&file,Carchive::LOAD) CArchivein(&file,Carchive::LOAD); CArchiveout(&file,Carchive::STORE) (); t(saddr,nPort) CArchiveout(&file,Carchive::STORE); in>>dwValue, in>>dwValue; out<
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687427073a9236.html
评论列表(0条)