首页 理论教育 计算机通信编程利用Winsock控件技巧

计算机通信编程利用Winsock控件技巧

时间:2023-06-16 理论教育 版权反馈
【摘要】:利用WinSock控件可以与通信对方建立连接,并通过传输控制协议进行数据交换。设置为sckTCPPro-tocol表示TCP协议sckUDPProtocol表示UDP协议。当使用UDP套接字,在DataArrival事件发生后,此属性为发送UDP数据的机器IP地址串。这个方法用于在引入一个连接时响应的事件,即ConnectionRequest事件。当调用Listen之后,引入一个连接时发生Connec-tionRequest事件。用此事件表明连接成功。总计收到的数据量。

计算机通信编程利用Winsock控件技巧

利用WinSock控件可以与通信对方建立连接,并通过传输控制协议(TCP)进行数据交换。

1.Winsock控件属性、方法及事件

(1)主要属性

主要属性有:

BytesReceived:返回当前缓冲区中接收到的字节数量。

LocalHostName:返回本机名字符串。

LocalIP:返回以(xxx.xxx.xxx.xxx)格式表达的IP地址串。

LocalPort:本机使用的地址,可读写,设计时可用,Long型。对于客户,如果不需要指定端口,则用端口0发送数据。在此情况下,控件将随机选择一个端口。在一个连接确定后,成为TCP的端口。对于服务器,指用于监听的端口。如设置为0,则用随机数。在调用Listen方法后,该属性自动包含用到的端口。端口0总是用于在两计算机间建立动态连接。客户希望通过端口0获得一个随机端口以“回调”连接服务器。

Protocol:套接字类型,为TCP或UDP二者之一,默认为TCP类型。设置为sckTCPPro-tocol表示TCP协议sckUDPProtocol表示UDP协议。在此属性被重置之前需用Close方法关闭之。

RemoteHost:发送或接收数据的主机,可提供主机名如:“FTP://ftp.microsoft.com”;或一IP地址串,例如“100.0.1.1”。

RemoteHostIP:远程主机的IP地址。对于客户程序,在连接确定后使用Connect方法,此属性包含远程主机的IP名串。对于服务器程序,在引入连接需求后(ConnectionRequest事件),此属性包含IP串。当使用UDP套接字,在DataArrival事件发生后,此属性为发送UDP数据的机器IP地址串。

RemotePort:连接套接字端口值。例如通常HTTP应用使用80端口,FTP则使用21,LM机的端口为502。

State:控件状态,只读。可为以下值:0(sckClosed),默认值,关闭;1(sckOpen),打开;2(sckListening),侦听;3(sckConnectionPending),连接挂起;4(sckResolvingHost),识别主机;5(sckHostResolved),已识别主机;6(sckConnecting),正在连接;7(sckConnected),已连接;8(sckClosing),同级人员正在关闭连接;9(sckError),错误

(2)主要方法

主要方法有:

Accept:仅用于TCP服务器应用。这个方法用于在引入一个连接时响应的事件,即ConnectionRequest事件。语法:object.AcceptrequestID返回值:Void。响应事件时必须传递RequestID参数给此方法,以生成新的Socket实例用于实际的信息传输。

Bind:设定LocalPort及LocalIP用于TCP连接。当有多个协议适配器时使用。语法:object.BindLocalPort,LocalIP。LocalPort此端口用于连接,LocalIP生成连接的IP地址。如果已设定相关属性,可不必携带相关参数。在调用Lisent方法之前调用此方法。

Close:在客户或服务器方关闭TCP连接。语法:object.Close。参数:无。返回值:Void。

GetData:接收存于可变类型中的数据块。返回值:Void。语法:object.GetDatadata,[type,][maxLen]。Data:接收数据的变量,如果空间不够,将设置为空。Type:可选,接收的类型,自行设置。MaxLen:可选参数。设定接收数组或字符串类型数据的尺寸。如果参数没有,将接收所有的数据。如果提供数组或字符串以外的数据类型,则忽略此参数。Type可以设置为常用的数据类型。通常在DataArrival事件中使用该方法。此事件包含total-Bytes参数。如果设定的maxlen小于totalBytes参数,将得到一个由10040表示的剩余字节将丢失的警告信息。

