vfp 中揭开winsock的神秘面纱

上传人:第*** 文档编号:30723734 上传时间:2018-01-31 格式:DOC 页数:13 大小:31KB
返回 下载 相关 举报
vfp 中揭开winsock的神秘面纱_第1页
第1页 / 共13页
vfp 中揭开winsock的神秘面纱_第2页
第2页 / 共13页
vfp 中揭开winsock的神秘面纱_第3页
第3页 / 共13页
vfp 中揭开winsock的神秘面纱_第4页
第4页 / 共13页
vfp 中揭开winsock的神秘面纱_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《vfp 中揭开winsock的神秘面纱》由会员分享,可在线阅读,更多相关《vfp 中揭开winsock的神秘面纱(13页珍藏版)》请在金锄头文库上搜索。

1、VFP 中揭开 Winsock 的神秘面纱在今天 TCP/IP 处理所有 Internet 上的通信流. 在局域网上也可以运行 TCP/IP. 我们可以利用这一点, 并在诸如 FTP, IRC, e-mail, WWW 或其它任何 Internet 标准类型的通信. 要达到这样的目的, 需要使用包含在 Windows 中的一个 DLL, 也就是所谓的 WSOCK32.DLL 或相似的名字.在使用 DLL 中的唯一问题 , 直接的 , 是我们将不得不控制和处理每一个函数的反应而且这将会造成额外的和不必要的开销.Windows 已经有一个 ActiveX 叫做 WINSOCK.OCX. 它使用与我

2、们所需要的相同的 DLL, 并已经用方法和事件控制和处理了整个反应, 使它易于使用.初识 ActiveX Winsock 控件方法 说明Accept(requestID) 该方法用于接收一个特写的连接. 它作为一个参数传递来处理请求.Bind(LocalPort,LocalIP) 为 CDP 连接指定端口和本地 IP.Close() 关闭服务器和客户之间的活动的连接.GetData(Data,Type,maxLen) 用缓冲中的内容填充变量, 使其为空.Listen() 对象等等连接.PeekData(Data,Type,maxLen) 用缓冲中的内容填充变量, 但不清空缓冲.SendData

3、(Data) 发送数据到远程计算机.事件 说明Close 当远程计算机关闭当前连接时发生Connect(Error) 与服务器的连接成功后.ConnectionRequest(requestID) 当远程计算机发出一个请示时.DataArrival(BytesTotal) 在从远程计算机上接收到新数据时发生.Error(number, Description, Scode, Source, HelpFile, HelpContext, CancelDisplay) 当发生后台处理错误时.SendComplete 数据发送完毕时发生SendProgress(bytesSent, bytesRem

4、aining) 在发送数据时.属性 说明BytesReceived 返回到缓冲中的字节数LocaHostName 返回本地机器的名字LocalIP 本地计算机的 IP 地址LocalPort 数据传送的端口 (客户) 或代表一个连接 (服务器)Name 对象名Object 运行时自动创建, 仅在 VFP 中.Protocol 使用的协议 TCP (0) 或 UDP (1)属性 说明RemoteHost 返回远程计算机的端口RemoteHostIP 返回远程计算机 IPRemotePort 返回远程计算机上的连接端口SocketHandle 返回控件当前连接的句柄State 返回控件的状态:0

5、= 已关闭1 = 打开2 = 等待连接3 = 正在连接4 = 决定主机5 = 主机已决定6 = 正在连接7 = 已连接8 = 连接被远程计算机关闭9 = 错误在 VFP 中使用它在 VFP 中使用 ActiveX Winsock 时你必须牢牢记住:在运行任何 ActiveX 方法前, 必须添加 .F. 到应用程序的 AutoYeld 属性 (application.autoyield = .f.);所有与 Windsock 相关的方法, 事件或属性必须加上 object 前缀(thisFORM.wsock1.OBJECT.connect)VFP 不能处理字符串中的 CHR(0) 字符 . 因此

6、, 如果你要处理带有这些内容的数据就需要一字节一字节地读缓冲中接收到的数据. 例如, 就象连接到 Unix 服务器一样.让我们看看示例 1 来开始测试我们的过程:它由两个表单组成: 1 个客户表单和一个服务器表单. 它的功能是从客户传送一个文本信息到服务器. 另外服务器以小写方式返回相同的信息.请注意在两个表单的 INIT 方法中的命令 pplication.AutoYield = .f. 这意味着我们告诉 VFP 不处理方法中的每一个代码行, 让 ActiveX 自己控制它的事件. 在表单的 CLOSE 方法中我们包括了 Application.AutoYield = .t. 来允许 VFP

7、 按一般方法控制事件.在 SERVER 表单的 INIT 方法中有两个重要的命令:thisFORM.sock1.object.LocalPort = 3001使用以上命令, ActiveX Winsock 在端口 3001 上接收连接.thisFORM.sock1.object.Listen()该命令告诉 Winsock to 等待连接. 从此时开始, 上面的命令中定义的端口将打开并等待一个连接.当检测到连接时, 将触发 ConnectionRequest 事件, 发送这个新连接的句柄作为一个参数. 查看示例中的该方法的详细情况:This.object.close()确信没有其它未决的连接并停

8、止等待.This.object.Accept(requestid)运行 Accept 方法, 发送连接句柄作为参数. 仅现在连接是设置了的.现在, 让我们到 CLIENTE 表单, 在发送按钮的 CLICK 方法上:lc_local_IP = thisFORM.sock1.object.LocalIP我们用服务器的 IP 地址定义一个变量 . 在此情况下, 我们从 Winsock 的 LocalIP 属性来获得当前计算机的地址.lc_local_Port = 3001我们定义了一个将连接到服务器端口的变量. 请确保该端口对于客户和服务器是相同的.thisFORM.sock1.object.cl

