我能够用程序来扫描出本机打开的TCP端口。请问如何编写代码关闭其它程序打开的TCP端口??
谢谢!

解决方案 »

  1.   

    别的程序创建连接打开的端口,一般情况下是无法直接关闭的,只能通过终止建立连接的进程来关闭这个端口。具体方法是调用OpenProcess和TerminateProcess,参考这篇文章:
    http://news.onlinedown.net/info/15911-1.htm
      

  2.   

    TCPView就可以,但不知是怎么实现的。
      

  3.   

    搂主的意思是只关闭该TCP连接,不结束该进程吧?
    屏蔽掉该TCP连接的端口就行了.
      

  4.   

    参考TCP/IP中的端口筛选,屏蔽端口
      

  5.   

    谢谢大家的回答,我的意思只是断开本机别的程序打开的TCP连接,并不屏蔽端口,就像TCPView一样。 查了些资料,据说是获取连接句柄,发送rst 包,可我还是不知道怎么做,那位能详细解答一下啊,谢谢了。
      

  6.   

    http://community.csdn.net/Expert/topic/2975/2975190.xml?temp=.7240106
      

  7.   

    基本的原理是用winpcap抓取包的拷贝,仿造TCP的ACK包发送一份伪包带RST标志来中断连接。
    我一年前写过一个帖子是如何中断已有的RST连接,你可以看看。
    http://search.csdn.net/Expert/topic/2277/2277485.xml?temp=1.098269E-02
      

  8.   

    close别人用的fd不就可以关了。fd是系统全局的吧
      

  9.   

    我自己解决了,只是在window下的可以:
    使用iphelper.dll 中的SetTcpEntry()函数就行了,在使用这个函数之前,先获得TCP连接信息。int main(int argc, char* argv[])
    { // Declare and initialize variables
    PMIB_TCPTABLE pTcpTable = 0;
        char ipaddress[100]; //pTcpTable = (MIB_TCPTABLE*) malloc(sizeof(MIB_TCPTABLE));
    DWORD dwSize = 0; // Make an initial call to GetTcpTable to
    // get the necessary size into the dwSize variable
    if( GetTcpTable(pTcpTable, &dwSize, TRUE) == ERROR_INSUFFICIENT_BUFFER ) 
    {
      pTcpTable = ( MIB_TCPTABLE* ) malloc( (UINT) dwSize );
    } // Make a second call to GetTcpTable to get
    // the actual data we require
    DWORD dwRetVal;
    if( (dwRetVal = GetTcpTable( pTcpTable, &dwSize, TRUE )) == NO_ERROR ) 
    {
      for( int i = 0; i < (int) pTcpTable->dwNumEntries; i++ ) 
      {
    sprintf( ipaddress, "%d.%d.%d.%d", 
         (pTcpTable->table[i].dwRemoteAddr >> 24) & 0xFF,
         (pTcpTable->table[i].dwRemoteAddr >> 16) & 0xFF,
         (pTcpTable->table[i].dwRemoteAddr >> 8) & 0xFF,
         (pTcpTable->table[i].dwRemoteAddr) & 0xFF ); printf( "%s\n", ipaddress );
    // kill the TCP link to 210.51.181.253
    if( strcmp(ipaddress, "253.181.51.210") == 0 )
    {
    MIB_TCPROW sKillConn;
    sKillConn = pTcpTable->table[i];

                               
                               sKillConn.dwState = MIB_TCP_STATE_DELETE_TCB;

                               // close tcp connection
    DWORD dwRez = SetTcpEntry( &sKillConn );
    }
      }
    } else 
    {
    printf( "\tCall to GetTcpTable failed.\n" );
    }
    if( pTcpTable )
    {
    free( pTcpTable ) ;
    }
    return 0;
    }