用PB编写WinSock TCP/IP应用程序

7 篇文章 0 订阅

用PB编写WinSock TCP/IP应用程序
 
 
作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站
 http://www.it97.cn/Art/Show.asp?id=18705
 http://www.moon-soft.com/doc/4023.htm
 


  PB中的套接字是通过Winsock.pbl库来提供的,它封装了套接字编程中用到的数据结构和过程,在功能上类似于VB中的Winsock控件。

  Winsock.pbl中定义了两种类型的Socket:流式Socket和数据报式Socket。流式Socket需要连接到另一个处于监听状态的流式Socket后才能进行通信,是基于连接的,其可靠性高;数据报式Socket无需建立连接,源主机发出的报文在网络中经过存储转发后到达目的主机,效率高但可靠性低。编程时,根据应用环境和需求选择其中一种,若通信子网相当可靠,可考虑采用数据报式Socket。

图1

  用PB编写WinSock TCP/IP应用程序的第一步是将Winsock.pbl加到应用程序中,然后声明如下全局变量:

  Winsock ws

  Boolean b—tcp—active

  //用于检验ws是否初始化成功

  PowerObject gpo—null//全局空对象

  在应用程序的Open事件加入下列代码:

  ws=Create Winsock

  //初始化Winsock的一个实例

  SetNull(gpo—null)//ws的函数中用到空对象gpo—null

  在应用程序的Close事件加入下列代码:


