编程界面.套接字存在于通信域中.通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念.套接字通过通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序).Winsock规范支持单一的通信域,即Internet域.各种进程使用这个域互相之间用Internet协议簇来进行通信(Winsock 1.1以上的版本支持其他的域)。
套接字可以根据通信性质分类,这种性质对于用户时可见的.应用程序一般仅在同一类的套接字间通信.不过只要底层的通信协议允许,不同类型的套接字间也照样可以通信
进入九十年代后,
随着计算机和网络技术的发展很多数据处理系统都采用开放系统结构的客户机/服务器网络模式
即客户机提出任务请求通过网络发送给服务器
由服务器做相应处理执行被请求的任务然后将结果返回给客户机。
例如:
银行ATM的前置机和数据处理的主机之间即构成客户机/服务器网络模式;电话银行的前置机和银行数据处理机之间也构成这种网络模式结构等。
这样,如何在前置机和数据主机之间进行信息交换,
即进程网络通信就成为实现这种网络模式的基础。
而TCP/IP的套接字技术是解这一问题的有力工具。
它从提出时就一直发挥着愈来愈重要的作用,
并已成为UNIX操作系统下TCP/IP网络编程标准;甚至WINDOW、JAVA都配有它的通用接口。
有了这个强有力的工具,我们可以实现异种机、异种操作系统应用程序间的相互连接和通信。
套接字(sockets)是支持TCP/IP协议的网络通信的基本操作单元。
可以将套接字看作不同主机间的进程进行双向通信的端点。
它构成了在单个主机内及整个网际间的编程界面。
一般来说,跨机应用进程之间要在网络环境下进行通信,
必须要在网络的每一端都要建立一个套接字两个套接字之间是可以建立连接的
也是可以无连接的并通过对套接字的"读"、"写"操作实现网络通信功能。
类似于UNIX系统中的I/O概念,像文件那样有打开、读、写、关闭的方式[9]。
根据传输数据类型的不同,
套按字可分为面向连接的数据套接字(streamsockets)和无连接的数据报套接字(datagramsockets)两种类型:
(1)字节流套接字
字节流不按记录定界,
在TCP/IP协议簇中对应TCP协议即传输控制协议(TransmitionControlProtocol)。
它是一个提供给用户进程可靠的全双工的面向连接的协议,
大多数INTERNET应用程序如ftp、telnet使用TCP协议。
通信端点使用TCP对应的INTERNET地址互相连接,
可保证按正确的顺序以及单一和可靠的地址传输数据。
由于它是字节流,所以包长包没有限制,
信包传输也不重复
因而是一种常用的套接字类型。
流套接字提供双向的,有序的,无重复并且无记录边界的数据流服务,
它适应于处理大量数据。
网络传输层可以将数据分散或集中到合适尺寸的数据包中。
流套接字是面向连接的,通信双方进行数据交换之前,
必须建立一条路径,这样即确定了它们之间存在的路径,又保证了双方都是活动的
可彼此相应的但在通信双方之间建立一个通信信道需要很多开支.除此以外
大部分面向连接的协议为保证发送无误,可能会需要执行额外的计算机来验证正确性
为此会进一步增加开支。
(2)数据报套接字
数据报对应记录型数据流,
在TCP/IP协议簇中对应UDP协议即用户数据报协议(UserDatagramProtocol)。
利用数据报服务可实现一些简单的网络服务,
如网点检测程序PING。
由于不建立连接,数据报协议比连接协议快。
但不能保证所有数据都准确有序地到达目的地。
不保证顺序性、可靠性和无重复性。
它是无连接的服务,以独立的信包进行传输,
通信端点使用UDP对应的INTERNET地址。
双方不需互连,按固定的最大长度进行传输,
因而适用于单个报文传输或较小文件的传输。
数据报套接字支持双向的数据流,但不保证数据传输的可靠性,
有序性和无重复性。
也就是说,一个从数据报套接字接受信息的进程有可能发现信息重复,
或者和发出时间顺序不同的情况。
此外,数据报套接字的一个重要特点是它保留了记录边界。
数据报套接字是无连接的,它不保证接受端是否在监听,类似邮政服务:发信人把信装入邮箱即可,至于收信人是否收到这封信或邮局是否会因为暴风雨未能按时将信件投入收信人处等等,发信人都不得而知。
因此,数据报并不十分可靠,需有程序员负责管理数据的排序和可靠性。
套接字的编程要点及过程:
不论何种套接字编程,
均采用客户机/服务器方式其运作过程基本类似
限于篇幅这里仅介绍字节流套接字。
字节流套按字的服务进程和客户进程,在通信前必须创建各自的套接字以建立连接,
然后对相应的套接字进行"读"、"写"操作实现信息的交换。
服务器进程创建套接字。
服务进程总是先于客户进程启动,服务进程首先调用socket()函数创建自已端的一个字节流套接字,
并提供三个参数:
网络地址类型一般取AF_INEF(AdressfamilyInterNET);套接字类型
这里取SOCK_STREAM;网络协议缺省为TCP/IP协议
对应参数为0。
给套接字地址变量赋初值。
在生成套接字后,要用服务器的地址先对sockaddr_in结构变量赋初值。
sockaddr_in它只适用INTERNET地址类型,
含有INTERNET套接字地址类型、IP端口号、IP地址等信息。
地址类型可取定为AF_INET,IP地址对服务器可取任意合法地址INADDR_ANY。
IP端口号可由用户设定,但要注意主机字节顺序向网络字节顺序的转换。
给套接字命名。
由socket()函数创建的套接字是没有名字的。
所谓命名,就是用bind()函数将服务器地址捆绑到创建的套接字上。
服务器进程准备接受来自客户机的连接请求。
首先调用listen()函数,让服务器进程进入监听状态;然后调用accept()函数,
准备接受客户机的连接信号。
无连接请求时,服务进程被阻塞。
客户进程调用socket()函数创建已端的套接字。
给客户端的sockaddr_in结构体变量赋值。
地址类型仍可取AF_INET,端口号和服务器方的端口号相同,
欲连服务器的地址通过调用inet_addr()转换得到。
也可通过gethostbyname()函数将名字转换为指向hostent结构变量的指针,
再将hostent结构变量的地址成员用bcopy()复制到sockaddr_in结构变量上。
客户方调用connect()函数向服务进程发出连接请求。
当连接请求到来后,被阻塞服务进程的accpet()函数生成一个新的字节流套接字,
并返回客户机的sockaddr_in结构变量从而在服务器应用程序中用新的被赋予客户机地址的套接字同客户进程进行连接
然后向客户方返回接受信号。
一旦客户机的套接字收到来自服务器的接受信号,
则表示客户机与服务器双方已实现连接。
任一方均可向对方发送,也可接收对方发来的数据。
这既可通过send()、recv()函数来实现。
也可通过read()、write()函数来交换数据。
服务进程和客户进程可通过调用shutdown()和colse()关闭套接字上的所有发送和接收操作,
撤销套接字并中断连接。
下面介绍一些基本概念:
(1)带外数据
带外数据,也称为TCP紧急数据,它是相连的每一对流套接字间的一个逻辑上独立的传输通道,带外数据是独立于普通数据传输给用户的,这一抽象要求带外数据设备必须支持每一时刻仅有一个带外数据信息等候发送。
对于仅支持带外数据的通信协议来说(例如紧急数据是与普通数据在同一序列发送),
系统通常把紧急数据从普通数据中分离出来单独存放。
这就允许用户可以在顺序接受紧急数据和非顺序接收紧急数据之间作出选择。
(2)广播
数据报套接字可以用来向许多系统支持的网络发送广播数据包。
要实现这种功能,网络必须支持广播功能。
为此系统软件并不提供对广播功能的任何模拟。
广播信息将会给网络造成极重的负担,为此它们要求网络上的每台主机都为他们服务,
所以发送广播数据包的能力被限制于那些用显式标记了允许广播的套接字中。
上一篇:
基于VC的局域网聊天室任务书和开题报告
下一篇:
近三年来思想工作小结(德能勤绩廉)