9、ose()确信没有未决的连接, 并不再等待另一个连接.thisFORM.sock1.object.Connect(lc_local_IP,lc_local_Port)用 IP 地址和端口为参数运行方法来连接服务器.在这一点上, 我们可以看到一个循环. 它的主要功能是检查 Winsock 的状态和等待连接的确认.定义一个期限是重要的, 否则此处的循环将有可能使系统崩溃.另一个重要的东西是注意循环中的 inkey(0.1), 用于避免不必要的使用 CPU 资源.在连接成功后并确认后, 我们可以看到以下命令:thisFORM.sock1.object.SendData(trim(thisFORM.t

10、exto.value)运行该方法来传送数据. 在我们的特写场合, 是发送文本框 TEXTO 中的内容.在下一阶断, 我们再次看到一个与前面非常相似的循环. 它检查 ENVIADO_OK 变量的内容. 当数据完成后, Winsock 的 SendComplete 事件将自动运行, 且它将包含一个 .T. 到变量中 .现在我们可以看到另一个等待服务器 (SERVIDOR) 回应的循环.现在让我们回到 SERVIDOR 表单, 在 Winsock 的 DataArrival 事件中 . 该事件在每次从远程计算机上接收到数据时执行. 缓冲的字节数作为参数给出.LPARAMETERS bytestota

11、llc_buffer = space(bytestotal)现在我们用 Winsock 的缓冲大小定义一个变量作为缓存.this.object.GetData(lc_buffer)我们运行 GetData 方法, 给它一个要接收缓冲中的数据的变量名引用 (). 该方法也会清除 Winsock 的缓冲.thisFORM.retorno.value = lc_buffer在这一点上, 我们展示已被 GetData 方法填充了的变量的内容.this.object.SendData(lower(lc_buffer)作为一个对客户 (CLIENTE) 的回应我们以小写方式发送缓冲中的内容.回到 CLIE

12、NTE 表单 , 在 Winsock 的 DataArrival 方法中, 我们可以看到它获得了 Winsock 的缓冲中的内容并将它放入到文本框 RETORNO 中, 处理结束.继续捍代码, 我们用 thisFORM.sock1.object.close() 命令关闭连接, 触发服务器 (SERVIDOR) 的 CLOSE 事件:this.object.Close()当前连接已经关闭. 无论是在 SERVIDOR 表单还是在 CLIENTE 表单中, 在 CLOSE 事件中的该命令是非常重要的, 否则 Winsock 将耗尽机器的所有资源, 因为它会在有些地方进行循环.this.object

13、.Listen()现在我们运行方法, 这样它可以等待下一个连接.让我们到使用 Winsock 的示例 2:创建一个聊天我们通常希望在我们的程序内部进行聊天. 好吧, 该示例就是关于该功能的. 为了让它更简单些, 该资源以只在局域网中运行的方式创建, 因为它使用一个表来保存一些重要的信息. 因此它不能在 Internet 连接上工作.该功能以非常简单的方式运行. 表 USER_ONLINE.DBF 是关键. 在该表中有以下字段:字段 类型 大小 说明USUARIO 字符 15 保存登录的用户名IP_USER 字符 15 保存计算机的 IPPORT_USER 数值 5 保存由计算机生成的端口ON_

14、CHAT 逻辑 定义用户是否在进行聊天在运行 CHAT 表单集时, 出现的第一个表单是用户表单 (USUARIO). 在该表单上 , 我们选择或输入想与之聊天的用户. 在得到确认后, 生成的注册用 RLOCK 锁住, 因此, 没有其它终端可以再使用它. 然后, 让表单不可见并显示 ON_LINE 表单.在 ON_LINE 表单的 TIMER1 中计时器 5 秒钟触发一次, 运行 USERS 方法. 最后的运行遍历表试图锁定每一个注册. 在它不能锁住一个注册时, 就意味着该用户在线, 且必须放入列表框 LISTA 中.准备好了! 在程序的这一点上, 我们可以控制用户访问并知道谁在线谁不在线.双击

15、列表框中的用户名, 程序将试图打开一个聊天, 在检查了用户真的在线后 (试着锁注册) 或检查 ON_CHAT = .T. 变量看其是否正在与另一个用户聊天. 在聊天被设置后, 他会得到一个 IP 号并从表中选择用户端口并试着连接. 这就是 Winsock 什么时候参与进来的.一但连接成功, 将打开一个新的表单: CHAT 表单. ON_CHAT 变量被设置为 .T. 因此在终端可以与另一个有关的终端进行聊天.在这一点上, 我们的连接已经成功且 CHAT 窗口已经打开. 现在可以进行通信了.在打开的 CHAT 表单上, 我们用 CommandButton 命令按钮来发送写到编辑框 MSG 中的文

16、本. 该过程使用了 Send 方法.要关闭当前的对话, 要做的所有事情就是关闭 CHAT 窗口. 另一个机器上的窗口也会自动关闭. 在这一点上, ON_CHAT 变量已经包含了 .F. 值, 并且可以接收新的聊天请求.分析该示例中使用的各个方法是重要的, 因为所有便于理解 Winsock 动作的解释都在代码中.Internet所有 Internet 通信遵循一些预定的标准 (RFC) 如 HTTP, FTP, POP, SMTP, IRC, 等.在已有的定义中, 默认情况下, 每一个服务将有一个命令组, 各命令组在接收到该命令后将有一个 reply-code 发送自服务器. 这回复通信命令是否成功地接收了. 因此, 要使用任何采用 RFC 约定的应用程序, 我们必须预先知道它的命令和回复.我建议你访问 网站来熟悉所有标准. 你也可以用其它搜索引擎来搜索 RFC 标准.FTP 与 Win

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号