检查端口是否被使用VC代码

 
/* 检查断端口是否被使用 */
STDMETHODIMP DefendCenter::CheckPort(BSTR 
* port, BSTR  * result)
{    
    
char *  resultText  =   " false " ;
    
char *  chrPort  =  _com_util::ConvertBSTRToString( * port);
    WORD cwPort;
    DWORD dwState;
    CString strPort;

    PMIB_TCPTABLE pTcpTable;

    pTcpTable 
=  (MIB_TCPTABLE * ) malloc( sizeof (MIB_TCPTABLE));
    DWORD dwSize 
=   0 ;
    DWORD dwRetVal 
=   0 ;

    
//  Make an initial call to GetTcpTable to
    
//  get the necessary size into the dwSize variable
    
// 查看MSDN得知,如果错误返回ERROR_INSUFFICIENT_BUFFER,说明没有足够的空间初始化pTcpTable,GetTcpTable把需要的大小赋给dwSize

    
if  (GetTcpTable(pTcpTable,  & dwSize, TRUE)  ==  ERROR_INSUFFICIENT_BUFFER)
    {
        
// 这里一定要再为pTcpTable申请一次空间,因为原来申请的空间已经不够了,用新获得大小申请
        GlobalFree(pTcpTable);
        pTcpTable 
=  (MIB_TCPTABLE * ) malloc ((UINT) dwSize);
    }


    
//  Make a second call to GetTcpTable to get
    
//  the actual data we require
    
// 得到dwSize之后在调用一次GetTcpTable填充pTcpTable
     if  ((dwRetVal  =  GetTcpTable(pTcpTable,  & dwSize, TRUE))  ==  NO_ERROR)
    {
        
for  ( int  i  =   0 ; i  <  ( int ) pTcpTable -> dwNumEntries; i ++ )
        {
            dwState 
=  pTcpTable -> table[i].dwState;
            
if (pTcpTable -> table[i].dwLocalAddr  ==   0   ||  pTcpTable -> table[i].dwRemoteAddr  ==   0   ||  dwState  !=   5
            {
                
continue ;
            }
            cwPort 
=  ntohs(pTcpTable -> table[i].dwLocalPort);
            
            strPort.Format(
" %d " ,cwPort);            
            
if (strPort  ==  chrPort)
            {
                resultText 
=   " true " ;
                
break ;
            }
        }
    }

    _bstr_t bstrText 
=  _bstr_t(resultText); 
    
* result  =  bstrText.copy();

    
return  S_OK;
}

端口状态:

char     * state[ 13 ] = {{ " KNOW " },{ " CLOSED " },{ " LISTEN " },{ " SYN_SENT " },{ " SYN_RCVD " },   
      {
" ESTAB " },{ " FIN_WAIT1 " },{ " FIN_WAIT2 " },{ " CLOSE_WAIT " },{ " CLOSING " },   
      {
" LAST_ACK " },{ " TIME_WAIT " },{ " DELETE_TCB " }}; 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
扫描多IP之多端口 ////////////////////////////////////////////////////////////////////////// //FileName: PortScanner.cpp //Data: 2009-04-18 //Remark: 扫描核心代码 ////////////////////////////////////////////////////////////////////////// #pragma once #include "Header.h" #include "resource.h" ////////////////////////////////////////////////////////////////////////// //端口器扫描初始化 ////////////////////////////////////////////////////////////////////////// BOOL InitPortScan() { WSADATA WsaData; //构建socket版本信息 WORD WsaVersion=MAKEWORD(2,2); //初始化网络 if(WSAStartup(WsaVersion,&WsaData;)!=0) { MessageBoxA(NULL,"WSAStartup fail;",NULL,NULL); return FALSE; } return TRUE; } ////////////////////////////////////////////////////////////////////////// //connect线程函数 ////////////////////////////////////////////////////////////////////////// DWORD WINAPI PortScanthread(LPVOID LpParam) { ThreadParam Param; //将参数复制 MoveMemory(&Param;,LpParam,sizeof(Param)); //将hCopyOkEvent设为有信号状态来通知扫描主线程进行下一次循环 SetEvent(Param.hCopyOkEvent); SOCKET Sock; SOCKADDR_IN SockAddr = {0}; //创建socket Sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (Sock==INVALID_SOCKET) { MessageBoxA(NULL,"INVALID_SOCKET",NULL,NULL); } //填充IP地址及端口信息 SockAddr.sin_family = AF_INET; SockAddr.sin_addr.s_addr = htonl(Param.Ip); SockAddr.sin_port = htons(Param.Port); //将IP地址转换为字符串 char *IpChar = inet_ntoa(SockAddr.sin_addr); char str[200]; if(connect(Sock,(SOCKADDR *)&SockAddr;,sizeof(SockAddr))==0) { //连接成功, sprintf(str,"%s : %d 连接成功\n",IpChar,Param.Port); } else { //连接失败 sprintf(str,"%s : %d 连接失败\n",IpChar,Param.Port); } //添加显示信息 InsertInfo(str); //释放一个信号量计数 ReleaseSemaphore(Param.hThreadNum,1,NULL); //关闭socket closesocket(Sock); return 0; } ////////////////////////////////////////////////////////////////////////// //扫描主线程 ////////////////////////////////////////////////////////////////////////// DWORD WINAPI MainThread(LPVOID LpParam) { MainThreadParam Param; //将参数复制 MoveMemory(&Param;,LpParam,sizeof(Param)); //将Param.hCopyEvent设置为有信号状态 SetEvent(Param.hCopyEvent); ThreadParam threadparam = {0}; //创建子线程的“参数复制完成”事件对象,并作为参数传入PortScanthread() HANDLE hThreadCopyOkEvent = CreateEvent(NULL,TRUE,FALSE,NULL); threadparam.hCopyOkEvent=hThreadCopyOkEvent; //创建一个信号量对象来控制子线程的总数量PortScanthread() HANDLE hThreadNum = CreateSemaphore(NULL,256,256,NULL); threadparam.hThreadNum = hThreadNum; //循环connect for (DWORD Ip = Param.StartIp;Ip<=Param.EndIp;Ip++) { for (DWORD Port = Param.StartPort;Port<=Param.EndPort;Port++) { //等待hThreadNum发出信号(表示有可有线程) DWORD WaitRes =WaitForSingleObject(hThreadNum,200); if (WaitRes==WAIT_OBJECT_0) { threadparam.Ip=Ip; threadparam.Port=Port; CreateThread(NULL,0,PortScanthread,&threadparam;,0,NULL); //等待其子线程发出“参数复制完毕”的信号 WaitForSingleObject(threadparam.hCopyOkEvent,INFINITE); //重置threadparam.hCopyOkEvent为无信号状态 ResetEvent(threadparam.hCopyOkEvent); } else if(WaitRes==WAIT_TIMEOUT) { Port--; continue; } } } return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值