关于vb的winsock控件的状态问题

最近在做一个工具的时候,发现一个问题如果想让winsock.state=7的话,必须要等执行winsock.connect命令的事件结束才可以例如:subcommand1... 最近在做一个工具的时候,发现一个问题
如果想让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
问题就是这样,大家有没有碰到过?

请看明白再回答,还有,不要给发什么winsock的状态码对应状态之类的?
展开
 我来答
1_1_8881_1_888
推荐于2017-11-27 · TA获得超过855个赞
知道小有建树答主
回答量:391
采纳率:50%
帮助的人:362万
展开全部

看明白了,碰见过。

这是因为Winsock的Connect方法不是同步的,(我的猜测是)connect语句的执行和实质上的连接过程是在不同线程中完成搜启纳的。因此往往

winsock1.connect

虽然执行完毕但还没有真正连接上,winsock仍然停留在6状态,此时接下来的

winsock1.senddata "ttt"

就自然会失败。


给出两个解决方案。

第一种是把连接和发数据分开到两个按钮的事件里世没,这样就有足够的时间让winsock真正连接上。代码就不写了,很容易实现。


第二种,如果不愿意用两个按钮,一定要连接好之后立刻发数据的话,可以在一个回圈里轮询winsock1的状态,直到变成7,注意回圈里最好有sleep和DoEvents来释放cpu,否则有造成假死的风险。以下是代码

'首先要声明Sleep的Win32 API
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


sub command1_click()
winsock1.remoteip=xxx.xxx.xxx.xxx
winsock1.remoteport=xxxxx
winsock1.connect
do until winsock1.state=7
    sleep 1
    DoEvents
    '避免假死
loop
winsock1.senddata "ttt"
end sub

不懂请追问满意请采纳


参考资料旁运http://bbs.csdn.net/topics/320261964

追问
对不起,我都打算放弃了,就没有来看;我试过循环等待,30秒以上仍然是6,然后我就中断了等待,工具是在局域网内部使用,30秒都无法连上,这已经不可能了。
虽然没能解决问题,还是感谢你的回复!
azsxxdcffv
2018-06-08 · 超过54用户采纳过TA的回答
知道小有建树答主
回答量:114
采纳率:0%
帮助的人:104万
展开全部

偶然看到了这个问题,桥世添加两个方案

  1. timer里面执行链接操作和发送数据

    全局变量tm1i=0

tm1i=tm1i+1

select case tm1i

case 1    

connect

case2

if state=7 then senddata

doevents

timer.enable=false

end select

2.服务器在连接成功后发送一条信息,在你敏悔肢的程序员dataarrive里面收到这条信息前宏后发送数据        

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式