断开已经建立的TCP连接
如何断开指定进程的网络连接,已经建立的

解决方案 »

  1.   

    ' 黑客入侵监控程序(VB6) 
    Option Explicit 
    Private Type MIB_TCPROW ' TCP连接表中一行的结构 
    dwState As Long ' 状态 
    dwLocalAddr As Long ' Local IP 
    dwLocalPort As Long ' Local port 
    dwRemoteAddr As Long ' Remote IP 
    dwRemotePort As Long ' Remote port 
    End Type 
    Private Type MIB_TCPTABLE 
    dwNum_Of_Entries As Long ' 当前 TCP连接的总数 
    TCP_Table(120) As MIB_TCPROW ' 预留了120行的缓冲区 
    End Type 
    Private Declare Function GetTcpTable Lib "iphlpapi.dll" (ByRef pTcpTable _ 
    As MIB_TCPTABLE, ByRef pdwSize As Long, ByVal bOrder As Long) As Long 
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef _ 
    pDest As Any, ByRef pSource As Any, ByVal Length As Long) 
    Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _ 
    (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long 
    Private Declare Function GetWindowsDirectory Lib "kernel32" Alias _ 
    "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long 
    Private Declare Function SetTcpEntry Lib "iphlpapi.dll" (ByRef pTcpTable _ 
    As MIB_TCPROW) As Long 
    Dim Last_Num_Of_Entries As Long 
    Dim TCP1 As MIB_TCPTABLE 
    Private Sub Form_Load() 
    Timer1.Interval = 10000 ' 定时监控 
    Timer1_Timer 
    End Sub 
    Private Sub Timer1_Timer() 
    Dim Return1 As Long, i As Long, Tmp1 As Long, Tmp2 As Long 
    Dim Ip_Buf(1 To 4) As Byte 
    Dim Win_Path As String, Tmp3 As String 
    Return1 = GetTcpTable(TCP1, Len(TCP1), 1) ' 返回 TCP连接表 
    If Last_Num_Of_Entries <> 0 And _ 
    Last_Num_Of_Entries <> TCP1.dwNum_Of_Entries Then ' 有异常时发出警告 
    Picture1.Visible = True ' 设置警告标志 
    On Error Resume Next 
    Win_Path = String(145, 0) 
    i = GetWindowsDirectory(Win_Path, 145) 
    Win_Path = Left(Win_Path, i) 
    i = sndPlaySound(Win_Path + "\Media\Ding.wav", &H1) ' 发出报警声音 
    On Error GoTo 0 
    Else 
    If Picture1.Visible = True Then Picture1.Visible = False 
    End If 
    Last_Num_Of_Entries = TCP1.dwNum_Of_Entries 
    Select Case Return1 ' 判断返回值 
    Case 0&: 
    Text1 = "": Combo1.Clear 
    For i = 0 To TCP1.dwNum_Of_Entries - 1 
    Tmp3 = Str(i + 1) + " " 
    Select Case TCP1.TCP_Table(i).dwState ' 显示连接状态 
    Case 1: Tmp3 = Tmp3 + "CLOSED" 
    Case 2: Tmp3 = Tmp3 + "LISTENING" 
    Case 3: Tmp3 = Tmp3 + "SYN_SENT" 
    Case 4: Tmp3 = Tmp3 + "SYN_RCVD" 
    Case 5: Tmp3 = Tmp3 + "ESTABLISHED" 
    Case 6: Tmp3 = Tmp3 + "FIN_WAIT1" 
    Case 7: Tmp3 = Tmp3 + "FIN_WAIT2" 
    Case 8: Tmp3 = Tmp3 + "CLOSE_WAIT" 
    Case 9: Tmp3 = Tmp3 + "CLOSING" 
    Case 10: Tmp3 = Tmp3 + "LAST_ACK" 
    Case 11: Tmp3 = Tmp3 + "TIME_WAIT" 
    Case 12: Tmp3 = Tmp3 + "DELETE_TCB" 
    End Select 
    Combo1.AddItem Tmp3 ' 充实列表以供用户删除 
    Tmp3 = Tmp3 + ":" + vbCrLf + vbTab + "Local: " ' 本地IP 
    CopyMemory Ip_Buf(1), TCP1.TCP_Table(i).dwLocalAddr, 4 
    Tmp3 = Tmp3 + CStr(Ip_Buf(1)) + "." + CStr(Ip_Buf(2)) + "." _ 
    + CStr(Ip_Buf(3)) + "." + CStr(Ip_Buf(4)) 
    Tmp1 = TCP1.TCP_Table(i).dwLocalPort ' 本地端口 
    Tmp2 = Tmp1 / 256 + (Tmp1 Mod 256) * 256 
    Tmp3 = Tmp3 + ":" + Str(Tmp2) + vbTab + "Remote: " ' 远程IP 
    CopyMemory Ip_Buf(1), TCP1.TCP_Table(i).dwRemoteAddr, 4 
    Tmp3 = Tmp3 + CStr(Ip_Buf(1)) + "." + CStr(Ip_Buf(2)) + "." _ 
    + CStr(Ip_Buf(3)) + "." + CStr(Ip_Buf(4)) 
    Tmp1 = TCP1.TCP_Table(i).dwRemotePort ' 远程端口 
    Tmp2 = Tmp1 / 256 + (Tmp1 Mod 256) * 256 
    Tmp3 = Tmp3 + ":" + Str(Tmp2) + vbCrLf 
    Text1 = Text1 + Tmp3 
    Next i 
    Case 50&: 
    MsgBox "系统不支持该API函数": End 
    Case 87: 
    MsgBox "无效的参数": End 
    Case 111&: 
    MsgBox "缓冲区溢出": End 
    Case 232&: 
    MsgBox "无数据": End 
    End Select 
    End Sub 
    Private Sub 删除该连接_Click() 
    Dim Return1 As Long 
    If Combo1.ListIndex < 0 Then Exit Sub 
    ' 将欲删连接的状态置为MIB_TCP_STATE_DELETE_TCB(值为12) 
    TCP1.TCP_Table(Combo1.ListIndex).dwState = 12 
    Return1 = SetTcpEntry(TCP1.TCP_Table(Combo1.ListIndex)) ' 执行删除 
    If Return1 = 0 Then 
    MsgBox "成功删除当前连接" 
    Else 
    MsgBox "删除连接失败" 
    End If 
    Timer1_Timer 
    End Sub 
      

  2.   

    那怎么才能识别这个连接是属于哪个进程的?
    比如我在NETSTAT -AN里看到很多连接,跟楼上得出的情况差不多
    怎么才能判断某个连接所属的进程
      

  3.   

    刚好我做了这个... 我资源里有...只要1分的那个...有代码... DELPHI的,不过应该差不多,你看下思路就可以了
      

  4.   

    你需要PID的话,还需要 MIB_TCPEXROW 这个记录体只是比 MIB_TCPROW多了个DWPROCESSID...到时候你根据MIB_TCPEXROW 自己填充MIB_TCPROW 很简单DIM MDGB AS MIB_TCPROW
    设置 
    MDGB.DWATATE=12 '这个就是清除连接
    其它的自行填充然后
    SETTCPENTRY(MDGB) 
      

  5.   

    DWORD GetExtendedTcpTable(
      PVOID pTcpTable,
      PDWORD pdwSize,
      BOOL bOrder,
      ULONG ulAf,
      TCP_TABLE_CLASS TableClass,
      ULONG Reserved
    );这个函数行吧?
    这里的pTcpTable应该是
    typedef struct {  DWORD dwState;  DWORD dwLocalAddr;  DWORD dwLocalPort;  DWORD dwRemoteAddr;  DWORD dwRemotePort;  DWORD dwOwningPid;
    } MIB_TCPROW_OWNER_PID, *PMIB_TCPROW_OWNER_PID;
      

  6.   

    如果用MIB_TCPROW_OWNER_PID这个结构,是不是在后面使用SETTCPENTRY的时候要把这个结构先把数据复制进一个MIB_TCPROW里面?
      

  7.   

    用MIB_TCPEXROW 的话 这个结构比MIB_TCPROW 多DWPROCESSID这个记录你只需要把前面的数据依次填充到 MIB_TCPROW 里的就可以了你完全可以使用MIB_TCPEXROW 
    GetTcpEXTable 
    等来获取信息...等到你要结束连接的时候,把要结束的那一项的数据填充到你定义的MIB_TCPROW记录行里
    DIM A AS MIB_TCPROW
    A.DWSTATE=12 '关闭的关键就在这个状态标志...值是12
    然后SETTCPENTRY(你填充的MIB_TCPROW记录) 当然不一定真的就能关闭... 不过能关闭的它还是会关闭的
      

  8.   

    http://topic.csdn.net/u/20080902/23/cecf6735-fa85-439a-8cd2-4e0ba80f2c61.html