supertankhzt 发表于 2011-11-19 08:53:17

winsock关闭连接后能不能马上释放端口?


winsock调用close方法后,那个本地端口就一直在那占着,等了半天还在,再用这个端口就会出错“地址正在使用”,有没有办法在关闭连接后立即释放端口?

supertankhzt 发表于 2011-11-20 13:15:47

没人理我???

马大哈 发表于 2011-11-23 14:32:44

我测试了一下,代码如下:Private Sub Command1_Click()
    Winsock1.Listen
End Sub

Private Sub Command2_Click()
    Winsock1.Close
End Sub反复交替点击两个按钮,没有出现错误.

使用工具查看,端口也在CLOSE调用后关闭,并没有出现你所说的问题.

注意一下你的VB6是否打了SP6补丁,以及代码中是否有别的机制导致了端口不能使用.

另外,建议你也用上面这个代码在新工程中测试一下,控件只有两个按钮和一个WINSOCK控件,TCP协议,本地端口设置为8000.

马大哈 发表于 2011-11-23 14:33:23

最近在忙结婚的事,比较少上,HOHO.

supertankhzt 发表于 2011-11-23 16:30:01

马大哈 发表于 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
同一个本地端口在短时间内没法多次使用吗

马大哈 发表于 2011-11-24 00:38:37

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加个按钮加个定时器.

不能直接在事件处理过程里马上重连.

要退出这个事件过程后,才可以再连,我上面这个代码是使用定时器,经测试可以连续工作三次,然后估计被百度服务器限制了.

supertankhzt 发表于 2011-12-4 09:51:21

马大哈 发表于 2011-11-24 00:38 static/image/common/back.gif
加个按钮加个定时器.

不能直接在事件处理过程里马上重连.


问题貌似解决了API——SetTcpEntry函数
我是要做刷票程序,讲究速度不能延时执行,当然延时几秒也是没用的,我已经找到原因了,主动关闭TCP连接的一方,所用端口会进入TIME_WAIT状态,系统默认等待五分钟才释放端口。
这样的话把所有端口用光在五分钟内最多只能建立6万多个连接。
虽然实际达不到这么高,但是处于TIME_WAIT状态端口过多的话电脑就卡了,必须手动释放端口不能等系统自动释放。

马大哈 发表于 2011-12-7 21:17:46

汗,原来是刷票程序.{:soso_e140:}
页: [1]
查看完整版本: winsock关闭连接后能不能马上释放端口?