分享
 
 
 

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

王朝system·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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中

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有