小弟刚开始学VB,写了个探测局域网445端口的工具
代码如下:
Private Sub Command1_Click()
Dim y As String
Dim x As String
Dim z1 As String
Dim z2 As String
Dim z3 As String
Dim z4 As String
Dim z As Integer
Dim z0 As Integer
y = Winsock1.LocalIP
x = "."
z = InStrRev(y, x)
z1 = Left(y, z)
z2 = Mid(y, z + 1)
z0 = Val(z2)
Command1.Enabled = False
Dim i As Integer
For i = 1 To 254
If i <> z0 Then
z3 = CStr(i)
z4 = z1 & z3
Text2.Text = z4
Winsock1.Close
DoEvents
Winsock1.RemoteHost = z4
Winsock1.RemotePort = 445
DoEvents
Winsock1.Connect
DoEvents
Pause (10)
If Winsock1.State = 7 Then
Exit For
End If
End If
Next i
Command1.Enabled = True
End SubPrivate Sub Form_Load()
Text1.Text = Winsock1.LocalIP
End Sub
Private Sub Pause(ByVal sSec As Long)
          Dim StartSec     As Long
          StartSec = GetTickCount()
          While (GetTickCount() - StartSec) < sSec
              DoEvents
          Wend
  End SubPrivate Sub Form_Unload(Cancel As Integer)
End
End SubPrivate Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
Winsock1.Close
End Sub
当在command1_click里将for语句范围改小,比如,已知目标机器192.168.1.100的445开放,
我将for设置为99 to 102的时候,运行的时候基本没有问题。
但是当我将for重新改为1 to 254的时候,却扫不出任何开放的机器。
在程序扫描的过程中,
发现text2.text里显示的当前扫描的ip跟使用cmd里的netstat里的当前连接根本就不一样。比如,当我的text2.text里显示的是192.168.1.80的时候,我查看系统里显示的是:
  TCP    192.168.1.144:3146     192.168.1.11:445       SYN_SENT        848
  TCP    192.168.1.144:3147     192.168.1.12:445       SYN_SENT        848
  TCP    192.168.1.144:3148     192.168.1.13:445       SYN_SENT        848
  TCP    192.168.1.144:3149     192.168.1.14:445       SYN_SENT        848
  TCP    192.168.1.144:3150     192.168.1.15:445       SYN_SENT        848
  TCP    192.168.1.144:3151     192.168.1.16:445       SYN_SENT        848
  TCP    192.168.1.144:3152     192.168.1.17:445       SYN_SENT        848
  TCP    192.168.1.144:3153     192.168.1.18:445       SYN_SENT        848
  TCP    192.168.1.144:3154     192.168.1.19:445       SYN_SENT        848
  TCP    192.168.1.144:3155     192.168.1.20:445       SYN_SENT        848
不停的使用netstat查看的时候,会发现
目的ip在缓慢的增加,而且基本上10个地址段的变化
当我的程序已经把1 to 254 扫完了,
在系统中显示的才连接到了192.168.1.30左右。
我的环境是 xpsp2  +  vb6sp6这个问题很奇怪啊。我在for里面已经把winsock关闭了,winsock关闭之后难道系统怎么还在发以前的SYN_SENT
另外还有个更加奇怪的是
当我第一次使用小范围扫描到目的主机之后,然后再使用小范围扫描时,
同样无法扫到目标主机
而且在xp系统里显示的更加奇怪(目标主机ip为100,for i=95 to 105)
  TCP    192.168.1.144:3428     192.168.1.95:445       SYN_SENT        848
  TCP    192.168.1.144:3429     192.168.1.96:445       SYN_SENT        848
  TCP    192.168.1.144:3430     192.168.1.97:445       SYN_SENT        848
  TCP    192.168.1.144:3431     192.168.1.98:445       SYN_SENT        848
  TCP    192.168.1.144:3432     192.168.1.99:445       SYN_SENT        848
  TCP    192.168.1.144:3434     192.168.1.101:445      SYN_SENT        848
  TCP    192.168.1.144:3435     192.168.1.102:445      SYN_SENT        848
会发现本地机器不连接100这个ip了,而且在本地端口居然跳过了3433这个端口进行连接,3433这个端口肯定是可用的。
这个问题到底是出在我这边的系统还是出在445服务器拒绝了连接?高手请教了,实在是想不明白了,不知道到底是我的代码有问题,还是是xpsp2的问题。

解决方案 »

  1.   

    我刚才试运行了你的程序,基本没有什么问题!
    Private Sub Command1_Click()
    .....
    Command1.Enabled = True
    Winsock1.Close '加这一句End Sub
    还有你的网络速度可能不怎么快,你试试把Pause的时间增长一点儿
      

  2.   

    to zzyong00(阿勇) 
    Command1.Enabled = True
    Winsock1.Close '加这一句我觉得没必要,因为,在winsock进行连接之前,我都close了的。
    再者,pause我也改过了,最大我改到了1000,也就是1秒,但是问题依旧。刚刚我找了个2K的机器,
    居然在2K上面没有问题,(pause改到了10,然后可以反复不停的扫描,也没有问题)
    但是在xp下问题依旧。。大虾们,在XP下怎么会这样??
    谁能给我个解释,或者给个在xp下的解决方案?