winsock关闭连接后能不能马上释放端口?
winsock调用close方法后,那个本地端口就一直在那占着,等了半天还在,再用这个端口就会出错“地址正在使用”,有没有办法在关闭连接后立即释放端口? 没人理我??? 我测试了一下,代码如下:Private Sub Command1_Click()
Winsock1.Listen
End Sub
Private Sub Command2_Click()
Winsock1.Close
End Sub反复交替点击两个按钮,没有出现错误.
使用工具查看,端口也在CLOSE调用后关闭,并没有出现你所说的问题.
注意一下你的VB6是否打了SP6补丁,以及代码中是否有别的机制导致了端口不能使用.
另外,建议你也用上面这个代码在新工程中测试一下,控件只有两个按钮和一个WINSOCK控件,TCP协议,本地端口设置为8000. 最近在忙结婚的事,比较少上,HOHO. 马大哈 发表于 2011-11-23 14:32 static/image/common/back.gif
我测试了一下,代码如下:反复交替点击两个按钮,没有出现错误.
使用工具查看,端口也在CLOSE调用后关闭,并没 ...
只是监听当然不会,我说的是指定本地端口再去连接另外一台计算机,然后发送数据,发完后关闭连接,可是关闭后端口还在占用着,要等五至十分钟才会自动释放。这段时间我就不能再使用这个本地端口了。
比如
Private Sub Form_Load()
Winsock1.LocalPort = 3000
Winsock1.Connect myhost, myport
End Sub
Private Sub Winsock1_Connect()
Winsock1.SendData mydata
End Sub
Private Sub Winsock1_SendComplete()
Winsock1.Close '调用close方法后端口(3000)不会马上释放
Winsock1.Connect myhost, myport '再次使用此端口进行连接会报错"10048地址在使用中"我close了为什么它还在使用?
End Sub
同一个本地端口在短时间内没法多次使用吗 Option Explicit
Private Const strCmd As String = "GET HTTP/1.1" & vbCrLf & _
"Connection: close" & vbCrLf & _
"Host: " & vbCrLf & _
"Accept: */*" & vbCrLf & _
"Pragma: no-cache" & vbCrLf & _
"Cache-Control: no-cache" & vbCrLf & _
"Referer: " & vbCrLf & _
"User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)" & vbCrLf & _
vbCrLf '最后一行没有命令,仅有一个换行符,表明整个命令字符串的结束.
Dim SendStr As String
Private Sub Command1_Click()
Winsock1.Close
Winsock1.LocalPort = 3000
Winsock1.Connect "www.baidu.com", 80
End Sub
Private Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 1000
SendStr = strCmd
SendStr = Replace(SendStr, "", "http://www.baidu.com", , , vbTextCompare) '替换URL
SendStr = Replace(SendStr, "", "www.baidu.com", , , vbTextCompare) '替换HOST
SendStr = Replace(SendStr, "", "www.baidu.com", , , vbTextCompare) '替换RefURL
End Sub
Private Sub Winsock1_Connect()
Winsock1.SendData SendStr
Debug.Print "SendData"
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim I As String
Call Winsock1.GetData(I)
Debug.Print I
End Sub
Private Sub Winsock1_SendComplete()
Timer1.Enabled = True '在事件处理过程之外再关闭
Debug.Print "SendComplete"
End Sub
Private Sub Timer1_Timer()
Timer1.Enabled = False
Call Command1_Click '由定时器来执行关闭与再执行的任务
End Sub加个按钮加个定时器.
不能直接在事件处理过程里马上重连.
要退出这个事件过程后,才可以再连,我上面这个代码是使用定时器,经测试可以连续工作三次,然后估计被百度服务器限制了. 马大哈 发表于 2011-11-24 00:38 static/image/common/back.gif
加个按钮加个定时器.
不能直接在事件处理过程里马上重连.
问题貌似解决了API——SetTcpEntry函数
我是要做刷票程序,讲究速度不能延时执行,当然延时几秒也是没用的,我已经找到原因了,主动关闭TCP连接的一方,所用端口会进入TIME_WAIT状态,系统默认等待五分钟才释放端口。
这样的话把所有端口用光在五分钟内最多只能建立6万多个连接。
虽然实际达不到这么高,但是处于TIME_WAIT状态端口过多的话电脑就卡了,必须手动释放端口不能等系统自动释放。 汗,原来是刷票程序.{:soso_e140:}
页:
[1]