| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 991 人关注过本帖
标题:如何获取一个程序的通讯IP
只看楼主 加入收藏
lzb3158
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2014-5-21
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
如何获取一个程序的通讯IP
如何获取一个程序的通讯IP,想以此方法来判断本程序是否与服务器通讯(这里不是检测服务器,而是看本机的程序是否联网),如果没有通讯(网络问题,时好时坏)就读不出此程序的联网IP,如果联网正常,就会出现IP与端口,如图
图片附件: 游客没有浏览图片的权限,请 登录注册
,能不能用VB直接判断,效果如下图
图片附件: 游客没有浏览图片的权限,请 登录注册

搜索更多相关主题的帖子: 服务器 如何 检测 网络 
2015-02-03 20:05
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:7 
图片附件: 游客没有浏览图片的权限,请 登录注册

不要選我當版主
2015-02-03 23:26
lzb3158
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2014-5-21
收藏
得分:0 
回复 2楼 wube
Private Sub Form_Load()
Label1.Caption = Winsock1.LocalIP
End Sub

这个是获取本机的IP地址,我想要的是获取一个程序的通讯IP  如QQ的?
2015-02-03 23:43
lzb3158
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2014-5-21
收藏
得分:0 
自己顶一个
用CMD命令读取到盘里然后再读取txt里面的指定内容,如果有就说明在联网通讯,反之就没有,我觉得这样读取很占内存,请高手简化一下,尽量用简化的代码,获得高效的效率,谢谢!
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Const PROCESS_QUERY_INFORMATION = &H400
Const STILL_ALIVE = &H103

Private Sub Command1_Click()
Dim pId As Long, pHnd As Long
If Dir("d:\temp.txt") <> "" Then Kill "d:\temp.txt"
pId = Shell("cmd /c netstat -an>>d:\temp.txt", vbMinimizedFocus)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pId)
Do
Call GetExitCodeProcess(hProcess, ExitCode)
DoEvents
Loop While ExitCode = STILL_ALIVE
Call CloseHandle(hProcess)

Open "d:\temp.txt" For Input As #1
Line Input #1, aa
'MsgBox aa
Close #1

End Sub
就想读取指定这个格式
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 lzb3158 于 2015-2-4 11:46 编辑 ]
2015-02-04 11:43
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30067
注 册:2008-10-15
收藏
得分:7 
我把我以前写的代码你参考一下吧。我也是想的这个方法。
我程序的目的是只允许的客户端连接指定的服务器,非指定的程序就把这个程序给干掉。与你的目的不同。
同理的代码,不解释。

--------调用---------
    '运行连接扫描
    Shell "cmd /c netstat -n -o > " & path & "tmp.txt", vbHide
    Timer4.Enabled = True               '开定时器



-------定时器代码------
On Error Resume Next
Timer4.Enabled = False
Dim pro As Object
Dim obj As Object
Dim B As Boolean

Dim lPHand As Long
Dim TMBack As Long

Set pro = GetObject("winmgmts:\\.\root\cimv2").execquery("select * from win32_process where name='netstat.exe' ")
For Each obj In pro
    'Debug.Print LCase(obj.Name)
    If LCase(obj.Name) = "netstat.exe" Then
        B = True
        lPHand = OpenProcess(1&, True, obj.Handle)   '获取进程句柄
        TMBack = TerminateProcess(lPHand, 0&)   '关闭进程
        '关闭被Kill进程的所以句柄
        CloseHandle lPHand
    End If
Next
If B Then       '发现有进程后,KILL后重新启动
    If Dir(path & "tmp.txt") <> "" Then
        Kill path & "tmp.txt"           '删除临时文件
    End If
    Shell "cmd /c netstat -n -o > " & path & "tmp.txt", vbHide
    Timer4.Enabled = True
