找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 14530|回复: 7

[求助] winsock关闭连接后能不能马上释放端口?

  [复制链接]

4

主题

37

回帖

0

精华

铜牌会员

积分
296
QQ
发表于 2011-11-19 08:53:17 | 显示全部楼层 |阅读模式
QQ截图20111119073724.jpg
winsock调用close方法后,那个本地端口就一直在那占着,等了半天还在,再用这个端口就会出错“地址正在使用”,有没有办法在关闭连接后立即释放端口?

4

主题

37

回帖

0

精华

铜牌会员

积分
296
QQ
 楼主| 发表于 2011-11-20 13:15:47 | 显示全部楼层
没人理我???

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2011-11-23 14:32:44 | 显示全部楼层
我测试了一下,代码如下:
  1. Private Sub Command1_Click()
  2.     Winsock1.Listen
  3. End Sub

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

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

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

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

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2011-11-23 14:33:23 | 显示全部楼层
最近在忙结婚的事,比较少上,HOHO.
我就是嗷嗷叫的老马了......

4

主题

37

回帖

0

精华

铜牌会员

积分
296
QQ
 楼主| 发表于 2011-11-23 16:30:01 | 显示全部楼层
马大哈 发表于 2011-11-23 14:32
我测试了一下,代码如下:反复交替点击两个按钮,没有出现错误.

使用工具查看,端口也在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
同一个本地端口在短时间内没法多次使用吗

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2011-11-24 00:38:37 | 显示全部楼层
  1. Option Explicit

  2. Private Const strCmd As String = "GET [THEURL] HTTP/1.1" & vbCrLf & _
  3.                                  "Connection: close" & vbCrLf & _
  4.                                  "Host: [THEHOST]" & vbCrLf & _
  5.                                  "Accept: */*" & vbCrLf & _
  6.                                  "Pragma: no-cache" & vbCrLf & _
  7.                                  "Cache-Control: no-cache" & vbCrLf & _
  8.                                  "Referer: [THEREFURL]" & vbCrLf & _
  9.                                  "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)" & vbCrLf & _
  10.                                  vbCrLf     '最后一行没有命令,仅有一个换行符,表明整个命令字符串的结束.

  11. Dim SendStr As String

  12. Private Sub Command1_Click()
  13.     Winsock1.Close
  14.     Winsock1.LocalPort = 3000
  15.     Winsock1.Connect "www.baidu.com", 80
  16. End Sub

  17. Private Sub Form_Load()
  18.     Timer1.Enabled = False
  19.     Timer1.Interval = 1000
  20.    
  21.     SendStr = strCmd
  22.     SendStr = Replace(SendStr, "[theurl]", "http://www.baidu.com", , , vbTextCompare)     '替换URL
  23.     SendStr = Replace(SendStr, "[thehost]", "www.baidu.com", , , vbTextCompare)     '替换HOST
  24.     SendStr = Replace(SendStr, "[therefurl]", "www.baidu.com", , , vbTextCompare)     '替换RefURL
  25. End Sub

  26. Private Sub Winsock1_Connect()
  27.     Winsock1.SendData SendStr
  28.     Debug.Print "SendData"
  29. End Sub

  30. Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  31.     Dim I As String
  32.    
  33.     Call Winsock1.GetData(I)
  34.     Debug.Print I
  35. End Sub

  36. Private Sub Winsock1_SendComplete()
  37.     Timer1.Enabled = True               '在事件处理过程之外再关闭
  38.     Debug.Print "SendComplete"
  39. End Sub

  40. Private Sub Timer1_Timer()
  41.     Timer1.Enabled = False
  42.     Call Command1_Click         '由定时器来执行关闭与再执行的任务
  43. End Sub
复制代码
加个按钮加个定时器.

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

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

4

主题

37

回帖

0

精华

铜牌会员

积分
296
QQ
 楼主| 发表于 2011-12-4 09:51:21 | 显示全部楼层
马大哈 发表于 2011-11-24 00:38
加个按钮加个定时器.

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

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

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2011-12-7 21:17:46 | 显示全部楼层
汗,原来是刷票程序.{:soso_e140:}
我就是嗷嗷叫的老马了......

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表