使用Sockets

3/8/2008来源:C/C++教程人气:6934


  使用sockets Socket控件让你建立一个利用TCP/ip和有关的协议与其他系统进行通信的应用。使用Sockets,你能够读和写通过它连接的其他机器,而不用担心实际的网络软件的相关细节。Sockets提供基于TCP/IP协议的连接。除此以外还能很好的工作,在其他相关的协议,例如Xerox Network System (XNS), Digital's DEC net, or Novell's IPX/SPX 家族。
C++ Builder提供你写网络服务器或客户应用程序去读和写其他的系统。一个服务或客户程序通常专注于一个单一的服务如超文本传送协议(HTTP)或文件传输协议(FTP)。使用server sockets,一个应用程序可以提供这些服务中的一个去连接一个希望使用服务的客户程序。Client sockets答应一个应用使用这些服务中的一个去连接提供这个服务的服务应用。
使用sockets去写应用程序,你必须理解下面这些知识:
一、服务工具
当你需要写网络服务或客户应用时,Sockets提供一种接合。对于许多服务,象
HTTP 或 FTP,第三方服务商提供这些服务已经相当有效。有些甚至随着操作系统捆绑而来,以便不用你自己写。然而,当你想更多的控制服务的实现,如想让你的应用程序与网络通信更加紧密,或当没有一个服务能提供你非凡需要的服务时,你可能想建立你自己的服务或客户应用。例如,工作在分布式data sets时,你可能想为数据库写一层与其他系统通信的应用。想使用Sockets实现一个服务,你必须理解:

1.服务协议
在你写一个网络服务或客户程序前,你必须明白你的应用将提供或使用什么服务。你的网络应用必须支持许多服务的标准协议。假如你为标准的服务例如HTTP,FTP写网络应用,或even finger or time,你必须先理解与其他系统通信所使用的协议。非凡服务细节你必须看提供的或使用的文档。
假如你的应用程序提供一个新的服务与其他系统通信,第一步是为这个服务的
服务端和客户端设计通信协议。什么信息将发送?如何整理这些信息?如何对这些信息进行编码?

应用程序通信
经常的,你的网络服务端或客户端应用程序要提供一层在网络软件和一个应用之间使用的服务。例如,一个HTTP服务站点在INternet与一个Web 服务应用之间为HTTP请求信息提供内容和应答。
在你的网络应用(或客户应用)和网络软件之间Sockets 提供一个接口。你必须提供一个接口,在你的应用程序与应用间使用。你可以拷贝第三方服务商提供的标准API(例如ISAPI),或你可以设计和发布你自己的API.

2.理解服务和端口
许多标准服务都有关联的、指定的端口号。当 执行服务时,你可以为服务考虑一个端口号。假如你实现一个标准服务, Windows socket objects 提供一些方法让你为服务寻找端口号。假如提供一个新的服务,在基于Windows 95 或 NT机器上,你能够在文件Services中为你的服务指定一个相关联的端口号。设置Services文件的更多信息请看微软 的Windows Sockets文档。

二、Socket连接的类型
Socket连接可以分成三个基本的类型,它们反映了如何开始连接和本地Socket 连接是什么。这三个类型是:

1.客户端连接
客户端连接是一个本地系统的客户端socket与一个远程系统上的服务端Socket连接。客户端连接由客户端Socket开始。首先,客户端Socket必须描述它想连接到的服务端Socket. 接着客户端socket查找服务端socket,当找到服务器时,就要求连接。服务端socket可能不能完成正确的连接。服务器sockets维持一个客户端请求队列,在他们有时间时完成连接。当服务端socket接受客户端连接,服务端socket
将向它想连接的客户socket发送一个完整的描述,客户端的连接完成。

2.倾听连接
服务器 socket不会去定位客户端,代替的,他们形成被动的,"半连接"状态,倾听来自客户端的请求。服务器 sockets形成一个队列,存放 它们听到的连接请求。这个队列记录着客户端连接请求就象他们已连接进来一样。当服务器sockets同意客户连接请求时,它形成一个新的socket去连接客户端,因此这个倾听连接能保持开放状态答应其他客户端请求。

3.服务端连接
当倾听socket同意一个客户端请求时,服务器端socket形成一个服务器连接。当服务器端同意连接时,向客户端发送一个服务端socket描述以完成连接,当客户端socket收到这个描述时这个连接得到确认,连接完成。一但连接到客户端的Socket完成,服务端连接就不能识别从一个客户端来的连接。末端双方有同样的能力去接收同样的事件类型。只有倾听(listening)连接是根本不同的,它只有一个单一的末端。

三、sockets描述
Sockets让你的网络应用软件通过网络与其他系统进行通信。在网络连接中每个socket可以看成一个终端点。它有一个指定的地址。

