为什么winsock控件不能重复连接
这是接收端代码:Private Sub ExBtn1_Click()
Winsock1.Close
End Sub
Private Sub Timer1_Timer()
If Winsock1.State = 0 Then
Winsock1.LocalPort = 1995
Winsock1.Listen
Text1.Text = "正在监听端口1995"
ElseIf Winsock1.State = sckConnected Then
End If
End Sub
Private Sub Winsock1_Close()
Text1.Text = "有主机下线请注意"
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State <> sckclose Then
Text1.Text = "有主机上线请注意"
Winsock1.Close
Winsock1.Accept requestID
End If
End Sub
这是发送端代码
Private Sub Form_Load()
Winsock1.Close
Winsock1.RemotePort = 0
Winsock1.Connect , 1995
End Sub
问题是这样我,我想设计一个程序,如果发送端打开后和接收端连接并提示上线
第一次是很简单就能成功连接,提示上线,但是断开发送端后接收端不动,然后重新打开接收端
发现并不能成功连接,也就是接收端不能提示上线
所以我这样猜想的,我加入一个time控件在接收端,每两秒钟判断如果当前状态为断开,那么再次设置端口,监听端口,所以第一次是打开能提示“当前监听端口为1995”
但是事实是发送端断开后,接收端提示断线就time控件也没用,也不会提示“当前监听端口为1995”
所以我又做了猜想二,因为我在关闭事件后设置了
Text1.Text = "有主机下线请注意"
这个代码,所以我直接用按钮控件关闭winsock
但是最后却不能提示Text1.Text = "有主机下线请注意"
请问,到底要怎么解决
到底要怎么重复上线 --------------------编程问答-------------------- 发送端不正常关闭winsock(winsock.close),接收端就不一定能收到winsock1_close事件。
即使发送端正常关闭winsock,接收端也不一定能收到winsock1_close事件,GPRS网络经常有这样的发生。
你的程序有几个问题:
一、如果触发了winsock1_close事件,应该在这个事件里马上重新监听
Private Sub Winsock1_Close()
winsock1.close
Winsock1.LocalPort = 1995
Winsock1.Listen
Text1.Text = "有主机下线请注意"
End Sub
二、假定没有触发winsock1_close事件,timer事件中应该判断的本地winsock是否在监听或已经连接,
不是关闭winsock并重新监听。
Private Sub Timer1_Timer()
If Winsock1.State <> 7 or Winsock1.State <> 2 Then
winsock1.close
Winsock1.LocalPort = 1995
Winsock1.Listen
Text1.Text = "正在监听端口1995"
End If
End Sub
另外timer事件不可太快,非局域网应大于5秒(自已测试一个合理的值)。
--------------------编程问答-------------------- 你好,我想在问一下,我现在按照你的方法再做
就是在关闭事件中立刻监听,但是发现这样程序会发生错误,所以我就在关闭事件中再关闭一次也就是执行
winsock1.close
发现就能正常使用了,能重复上线了,这是为什么,还有请问问什么会要关闭了winsock才能连接,谢谢 --------------------编程问答-------------------- winsock的当前状态有很多种,大概至少有9种吧,不同的state表明winsock正在做不同的事情,不关闭,它的当前任务就不能正常结束,不关闭状态下重新监听当然会出错。
简单的说winsock.close等于重新初始化winsock到初始状态,也就是winsock现在什么事情都不做了,等待你让它去做事,然后你再让它去监听就正确了。
--------------------编程问答--------------------
这里纠正你一个概念,本地(接收端)的winsock1_close事件,是由远程(发送端)winsock.close触发的,它与本地winsock.close无关,也就是本地有winsock1_close事件触发并不是说本地的winsock已经关闭了,所以必须在winsock1_close事件里执行winsock1.close先关闭本地winsock,再重新监听,原因见楼上的说明。
--------------------编程问答-------------------- --------------------编程问答-------------------- 还有我最后一个问题
就是如何让他自动连接
就是这样的,我上面的代码,是要先打开接收端,接收端监听了才可以打开发送端
但是现实中不能这样的,要怎么样,先打开发送端,然后打开接收端,都能正常连接 --------------------编程问答-------------------- 发送端用timer控件延时判断winsock.state<>7 ,关闭后,重新申请连接。
--------------------编程问答-------------------- 给你个参考:
尝试做了一个利用WINSOCK控件的自动分包发送机制的东东(VB6.0)
补充:VB , 网络编程