您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 中国科学技术大学(5)
中国科学技术大学多媒体技术与网络通信实验室(copyright1999)附录一简明Socket编程指南在本说明文档中,主要讲述了一些网络SOCKET编程的基本概念和有关函数说明,并给出了部分示例程序的源代码。在完成“TCP和IP通信程序设计实验”、“实时声音传输实验”和“HTTP代理实现实验”时,可以参考本文档的内容。一、SOCKET基本概念1Linux/Unix:Socket函数库LinuxSocket函数库是从Berkeley大学开发的BSDUNIX系统中移植过来的。BSDSocket接口是在众多Unix系统中被广泛支持的TCP/IP通信接口,Linux下的Socket程序设计,除了微小的差别之外,也适用于大多数其它Unix系统。Socket的使用,和文件操作比较类似。如同文件的读、写、打开、关闭等操作一样,TCP/IP网络通信同样也有这些操作,不过它使用的接口不是文件描述符或者FILE*,而是一个称做Socket的描述符。类似于文件操作,对于Socket,也通过读、写、打开、关闭操作来进行网络数据传送。同时,还有一些辅助的函数,如域名/IP地址查询、Socket功能设置等。2.DOS:WATTCP函数库关于WATTCP函数库,也就是DOS下TCP/IP协议驱动程序库是由加拿大Waterloo大学的ErickEngelke提供的。NCSA的telnet、ftp等程序,都是利用ErickEngelke的TCP/IP程序库WATTCP开发出来的。WATTCP是一个很容易使用的C语言函数库,相对Unix和其它环境下广泛使用的BSDSocket接口而言,它在DOS下提供了一个更为简单和直观的TCP/IP编程接口。WATTCP编程接口,相对于UnixSocket而言,作了相当的简化。Unix下,网络操作和文件系统几乎融为一体,但DOS下不存在如Unix一样强大的网络文件系统功能。因此,在DOS下没有Unix中那种直接用文件系统调用来操作Socket的便利。DOS下的TCP/IP通信和DOS系统几乎是完全独立的。WATTCP支持DOSTCP/IP环境下的基本Socket接口,大致和UnixSocket兼容,包括面向连接的TCP(SOCK_STREAM)和非连接的UDP(SOCK_DGRAM)型Socket。另外WATTCP提供一些专用的SOCKET接口函数。3.WindowsSockets规范WindowsSockets规范以U.C.Berkeley大学BSDUNIX中流行的Socket接口为范例定义了一套MicosoftWindows下网络编程接口。它不仅包含了人们所熟悉的BerkeleySocket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。这一套WindowsSocketsAPI能够在所有3.0以上版本的Windows和所有Windows如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系network@ustc.edu.cncxh@ustc.edu.cn百度文库专用滴中国科学技术大学多媒体技术与网络通信实验室(copyright1999)Scokets实现上使用,所以它不仅为WindwosSockets实现和WindowsSockets应用程序提供了16位操作环境,而且也提供了32位操作环境。WindowsSockets也支持多线程的Windows进程。一个进程包含了一个或多个同时执行的线程。在Windows3.1非多线程版本中,一个任务对应了一个仅具有单个线程的进程。而我们在本书中所提到的线程均是指在多线程Windows环境中的真正意义的线程。在非多线程环境中(例如Windows3.0)这个术语是指WindowsSockets进程。WindowsSockets规范中的针对Windows的扩展部分为应用程序开发者提供了开发具有Windows应用软件的功能。它有利于使程序员写出更加稳定并且更加高效的程序,也有助于在非占先Windows版本中使多个应用程序在多任务情况下更好地运作。除了WSAStartup()和WSACleanup()两个函数除外,其他的Windows扩展函数的使用不是强制性的。4.套接口基本概念通讯的基石是套接口,一个套接口是通讯的一端。在这一端上你可以找到与其对应的一个名字。一个正在被使用的套接口都有它的类型和与其相关的进程。套接口存在于通讯域中。通讯域是为了处理一般的线程通过套接口通讯而引进的一种抽象概念。套接口通常和同一个域中的套接口交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。WindowsSockets规范支持单一的通讯域,即Internet域。各种进程使用这个域互相之间用Internet协议族来进行通讯(WindowsSockets1.1以上的版本支持其他的域,例如WindowsSockets2)。套接口可以根据通讯性质分类;这种性质对于用户是可见的。应用程序一般仅在同一类的套接口间通讯。不过只要底层的通讯协议允许,不同类型的套接口间也照样可以通讯。用户目前可以使用两种套接口,即流套接口和数据报套接口。流套接口提供了双向的,有序的,无重复并且无记录边界的数据流服务。数据报套接口支持双向的数据流,但并不保证是可靠,有序,无重复的。也就是说,一个从数据报套接口接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。数据报套接口的一个重要特点是它保留了记录边界。对于这一特点,数据报套接口采用了与现在许多包交换网络(例如以太网)非常类似的模型。二、SOCKET编程原理1.套接口网络编程原理套接口有三种类型:流式套接口,数据报套接口及原始套接口。流式套接口定义了一种可靠的面向连接的服务,实现了无差错无重复的顺序数据传输。数据报套接口定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错。原始套接口允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。无连接服务器一般都是面向事务处理的,一个请求一个应答就完成了客户程序与服务程序之间的相互作用。若使用无连接的套接口编程,程序的流程可以用图3-1表示。如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系network@ustc.edu.cncxh@ustc.edu.cn百度文库专用滴中国科学技术大学多媒体技术与网络通信实验室(copyright1999)服务器socket() bind()readfrom()sendto()阻塞,等待客户数据处理服务请求socket()bind()sendto()readfrom()客户机服务请求服务应答图3-1无连接套接口应用程序时序图close()close()面向连接服务器处理的请求往往比较复杂,不是一来一去的请求应答所能解决的,而且往往是并发服务器。使用面向连接的套接口编程,可以通过图3-1来表示:其时序。如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系network@ustc.edu.cncxh@ustc.edu.cn百度文库专用滴中国科学技术大学多媒体技术与网络通信实验室(copyright1999)服务器socket() bind()listen()阻塞,等待客户数据处理服务请求socket()connect()write()客户机请求数据应答数据图3-2面向连接套接口应用程序时序图read()read()accept()write()建立连接close()close()套接口工作过程如下:服务器首先启动,通过调用socket()建立一个套接口,然后调用bind()将该套接口和本地网络地址联系在一起,再调用listen()使套接口做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。客户在建立套接口后就可调用connect()和服务器建立连接。连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。昀后,待数据传送结束后,双方调用close()关闭套接口。2.WindowsSockets编程原理由于Windows的基于消息的特点,WINSOCK和BSD套接口相比,有如下一些新的扩充:1.异步选择机制异步选择函数WSAAsyncSelect()允许应用程序提名一个或多个感兴趣的网络事件,如FD_READ,FD_WRITE,FD_CONNECT,FD_ACCEPT等等代表的网络事件。当被提名的网络事件发生时,Windows应用程序的窗口函数将收到一个消息。这样就可以实现事件驱动了。如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系network@ustc.edu.cncxh@ustc.edu.cn百度文库专用滴中国科学技术大学多媒体技术与网络通信实验室(copyright1999)2.异步请求函数异步请求函数允许应用程序用异步方式获得请求的信息,如WSAAsyncGetXByY()类函数。这些函数是对BSD标准函数的扩充。函数WSACancelAsyncRequest()允许用户中止一个正在执行的异步请求。3.阻塞处理方法WINSOCK提供了钩子函数负责处理Windows消息,使Windows的消息循环能够继续。WINSOCK提供了两个函数(WSASetBlockingHook()和WSAUnhookBlockingHook())让应用程序设置或取消自己的钩子函数。函数WSAIsBlocking()可以检测是否阻塞,函数WSACancelBlockingCall()可以取消一个阻塞的调用。4.错误处理WINSOCK提供了两个WSAGetLastError()和WSASetLastError()来获取和设置昀近错误号。5.启动和终止由于WindowsSockets的服务是以动态连接库WINSOCK.DLL形式实现的,所以必须要先调用WSAStartup()函数对WindowsSocketsDLL进行初始化,协商WINSOCK的版本支持,并分配必要的资源。在应用程序关闭套接口后,还应调用WSACleanup()终止对WindowsSocketsDLL的使用,并释放资源,以备下一次使用。在这些函数中,实现Windows网络实时通信的关键是异步选择函数WSAAsyncSelect()的使用。三、SOCKET函数库介绍1.DOS:WATTCP函数库兼容型Socket函数WATTCP支持DOSTCP/IP环境下的基本Socket接口,大致和UnixSocket兼容,包括面向连接的TCP(SOCK_STREAM)和非连接的UDP(SOCK_DGRAM)型Socket。其主要的函数有:WATTCP初始化:sock_init():初始化TCP/IP驱动程序,建立和pktdriver的调用关系;sock_exit():清除TCP/IP驱动程序和pktdriver的联系;由于DOS环境下,TCP/IP驱动程序是完全独立的,为了正常使用,必须首先初始化,使用完毕后,必须清除现场,以免影响其它程序的运行。Socket创建和释放:socket()、n_close()如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系network@ustc.edu.cncxh@ustc.edu.cn百度文库专用滴中国科学技术大学多媒体技术与网络通信实验室(copyright1999)连接建立和撤销:bind()、listen()、accept()、connect()Socket发送和接收:n_read()、n_write()、select()数据转换函数gethostbyname()、inet_addr()、inet_ntoa()这些函数中,n_read()、n_write()、n_close()分别对应于UnixSocket接口中的read()、write()、close()函数,因为需要和DOS系统下的文件操作函数区分开,用了另外的名字。以上这些函数,其含义和用法和标准的UnixSocket接口基本一致,是
本文标题:中国科学技术大学(5)
链接地址:https://www.777doc.com/doc-6400255 .html