/*
检查断端口是否被使用
*/
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;
}
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 " }};
{ " ESTAB " },{ " FIN_WAIT1 " },{ " FIN_WAIT2 " },{ " CLOSE_WAIT " },{ " CLOSING " },
{ " LAST_ACK " },{ " TIME_WAIT " },{ " DELETE_TCB " }};