Listen:建立一个设置为监听模式的套接字。此方法仅用于TCP连接。语法:object.Listen参数:无。返回值:Void。当调用Listen之后,引入一个连接时发生Connec-tionRequest事件。当处理ConnectionRequest时,应用程序必须使用Accpet方法来响应。

PeekData:同GetData类似,但是PeekData不从输入队列中移去数据。此方法仅用于TCP连接。语法:object.PeekDatadata,[type,][maxLen]。

SendData:向远地主机发送主机。返回值:Void。语法:object.SendDatadata。Data:发送的数据为二进制数,使用字节数组。当使用UNICODE格式串时将在发送之前转换为ANSI串。

Connect:客户机端可以用此方法请求与服务器连接。连接前应指定远程服务器IP地址及端口号。但也可以调用此方法是指定。

(3)主要发生的事件

主要发生的事件有:

Close:发生于远程主机关闭连接。为了正确地关闭TCP连接应当使用Close方法。

Connect:当连接行动完成时,语法:object.Connect()。用此事件表明连接成功。(www.xing528.com)

ConnectionRequest:发生于一个远端主机要求确定一个连接时。仅用于TCP服务器应用。RemoteHostIP及RemotePort属性在此事件后存储了关于客户机的信息。语法:object_ConnectionRequest(requestIDAsLong)。requestID:引入的连接的请求标识。此参数传给Accept方法中的第二个控件实例。服务器可以决定是否认可该连接。如果引入的连接未被认可,客户将受到一个Close事件。使用Accept方法接受引入的连接。

DataArrival:当新数据抵达时发生。语法:object_DataArrival(bytesTotalAsLong)。BytesTotal,Long型。总计收到的数据量。此事件在调用GetData方法之前将不会再发生。仅在有新数据抵达时激活。可以在任何时刻使用BytesReceived属性检查多少数据有效。

Error:表明发生了错误。限于篇幅,错误码忽略。

SendComplete:当发送动作完成时发生。语法:object_SendComplete。参数:无。

SendProgress:当发送数据时产生本事件。语法:object_SendProgress(bytesSentAsLong,bytesRemainingAsLong)。BytesSent:本事件发生以来发送的数据量。BytesRemaining:缓冲区中等待发送的数据。

2.计算机与和利时LM机以太网Modbus TCP协议通信VB编程实例

计算机与PLC通信,计算机为客户机,而PLC为服务器。PLC程序由调用以太网功能块时,自动生成,用户不必编程。计算机程序必须用户编写。

图5-135所示为这个计算机程序表单。其上有发送报文文本框及接收报文文本框。有建立连接、发送命令及接收数据按钮

978-7-111-56641-0-Chapter06-224.jpg

图5-135 计算机与以太网PLCTCPIP协议通信程序表单

作为客户机,计算机程序要点是:

在使用这些控件之前,要先把winsock控件,从控件库中调入到本工程VB的工具箱中。Protocol(套接字类型)属性设为TCP,使用TCP协议。

用connect方法请求连接。其参数是指定PLC的ip地址(PLC配置时指定)及使用的通信口(LM机协议规定为502);

生成命令,并用sendData方法发送命令;

用getData方法接收并显示数据。

具体程序为:

(1)建立连接程序

978-7-111-56641-0-Chapter06-225.jpg

(2)生成并发送命令程序

978-7-111-56641-0-Chapter06-226.jpg

(3)接收并显示数据程序

978-7-111-56641-0-Chapter06-227.jpg

978-7-111-56641-0-Chapter06-228.jpg

该程序可用以读取Q区位或字,写I区的位或字。

从图5-135可知,它向PLC发送读取PLC%QW4字的命令,目的是读取%QW4字的值,并予以显示。从图5-135可知,此命令已得到执行,并得到相应的回应。接收报文的最后FF(65535),即为此值。该程序还可以改变命令码,用以读取Q区其它位或字,也可用以写I区的位或字。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