浅谈在PowerBuilder中实现Socket通信
作者:陆璐,王艳萍
来源:《电脑知识与技术》2010年第02
        摘要:随着计算机技术以及网络通信技术的发展,Socket技术已经成为了网络编程的基础,SocketAPI提供了进程之间的通信功能。PowerBuilder作为一门程序开发语言在开发信息管理系统以及各类跨平台数据库中有着广泛的应用。文章简单介绍了Socket的通信原理以及使用方法,并以聊天程序为例讲解了如何在PowerBuilder中利用Winsock控件增强网络功能,实现Socket通信。
        关键词:套接字;会话层;数据报;TCP套接字;UDP套接字
        中图分类号:TP393 文献标识码:A文章编号:1009-3044(2010)02-334-03
        On the Socket Communication is Implemented in PowerBuilder
        LU Lu, WANG Yan-ping
        (Zhengzhou Railway Vocational and Technical College, Zhengzhou 450052, China)
        Abstract: With the computer technology and network communication technology, Socket technology has become the basis of network programming, SocketAPI provide a process of communication between. PowerBuilder as a program development language in the development of information management systems and a variety of cross-platform database has a wide range of applications. Article a brief introduction of the Socket communication theory and the use of methods, and to chat program as an example to explain how to use Winsock control in PowerBuilder to enhance network capabilities to achieve Socket Communications.
        Key words: socket; session layer; datagrams; TCP socket; UDP socket
        Socket编程接口由4BSD UNIX首先提出,目的是解决不同网络间通信问题。Socket接口为进程间通信提供了一种新的手段,它不但能用于同一机器中的进程之间的通信,而且支持网络通信功能。要想弄清楚Socket的工作原理,必须对网络通讯技术有所了解。在计算机界,为了保证各种网络、各种机器、各种操作系统之间能进行互联,进行数据交换,采取了开放式互联模型,OSI模型,它将网络通讯划分为7个层次。
        1 OSI七层模型概述
        OSI模型成为计算机之间,以及网络间进行通信的主要的结构模型。从上到下,各层名称及其描述依次为:
        1) 第七层:应用层(Application Layer):定义了用于在网络中进行通信和数据传输的接口用户程式;提供标准服务,比如虚拟终端、文件以及任务的传输和处理。
        2) 第六层:表示层(Presentation Layer):掩盖不同系统间的数据格式的不同性;指定独立结构的数据传输格式;进行数据的编码和解码、加密和解密、压缩和解压缩。
        3) 第五层:会话层(Session Layer):管理用户会话和对话;控制用户间逻辑连接的建立和挂断;报告上一层发生的错误。
        4) 第四层:传输层(Transport Layer):管理网络中端到端的信息传送;通过错误纠正和流控制机制提供可靠且有序的数据包传送;提供面向无连接的数据包的传送。
        5) 第三层:网络层(Network Layer):定义网络设备间如何传输数据;根据唯一的网络设备地址路由数据包;提供流和拥塞控制以防止网络资源的损耗。
        6) 第二层:数据链路层(Data Link Layer):定义操作通信连接的程序;封装数据包为数据帧;监测和纠正数据包传输错误。
        7) 第一层:物理层(Physical Layer):定义通过网络设备发送数据的物理方式;作为网络媒介和设备间的接口;定义光学、电气以及机械特性。
        通过OSI模型,信息可以从一台计算机的软件应用程序传输到另一台的应用程序上。比如,要实现计算机A与计算机B之间通信,实际上,通信过程是计算机A上的应用程序要将信息发送到计算机B的应用程序。中间过程如下:
        计算机A中的应用程序需要将信息先发送到其应用层(第七层),然后此层将信息发送到表示层(第六层),表示层将数据转送到会话层(第五层),如此继续,直至物理层(第一层)。在物理层,数据被放置在物理网络媒介中并被发送至计算机B。计算机B的物理层接收来自物理媒介的数据,然后将信息向上发送至数据链路层(第二层),数据链路层再转送给网络层,依次继续直到信息到达计算机B的应用层。最后,计算机B的应用层再将信息传送给应用程序接收端,从而完成通信过程。
        2 Socket概述
        2.1 套接字(Socket)所处位置
        套接字大致位于OSI模型的会话层。会话层为两台计算机之间的数据流提供管理和控制服务。作为该层的一部分,套接字提供一个隐藏从导线上获取比特和字节的复杂性的抽象。换句话说,套接字允许我们让应用程序表明它想发送一些字节即可传输数据。套接字隐藏了完成该项工作的具体细节。
        2.2 套接字的类型
        套接字一般有两种类型:TCP套接字和UDP套接字。两者都接收传输协议数据包并将其内容向前传送到表示层。
        TCP 把消息分解成数据包(数据报,Datagrams),并在接收端以正确的顺序把它们重新装配起来。TCP 还处理对遗失数据包的重传请求。有了 TCP,位于上层的层要担心的事情就少多了。
        UDP 不提供装配和重传请求这些功能。它只是向前传送信息包。位于上层的层必须确保消息是完整的并且是以正确的顺序装配的。一般而言,UDP 强加给您的应用程序的性能开