Else
    If Dir(path & "tmp.txt") <> "" Then
    Dim s As Variant
    Dim fj() As String
    Dim fj2() As String
    Dim k As Long
   
    Dim TitleStr As String * 255
    Dim h As Long
    Dim m_Hwnd As Long
   
    s = 打开文件(path & "tmp.txt")
    Kill path & "tmp.txt"
    fj = Split(s, vbCrLf)
   
    For Each s In fj
        s = Trim(s)
        If Len(s) > 0 Then
            Do                              '使用循环继续换,在最前面还是会有一个'
                k = Len(s)
                s = Replace(s, "  ", " ")
            Loop While k <> Len(s)
            fj2 = Split(s, " ")
            If UBound(fj2) = 4 Then
            If fj2(2) = serverIP & ":" & 远程端口 Then            '如果连接了远程端口的
            
            If fj2(4) <> "0" Then
            Set pro = GetObject("winmgmts:\\.\root\cimv2").execquery("select * from win32_process ")
            For Each obj In pro
                If obj.Handle = Val(fj2(4)) And LCase(obj.Name) <> LCase(clientname) Then         '但并不是客户端
                    If 显示消息 Then
                        Msg "发现非法程序:" & obj.Name, vbCritical, 消息标题
                    End If
               
                    lPHand = OpenProcess(1&, True, obj.Handle)   '获取进程句柄
                    TMBack = TerminateProcess(lPHand, 0&)   '关闭进程
                    '关闭被Kill进程的所以句柄
                    CloseHandle lPHand
                End If
            Next
            End If
            End If
            End If
        End If
    Next
    Else        '没有找到 tmp.txt 则重新生成
        Shell "cmd /c netstat -n -o > " & path & "tmp.txt", vbHide
        Timer4.Enabled = True
    End If
End If

授人于鱼,不如授人于渔
早已停用QQ了
2015-02-04 20:53
lzb3158
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2014-5-21
收藏
得分:0 
回复 5楼 风吹过b
风版主,我看不懂,能不能麻烦你帮我弄一个源码,我想这个对你来说,只是小儿科,对于我们才接触VB的人比登天还难。
2015-02-05 07:03
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30067
注 册:2008-10-15
收藏
得分:0 
首先,你是知道程序的PID ,还是只知道程序名,还是知道IP地址,这三种情况都处理不同的。

知道程序名,使用 netstat -n -b 进行查询。
知道 PID    使用 netstat -n -o 进行查询。
知道 IP地址,反查 程序名,可以使用 netstat -n -b 进行查询。

------使用B参数-------
  TCP    10.92.29.60:50272      101.226.52.201:80      CLOSE_WAIT
 [QQ.exe]

一行一行的读,读完一行, 先保存这一行,然后再读下一行,如果包含指定的字符串(程序名)
那么对上一行进行处理。
处理方式:
1、先去掉多余的空格
            Do
                k = Len(s)
                s = Replace(s, "  ", " ")
            Loop While k <> Len(s)
2、再按 空格分解成数组。
            fj2 = Split(s, " ")
3、判断是否符合要求的数据
            If UBound(fj2) = 4 Then
4、取数据
            fj2(2)
如果不包含所需要的程序名,
刚这行放缓冲,继续读一下行。
直到完成为止,没时间写完整代码,你自己慢慢考虑。

------------O参数---------------
  TCP    10.92.29.60:50225      101.226.52.201:80      CLOSE_WAIT      7960
  TCP    10.92.29.60:50233      101.226.52.201:80      CLOSE_WAIT      7960

直接按流程处理数据,然后比较最后的 PID 是否相符。

授人于鱼,不如授人于渔
早已停用QQ了
2015-02-05 12:03
lzb3158
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2014-5-21
收藏
得分:0 
再顶一下,别下沉!求各版主帮一忙,本人VB小白。
2015-02-05 18:02
lzb3158
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2014-5-21
收藏
得分:0 
再顶一个,别下沉啊。
2015-02-06 17:27
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:7 
回复 9楼 lzb3158
风版主既给了你方法,也给了相关的源代码,你如果是学习的话,应该能触类旁通吧。
如果是求程序,你私下和风版主联系下,说不定他一好心,就帮你做了。
另:netstat只能获取正在进行tcp网络通讯的进程,不能获取udp和通讯结束的进程(比如你用ie打开一个网页后,运行netstat,会找不到ie进程),如果要真正获取进行了网络通讯的进程,还是要学学vb如何写防火墙的方法。
2015-02-06 20:03
快速回复:如何获取一个程序的通讯IP
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028447 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved