关于winsock的状态

adwnjt 2014-10-19 03:55:35
最近在做一个工具的时候,发现一个问题
如果想让winsock.state=7的话,必须要等执行winsock.connect命令的事件结束才可以
例如:
sub command1_click()
winsock1.remoteip=xxx.xxx.xxx.xxx
winsock1.remoteport=xxxxx
winsock1.connect
end sub

点击command1之后的话,winsock1.state是为7的
如果添加一条发送命令的话,"ttt"这个字符串是无法发送成功的,因为这时候的winsock1.stat为6
代码如下
sub command1_click()
winsock1.remoteip=xxx.xxx.xxx.xxx
winsock1.remoteport=xxxxx
winsock1.connect
'新添加命令
winsock1.senddata "ttt"
end sub

如果把winsock1.connect命令写进function或者sub的再由别的事件调用的话,那就要等调用该function或者sub的事件结束winsock1.stat才为7
问题就是这样,大家有没有碰到过?
或者是我的用法不对吗?
...全文
1040 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
864记忆 2017-02-25
  • 打赏
  • 举报
回复
最近在做一个利用winsock控件接收数据的小程序,总是存在丢包现象(就是数据不全),全部定位信息是84位,有时接收到78,有时80,有时82,很少时候84位,这种现象不知道到底什么原因,开始标志和结束标志都能收到,就是数据包中间的经纬度有时不全,请高手们帮忙啊!
笨狗先飞 2014-12-10
  • 打赏
  • 举报
回复
引用 5 楼 startbin 的回复:
如果加了doevents呢
用doevents可以,不过到时候程序退出可能会有影响
Tiger_Zhao 2014-12-10
  • 打赏
  • 举报
回复
通讯是异步的,要分步执行。
Option Explicit

Private Sub Command1_Click() '连接'
Winsock1.remoteip = xxx.xxx.xxx.xxx
Winsock1.RemotePort = xxxxx
Winsock1.Connect
End Sub

Private Sub Command2_Click() '发送'
If Winsock1.State = sckConnected Then
Winsock1.SendData "ttt"
Else
MsgBox "状态 " & Winsock1.State & vbCrLf & "不能发送。", vbExclamation
End If
End Sub

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
MsgBox "错误代码 " & Number & vbCrLf & Description, vbExclamation
End Sub
startbin 2014-12-10
  • 打赏
  • 举报
回复
如果加了doevents呢
adwnjt 2014-12-07
  • 打赏
  • 举报
回复
引用 2 楼 spt_petrolor 的回复:
状态不是7,就是没有连接好。 网络嘛,怎么不会有个延迟什么的。你连了,并不是说马上就连好了,就可以发了。 connect之后,地层的程序才在干活,你马上就发生,当然出错。 每次发送之前判断状态是不是7,这样可以了吧。
你完全没明白我的意思,我上面的例子,就算是延迟1天,它的状态也还是6,不会变到7,根本不是延迟的原因;请仔细看一下。
qxw_csdn 2014-11-04
  • 打赏
  • 举报
回复
谢谢,也来学习。
王二.麻子 2014-11-02
  • 打赏
  • 举报
回复
状态不是7,就是没有连接好。 网络嘛,怎么不会有个延迟什么的。你连了,并不是说马上就连好了,就可以发了。 connect之后,地层的程序才在干活,你马上就发生,当然出错。 每次发送之前判断状态是不是7,这样可以了吧。
赵4老师 2014-10-20
  • 打赏
  • 举报
回复
State 属性(Winsock 控件) 返回控件的状态,用枚举类型来表示。在设计时是只读的,而且是不可用的。 语法 object.State object 所在处代表一个对象表达式,其值是“应用于”列表中的对象。 数据类型 Integer 设置值 State 属性的设置值是: 常数 值 描述 sckClosed 0 缺省的。关闭 sckOpen 1 打开 sckListening 2 侦听 sckConnectionPending 3 连接挂起 sckResolvingHost 4 识别主机 sckHostResolved 5 已识别主机 sckConnecting 6 正在连接 sckConnected 7 已连接 sckClosing 8 同级人员正在关闭连接 sckError 9 错误
一、WinSock简介 Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,Socket成为当前最流行的网络通信应用程序接口之一。20世纪90年代初,由Sun Microsystems,JSB,FTP software,Microdyne和Microsoft等几家公司共同定制了一套标准,即Windows Socket规范,简称WinSock。 VB编写网络程序主要有两种方式:1.winsock控件 2.winsockAPI 二、WinSock控件的使用 1.WinSock控件的主要属性 LocalHostName属性 本地机器名 LocalIP属性 本地机器IP地址 LocalPort属性 本地机器通信程序的端口(0<端口<65536) RemoteHost属性 远程机器名 RemotePort属性 远程机器的通信程序端口 Protocol属性 通过Protocol属性可以设置WinSock控件连接远程计算机使用的协议。可选的协议是TCP和UDP对应的VB的常量分别是sckTCPProtocol和sckUDPProtocol,Winsock控件默认协议是TCP。注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后。 SocketHandle属性 返回当前socket连接的句柄,这是只读属性。 RemoteHostIP属性 属性返回远程计算机的IP地址。在客户端,当使用了控件的Connect方法后,远程计算机的IP地址就赋给了RemoteHostIP属性,而在服务器端,当ConnectRequest事件后,远程计算机(客户端)的IP地址就赋给了这个属性。如果使用的是UDP协议那么当DataArrival事件后,发送UDP报文的计算机的IP才赋给了这个属性。 ByteReceived属性 返回当前接收缓冲区中的字节数 State属性 返回WinSock控件当前的状态 常数 值 描述 sckClosed 0 缺省值,关闭。 SckOpen 1 打开。 SckListening 2 侦听 sckConnectionPending 3 连接挂起 sckResolvingHost 4 识别主机。 sckHostResolved 5 已识别主机 sckConnecting 6 正在连接。 sckConnected 7 已连接。 sckClosing 8 同级人员正在关闭连接。 sckError 9   错误 2.WinSock主要方法 Listen方法 方法用于服务器程序,等待客户访问。格式:Winsock对象.listen Connect方法 用于向远程主机发出连接请求。格式:Winsock对象.connect [远程主机IP,远程端口] Accept方法 用于接受一个连接请求。格式:Winsock对象.accept Request ID Senddata方法 用于发送数据。格式:Winsock对象.senddata 数据 Getdata方法 用来取得接收到的数据。格式:Winsock对象.getdata 变量 [,数据类型 [,最大长度]] Close方法 关闭当前连接。格式:Winsock对象.close Bind方法 用Bind方法可以把一个端口号固定为本控件使用,使得别的应用程序不能再使用这个端口。 Listen方法Listen方法只在使用TCP协议时有用。它将应用程序置于监听检测状态。 Connect方法 当本地计算机希望和远程计算机建立连接时,就可以调用Connect方法。Connect方法调用的规范为:Connect RemoteHost,RemotePort Accept方法 当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。 SendData方法当连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数,就是要发送的数据。 GetData方法 当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用GetData方法。GetData方法调用规范如下:GetData

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