注册 登录
编程论坛 VB6论坛

这个系统带DOS命令怎么用VB表达出来?

事业男儿 发布于 2015-01-15 18:30, 1248 次点击
判断服务器某个端口是否开启  在XP系统命令符里用 这种方式表达  start /min telnet 58.215.117.59 30810,命令符窗口就会自动出来一个最小化的窗口,如果30810端口是开启的就不会自动关闭,如果这个端口是关闭的,过一会最小化的窗口就会关闭,每次手动输入很麻烦。有没有什么办法用VB编写一个程序,求代码,谢谢。
16 回复
#2
风吹过b2015-01-16 08:28
使用 winsock 去连接这个端口,
如果连接成功,说明端口打开。
连接被关闭,说明端口被关闭。
连接超时,说明端口属于隐形状态,有防火墙会造成这种情况。
#3
lianyicq2015-01-16 09:19
Shell "telnet 192.168.0.1 30810"
#4
事业男儿2015-01-16 12:04
1、2楼的版主你们好!还望给个详细的代码!我的意思是 如果端口开放就提示文字 如果没开放也提示文字,用VB最简单的方法去实现,谢谢!

[ 本帖最后由 事业男儿 于 2015-1-16 12:09 编辑 ]
#5
lianyicq2015-01-16 12:10
回复 4楼 事业男儿
?这个不就是代码吗?
新建一个按钮,按下按钮事件中增加一行代码

Shell "telnet 192.168.0.1 30810"
#6
事业男儿2015-01-16 18:43
回复 5楼 lianyicq
Private Sub Command1_Click()
Shell "telnet 58.215.117.59 30810"
End Sub

但是怎么样在界面增加一个 Text1 把结果显示在Text1里。 我有一个很笨的想法,就是判断命令符窗口的开启时间,我测试过没有开放的时候 20秒钟后命令符窗口就自动关闭,通过增加一个  Timer1来判断命令符窗口的开启时间,如果开启时间大于20秒就让Text1显示服务器窗口是开启的,反之就提示关闭,并反复自动测试,直到命令符窗口大于20秒后Timer1就停止。但是我觉得这种方法看起来很笨。还有没有其他的方法。
#7
xzlxzlxzl2015-01-16 20:39
用2楼风版主的方法吧,代码可控,用shell命令则必须检测进程窗口是否关闭来判断,更麻烦。
#8
sj4766067292015-01-17 23:21
写入文本保存后缀名为bat的文件,要测试直接打开,代码就是原来的telnet ip 端口例如   
    telnet 58.215.117.59 30810
    pause
    然后保存为bat文件再打开就会测试,然后按任意键结束
#9
lianyicq2015-01-19 09:45
回复 6楼 事业男儿
那就试试这个
程序代码:
Option Explicit
Dim ifConnect As Boolean
Dim refuse  As Boolean
Private Sub Form_Load()
Form1.Show
Winsock2.LocalPort = 5000
Winsock2.Listen
Winsock1.Protocol = sckTCPProtocol
Winsock1.LocalPort = 5001
Winsock1.Connect "127.0.0.1", 5000
Do
DoEvents
Loop Until refuse Or ifConnect
If refuse Then
Form1.Caption = "强行拒绝"
Winsock1.Close
Winsock2.Close
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
Winsock1.Close
Winsock2.Close
End Sub
Private Sub Winsock1_Connect()
ifConnect = True
Form1.Caption = "已连接"
End Sub
Private 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)
If Number = 10061 Then refuse = True
End Sub

#10
事业男儿2015-01-21 12:28
回复 9楼 lianyicq
不好意思,前几天上网不方便,今天才赶回来。这个代码加一个时间控件,怎么会报错呢?
#11
lianyicq2015-01-22 10:06
回复 10楼 事业男儿
看看是报什么样的错。
#12
事业男儿2015-01-22 11:50
回复 11楼 lianyicq
lianyicq  你好!  这个代码是窗体加载的,我想把它用时间控件Timer1,每隔10秒加载一下,但是用时间控件加载只有一次成功然后第二次加载就开始报错
只有本站会员才能查看附件,请 登录


还有就是 在断网下 测试怎么都会显示连接呢? 我主要是想检查对方服务器端口是否开放。
只有本站会员才能查看附件,请 登录


[ 本帖最后由 事业男儿 于 2015-1-22 11:57 编辑 ]
#13
lianyicq2015-01-22 12:16
回复 12楼 事业男儿
确定重新连接之前,winsock控件有没有关闭.
我的代码例子只是示例某些功能,要根据你的需要自己调整,更改.
比如说,你是测试服务器端口是不是开放,在用WINSOCK控件连接后,是不是该马上断开.
至于为什么断线了还显示连接,检查一下代码,估计是连接状态没有更新.
#14
事业男儿2015-01-22 12:25
跟新了的,在短线状态下测试都是连接。麻烦版主帮一下忙,我想在游戏 登录服务器开放的第一时间知道,迅速进入游戏。
#15
风吹过b2015-01-22 16:54
Option Explicit
Dim ifConnect As Boolean
'Dim refuse  As Boolean       没找到哪里需要使用这个变量了


Private Sub Form_Load()
'Form1.Show          '这行可以不要,按你的死循环检测,那就需要

'应该是测试用的,不需要使用
'Winsock2.LocalPort = 30810
'Winsock2.Listen
Winsock1.Protocol = sckTCPProtocol

'Winsock1.LocalPort = 30811          '如果是本地发起连接,不要设置本地端口,如果要设置,也建议设置为0 ,让系统自动选择
Winsock1.Connect "58.215.117.59 ", 30810

'检测状态使用定时器去检测,不要使用循环,这样会造成 CPU 占用率100%。
'Do
'DoEvents
'Loop Until refuse Or ifConnect
'If refuse Then
'Form1.Caption = "强行拒绝"
'Winsock1.Close
'Winsock2.Close
'End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
Winsock1.Close
Winsock2.Close
End Sub

Private Sub Timer1_Timer()
Static js As Long
 Const 检测时间 = 10             '每次自动连接间隔时间

If Not ifConnect Then               '如果前面没有连接成功,如果已连接成功,则不会再次去连接
    Exit Sub
End If

js = js + 1
If js > 检测时间 Then                   '到了时间
    js = 0                              '先设置计数器为0
   
'此段代码是用于确保连接成功但未触发 Winsock1_Connect 事件时的检测,一般情况用不到
If Winsock1.State = sckConnected Then
    ifConnect = True
    Form1.Caption = "已连接"
    Exit Sub
End If

    Winsock1.Close                  '不管状态,先关闭当前连接
    DoEvents                        '确保关闭操作完成
    Winsock1.Connect "58.215.117.59 ", 30810     '连接服务器
End If
End Sub

Private Sub Winsock1_Connect()
    ifConnect = True
    Form1.Caption = "已连接"
End Sub

Private 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)
'可以不用去处理错误信息
'    If Number = 10061 Then refuse = True
End Sub
#16
风吹过b2015-01-22 17:00
有些代码行我是照你的代码抄的。
    Winsock1.Connect "58.215.117.59 ", 30810     '连接服务器
像这句,也应该是定义常量,使用代码里使用常量。这种程序就便于移植和可读。

不愿去动了。
#17
事业男儿2015-01-22 21:33
谢谢风版主的帮助,同时也谢谢lianyicq
1