荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Peter (小飞侠), 信区: Program
标  题: 用TCP/IP套接字开发网络应用
发信站: BBS 荔园晨风站 (Thu Jan 21 22:45:04 1999), 转信


    进入九十年代后,随着计算机和网络技术的发展,很多数据处理系
统都采用开放系统结构的客户机/服务器网络模式,即客户机提出任务
请求,通过网络发送给服务器,由服务器做相应处理,执行被请求的任
务,然后将结果返回给客户机。例如:银行ATM的前置机和数据处理的
主机之间即构成客户机/服务器网络模式;电话银行的前置机和银行数
据处理主机之间也构成这种网络模式结构等。这样,如何在前置机和
数据主机之间进行信息交换,即进程网络通信,就成为实现这种网络模
式的基础。而TCP/IP的套接字技术是解决这一问题的有力工具。它从
提出时就一直发挥着愈来愈重要的作用,并已成为UNIX操作系统下TCP
/IP网络编程标准;甚至i ndows、Java都配有它的通用接口。有了这
个强有力的工具,我们可以实现异种机、异种操作系统应用程序间的
相互连接和通信。

    基本概念
    套接字(sockets)是支持TCP/IP协议的网络通信的基本操作单元
。可以将套接字看作不同主机间的进程进行双向通信的端点。它构成
了在单个主机内及整个网际间的编程界面。一般来说,跨机应用进程
之间要在网络环境下进行通信,必须要在网络的每一端都要建立一个
套接字,两个套接字之间是可以建立连接的,也是可以无连接的,并通
过对套接字的"读"、"写操作实现网络通信功能。类似于UNIX系统中
的I/O概念,像文件那样有打开、读、写、关闭的方式。根据传输数据
类型的不同,套接字可分为面向连接的数据字节流套接字(stream sco
ets )和无连接的数据报套接字(datagram sockets)两种类型。
    1.字节流套接字
    字节流不按记录定界,在TCP/IP协议簇中对应TCP协议,即传输控
制协议(Transmitionon trol Protocol)。它是一个提供给用户进程
可靠的全双工的面向连接的协议,大多数Intrne t应用程序如ftp、te
lnet使用TCP协议。通信端点使用TCP对应的Internet地址互相连接,
可保证按正确的顺序以及单一和可靠的地址传输数据。由于它是字节
流,所以包长度没有限制,信包传输也不重复,因而是一种常用的套接
字类型。
    2.数据报套接字
    数据报对应记录型数据流,在TCP/IP协议簇中对应UDP协议,即用
户数据报协议(UserDaa gram Protocol)。利用数据报服务可实现一
些简单的网络服务,如网点检测程序Ping。由于不建立连接,数据报协
议比连接协议快,但不能保证所有数据都准确有序地到达目的地。不
保证顺序性、可靠性和无重复性。它是无连接的服务,以独立的信包
进行传输,通信端点使用D P对应的Internet地址。双方不需互连,按
固定的最大长度进行传输,因而适用于单个报文传输,或较小文件的传
输。

    套接字的编程要点及运作过程
    不论何种套接字编程,均采用客户机/服务器方式,其运用过程基
本类似,限于篇幅,这里仅介绍字节流套接字。字节流套接字的服务进
程和客户进程,在通信前必须创建各自的套接字以建立连接,然后对相
应的套接字进行"读"、"写"操作,实现信息的交换。步骤如下。
    1.服务器进程创建套接字。服务进程总是先于客户进程启动,服
务进程首先调用scok et()函数创建自己端的一个字节流套接字,并提
供三个参数:网络地址类型,一般取AF-N ET(Address family InterNE
T);套接字类型,这里取SOCK-STREAM;网络协议,缺省为TCP/I协议,对
应参数为0。

    2.给套接字地址变量赋初值。在生成套接字后,要用服务器的地
址先对sockaddr—in 结构变量赋初值。scokaddr—in在/usr/includ
e/netinet/in.h中有定义,它只适用于n ternet地址类型,含有Intern
et套接字地址类型、IP端口号、IP地址等信息。地址类型可取定为AF
—INET,IP地址对服务器可取任意合法地址INADDR—ANY。IP端口号可
由用户设定,但要注意主机字节顺序向网络字节顺序的转换。

    3.给套接字命名。由socket()函数创建的套接字是没有名字的。
所谓命名,就是用bi nd()函数将服务器地址捆绑到创建的套接字上。

    4.服务器进程准备接受来自客户机的连接请求。首先调用listen
()函数,让服务器进程进入监听状态;然后调用accept()函数,准备接
受客户机的连接信号。无连接请求时服务进程被阻塞。

    5.客户进程调用scoket()函数创建自已端的套接字。
    6.给客户端的sockaddr—in结构体变量赋值。地址类型仍可取AF
—INET,端口号和服务器方的端口号相同,欲连服务器的地址通过调用
inet—addr()转换得到。也可通过gt hostbyname()函数将名字转换
为指向hostent结构变量的指针,再将hostent结构变量的地址成员用b
copy()复制到sockaddr—in结构变量上。

    7.客户方调用connect()函数向服务进程发出连接请求。
    8.当连接请求到来后,被阻塞服务进程的accpet()函数生成一个
新的字节流套接字, 并返回客户机的sockaddr-in结构变量,从而在服
务器应用程序中用新的被赋予客户机地址的套接字同客户进程进行连
接,然后向客户方返回接受信号。
    9.一旦客户机的套接字收到来自服务器的接受信号,则表示客户
机与服务器双方已实现连接。任一方均可向对方发送,也可接收对方
发来的数据。这既可通过send()、rec( )函数来实现,也可通过read(
)、write()函数来交换数据。
    10.服务进程和客户进程可通过调用shutdown()和close()关闭套
接字上的所有发送和接收操作,撤销套接字并中断连接。
    上述所有系统函数均包括在libsocket.a系统库中,IBM PC (UNIX
)操作系统编译时需加llibsocket链接。IBM RS/6000(AIX)操作系统
编译时无需此参数。
    整个运作过程可用下图表示:
图1

    编程示例
    本文给出一个运用字节流套接字、在TCP/IP网络上实现客户机/
服务器方式进程通信的实例,该程序在IBM RS/6000小型机和IBM PC 5
86微机上调试通过。它主要模拟根据帐号查询余额的过程,客户机是
一台电话银行的前置机(IBM PC),服务器是银行数据处理主机(IBM R/
6000)。通信过程包括三方面:

    1.客户机从标准输入读入帐号,并将帐号发送给服务器。
    2.服务器接收该帐号后,进行判断是否有此帐号的数据,并将结果
返回给客户机。
    3.客户机接收返回的信息,并将结果输出在标准输出上。服务进
程需先于客户进程启动。客户进程启动时要携带服务器的IP地址,如:
clientpros 23.169.1.1。
    编者注:本文所提供的程序刊登在本报的WWW站点上,网址是:http
://www.computerword .co.cn/skills/shill.html。欢迎访问!

--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.1.3]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店