*这个系统正在运行
*它理解的接口类型
*用来连接的端口
一个完整的socket连接描述,你必须提供sockets 在连接两端的地址。在你开始一个socket连接前,你必须完整的描述你想得到的连接。有些信息可以从你的应用
软件运行的系统平台上得到。例如,你不需要描述一个客户端socket的本地IP地址--这个信息可以从操作系统上获得。你必须提供你工作所依靠的socket的类型的信息。客户端socket必须描述他们想连接的服务器。侦听服务器sockets必须描述他们提供反应的服务器的端口。一个socket 连接终端的完整描述包括两部分:


1.IP地址
主机是这样一个系统,它运行着包含有socket的应用程序。你必须描述主机给socket,通过给出主机的IP地址来完成这个描述。IP地址是一个有四个数字(byte)值的,在标准internet点付内的字符串。
例如123.197.1.2
一个简单的系统可以支持多于一个的IP地址。IP地址通常难于记忆并且轻易打错。一个可供选择的方法是使用主机名。主机名就是IP地址的别名,它就是你常看到的统一资源定位(URLs)。它是一个字符串,包括了域名和服务。
例如 http://www.wsite.com
许多内部网提供给主机的名字对应的系统IP地址是internetIP地址。在windows95 和NT机器上,假如一个主机名不能用,你可以在HOSTS文件中为你的本地IP地址(这个本地IP地址应该是指你想连接的主机IP地址--zyqsj)建立一个进入的名字。
关于HOSTS文件的更多信息请看WINDOWS SOCKETS的文档。
服务器sockets不需要指定主机。本地IP地址可以从系统中读到。假如本地系统支持多于一个的IP地址,服务器sockets将同时在所有的IP地址上侦听客户端请求。当一个服务器socket同意一个连接,客户端提供一个远程IP地址。客户sockets必须指定远程主机通过提供主机名或者IP地址。

在主机名和IP地址间作一个选择
许多应用软件使用一个主机名去指定一个系统。主机名轻易记住和轻易检查排版错误。进一步讲,服务器能改变系统或与IP地址关联的非凡的主机名。使用一个主机名,能够答应客户端通过主机名描述找到抽象的站点,即使主机使用一个新的IP地址。
假如主机名是未知的,客户socket必须指定服务器系统使用的IP地址。通过给一个IP地址来指定服务器将更快。当你提供主机名时,socket在定位服务器系统前,必须搜寻与这个主机名相关的IP地址。

2.端口号
虽然IP得地址提供了足够的信息去找到socket连接中位于另一端的系统,你通常还需要指定那个系统的端口号。没有端口号,一个系统在同一时间只能进行一个单一的连接。端口号是唯一标识那答应一个独立系统连接到支持同时多个连接的主机,每个连接都必须指定一个端口号。
在网络应用中,对于服务器工具来说端口号是一个数字代码。有一个习惯就是侦听服务连接到他们自己固定的端口号上,以便他们能找到客户端sockets.服务器socket监听为他们提供服务的相关端口号。当他们答应给予一个客户端socket连接时,他们创建一个独立的socket连接,使用不同的专用的端口号。通过这个方法,能持续的监听相关服务的端口号。
客户端socket使用一个专用的本地端口号,就不用其他的socket去寻找它们。他们指定他们想连接的服务器端socket的端口号,这样他们就能找到服务器应用程序。经常的,这个端口号是通过命名想连接的服务来间接指定的。

四、使用socket控件
C++Builder提供两个socket控件,客户端sockets和服务器sockets.他们答应你的网络应用构成连接其他的机器和答应你通过这个连接来读写信息。与每个socket控件相关联的是windows socket对象,它们在终端的的作用是一个实际的socket连接。socket控件使用windows socket对象去封装windows socket API 调用,所以你的应用不用去关心连接建立的细节或治理socket信息。
假如你想利用windows socket API调用或自定义连接细节,socket控件提供了便利,你可以使用windows socket对象的PRoperies,events和方法。

1.使用客户端sockets
添加一个客户端socket控件(TClientSocket)到你的form或data module 使你的应用成为一个TCP/IP客户。客户sockets答应你指定你想连接的服务器socket和你希望服务器提供的服务。一但你描述你想得到的连接,你可以使用客户socket控件去完成连接服务。
每个客户socket控件使用独立的客户windows socket对象(TClientWinSocket)去应答连接中的客户终端。使用客户sockets去:

A.指定想得到的服务
客户socket控件有一个数字properties,答应你指定想连接的服务器系统和端口。你可以通过主机名来指定服务器系统,使用Host property。
假如你不知道主机名,或者你关心找到服务器的速度,你可以指定服务器系统的IP地址,通过使用 Address property。你必须指定IP地址和主机名中的一个。
假如你两个都指定,客户socket控件将