销更小,但只在应用程序不会突然交换大量数据并且不必装配大量数据报以完成一条消息的时候。否则,TCP 才是最简单或许也是最高效的选择。
        2.3 Socket的使用方法
        下面,我们一一给出重要的Socket系统调用的使用方法。
        1) 创建 Socket。调用格式为:sockid = socket (af, type, protocol)其参数意义如下:
        af:地址族,指本socket所用地址类型。
        type:类型,socket通信在哪一层指创建socket的应用程序所希望的通信服务器类型。
        protocol:协议,指该socket请求的协议。
        2) 指定本地地址—bind()调用。
        bind()将本地socket地址与所创建的socket联系起来,即将本socket地址赋予socket,以指定本地半相关。bind()的作用相当于给socket命名,调用格式为bind(sockid,localaddr,addrlen)
       
        其参数意义如下:
        sockid:socket号。
        localaddr:本地socket地址。
        addrlen:地址长度。
        3) 建立socket连接—connect() accept()调用。
        这两个系统调用用于完成整个相关的建立。其中connect用于建立连接。调用格为
        connect(sockid,destaddr,addrlen),其中destaddr为指向对方socket地址(信宿地址)结构的指针。
        accept()用于面向连接的服务器,其调用格式为:
        newsock =accept(sockid,clientaddr,paddrlen),其中clientaddr为指向客户socket地址指
,paddrlen为客户socket地址长度。
        4) listen()调用
        此调用用于面向连接服务器,表明它愿意接收连接,listen()accept()之前调用,格式为
        listen (sockid,quelen),其中quelen 为请求队列长度。
        5) 发送数据—write(),writev(),send()sendto(),sendmsg()
        用于socket数据发送的系统调用一共有五个,其中三个,write(),writev()send()用于面向连接传输,其余两个用于无连接传输。面向连接的调用可以不指定信宿地址,而无连接的调用必须指定。假如无连接socket的双方均调用过connect(),可以认为是建立有连接的socket,也可以面向连接调用发送数据。
        6) 接收数据—read(),readv(),recv()recvfrom(),recvmsg()
        接收数据与发送数据系统调用是一一对应的,两者参数的最大区别是,前者buffer是一个指针,其所指单元初值为欲读数据长度,调用后的值是实际读出的值。
        2.4 Socket控件
        针对Socket API存在的使用复杂、同步阻塞等问题,Microsoft公司对其进行了封装,开发了WinSock控件。该控件具体使用简单、可靠性强、支持事件等特性,对于开发人员而言,就是一个典型的对象,有属性、方法和事件,因此可以极高地提高软件的开发效率。
        Winsock控件对用户是不可视的,可以很容易地访问TCPUDP网络服务。其可以被Microsoft Access, Visual Basic,Visual C++Visual FoxPro开发人员使用。要编写客户和服务器应用程序,不需要了解TCP或调用底层Winsock API的具体细节。通过设置Winsock控件的属性和调用该控件的方法,可以很容易地连接到远程计算机并进行双向的数据交换。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。