图2

  Destroy ws//销毁ws对象

  完成以上工作后,就可以着手编程了,下面介绍如何利用Socket进行通信。

  1.用数据报式Socket向本机的7号端口发送数据

  TCP和UDP协议规定了传输层端口的长度为16比特,因此TCP和UDP软件可以使用216个不同的端口进行通信。尽管如此,编程时最好不要使用前1024个端口,因为这个范围内很多是专用端口,如21为FTP端口。本例中用到的7号端口很特殊,它回显接收到的任何数据,常用于端口检测。下面就向本机的7号端口发送数据报:

  DGSock=Create Socketdgram

  //创建数据报式Socket对象

  ulAddr=ws.inet—addr(″127.0.0.1″)

  //将本机IP地址转换为32位的ulong类型

  buf=Blob(″These data is send through datagram~r ~n″)//要发送的数据

  DGSock.sendto(buf,Len(buf),0,ulAddr,7)

  //向ulAddr主机的7号端发送数据报

  buf=Blob(Space(Len(buf)))

  //清空buf缓冲区

  DGSock.recv(buf,Len(buf),0)

  //接收数据报

  MessageBox(′Data Received′,String(buf))

  //显示接收到的数据

  DGSock.closesocket()//关闭Socket

  Destroy DGSock

  从上面的演示可以看出,发送到本机7号端口的数据报立即被反弹回来。

  2.用流式Socket 开发网络聊天程序

  网络聊天程序通常包含两个部分:服务程序和客户程序。服务程序一直处于监听状态,当听到客户程序的呼叫时,就创建一个Socket对它进行响应。下面用流式Socket开发一个两节点聊天程序:

  (1)编写服务程序

  服务程序界面如图1所示。在主窗口的Open事件中创建流式Socket的一个实例:

  sSock=Create SockStream//sSock为实例变量

  在“监听”按钮的Clicked事件中加入下列代码:

  ulAddr=ws.inet—addr(″202.140.1.20″)

  //将服务器地址转为ulong类型

  sSock.bind(ulAddr,2000)//将流式Socket绑定到ulAddr地址的2000号端口上

  sSock.listen(5)//监听上述地址和端口,参数为请求队列长度,最大值为5

  uiSockType=sSock.accept(ulClientAddr,iClientPort)

  //接受客户请求,参数填入了客户Socket的地址和端口,返回值为客户Socket类型

  sAccept=Create Socket

  //创建一个Socket响应客户请求

  ulParam=1

  sAccept.initsocket(uiSockType)

  //与客户Socket类型相同

  sAccept.ioctlsocket(ws.FIONBIO,ulParam)

  //异步模式

  Timer(0.5)

  //启动定时器,以0.5秒的间隔接收数据

  在Timer事件中加入下列代码来处理到达的数据:

  buf=Blob(Space(256))//定义缓冲区大小

  sAccept.recv(buf,Len(buf),0)

  //接收到达的数据

  mle—1.Text=mle—1.Text+Trim(String(buf))

  //显示消息

  在“发送”按钮的Clicked事件中加入下列代码:

  buf=Blob(mle—2.Text+″~r~n″)

  //将mle—2中的内容放入发送缓冲区

  sAccept.send(buf,Len(buf),0)

  //将buf中的内容发给对方

  mle—2.Text=″ ″

  //清除已发送的内容

  在“退出”按钮的Clicked事件中加入下列代码:

  sAccept closesocket()//关闭Socket

  Destroy sAccept

  sSock.closesocket()

  Destroy sSock//清除Socket

  (2)编写客户程序

  设计如图2所示的窗口,其Open事件的代码为:

  sClient=Create SocketStream

  //创建流式Socket

  ulParam=1

  //1表示异步模式(即非阻塞模式)

  Timer(0.5)//启动定时器,以0.5秒的间隔检查是否有数据到达

  sClient.ioctlsocket(ws.FIONBIO, ulParam)

  //将sClient设置为异步模式

  在“连接” 按钮的Clicked事件中加入下列代码:

  ulAddr=ws.inet—addr(″202.140.1.20″)

  //服务器地址

  If sClient.wsconnect(ulAddr,2000)=-1 Then//连接到服务器的2000号端口

  MessageBox(′Socket′,″连接服务器失败″)

  End If

  Timer事件和“发送”按钮的Clicked事件的代码与服务程序相同,只需将套接字对象sAccept改为sClient即可。

  声明:缺省情况下创建的流式Socket对象使用同步模式,可根据需要将其转换成异步模式。在同步模式下,一些Winsock函数调用在完成处理之前不会把控制权还给程序,导致程序无响应。例如,在数据到达之前,recv()调用将一直处于等待状态。在上面的服务程序中,用于监听客户连接的Socket使用了同步模式,响应客户请求的Socket使用了异步模式,客户程序中的Socket也使用了异步模式。

  运行服务程序,点击“监听”进入等待状态;运行客户程序,点击“连接”进行呼叫。建立连接后,就可以聊天了。在mle—2中输入消息,点击“发送”就可传给对方,对方发过来的消息显示在mle—1中
 

 
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本例子就是Delphi中如何利用Socket编写通信程序。 计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCP/IP和UDP协议。TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登陆BBS,用的就是TCP协议;UDP是无连接的,通信双方都不保持对方的状态,浏览器访问Internet时使用的HTTP协议就是基于UDP协议的。TCP和UDP协议都非常复杂,尤其是TCP协议,为了保证网络传输的正确性和有效性,必须进行一系列复杂的纠错和排序等处理。   Socket是建立在传输层协议(主要是TCP和UDP)上的一种套接字规范,最初是由美国加州Berkley大学提出,它定义两台计算机间进行通信的规范(也是一种编程规范),如果说两台计算机是利用一个“通道“进行通信,那么这个“通道“的两端就是两个套接字。套接字屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了套接字规范的计算机之间的通信成为可能。   微软的Windows Socket规范(简称winsock)对Berkley的套接字规范进行了扩展,利用标准的Socket的方法,可以同任何平台上的Socket进行通信;利用其扩展,可以更有效地实现在Windows平台上计算机间的通信。在Delphi中,其底层的Socket也应该是Windows的SocketSocket减轻了编写计算机间通信软件的难度,但总的说来还是相当复杂的(这一点在后面具体会讲到);Inprise在Delphi中对Windows Socket进行了有效的封装,使得用户可以很方便地编写网络通信程序。 本例子就是Delphi中如何利用Socket编写通信程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值