枚举网段内的MS-SQL

来源:互联网 发布:狂湿淘宝店地址 编辑:程序博客网 时间:2024/04/27 13:46
/************************************************************************/
/* 查找网段中活动的MS-SQLSERVER                                         */
/* 本代码在互联网上搜集整理而来                                         */
/* 余浩◎中科数码                                                       */
/* 2007-06-27                                                           */
/************************************************************************/
#include 
"StdAfx.h"
#include 
"winsock2.h"
#include 
"lm.h"
#include 
"lmserver.h"
#include 
"lmapibuf.h"

UINT _stdcall GetActiveSqlServer(
/*CComboBox &combo*/LPVOID ComboBoxHandle)
{
    CComboBox 
*pCombo = reinterpret_cast<CComboBox*>(ComboBoxHandle);
    
if(!::IsWindow(pCombo->GetSafeHwnd()))
        
return 0;
    
    
char        Ip[20];
    
char        a[64],tempchar[64];
    PSERVER_INFO_100     pBuf;
    PSERVER_INFO_100     pTmpBuf;
    DWORD     dwLevel     
= 100;
    DWORD     dwPrefMaxLen     
= -1;
    DWORD     dwEntriesRead     
= 0;
    DWORD     dwTotalEntries     
= 0;
    DWORD     dwTotalCount     
= 0;
    DWORD     dwServerType     
=  SV_TYPE_SQLSERVER;           
    DWORD     dwResumeHandle 
= 0;       
    NET_API_STATUS     nStatus;       
    LPTSTR     pszServerName 
= NULL;       
    DWORD     i;

    WSADATA wsaData;
    
if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0)  
    
{  
        TRACE(
"WSAStartup failed !/n");
        
return 0;  
    }

    pCombo
->ResetContent();
    nStatus 
= NetServerEnum(NULL,       
                            dwLevel,       
                            (LPBYTE
*)&pBuf,
                            dwPrefMaxLen,
                            
&dwEntriesRead,
                            
&dwTotalEntries,
                            dwServerType,
                            NULL,
                            
&dwResumeHandle);
    
if(nStatus == NERR_Success)
    

        
if((pTmpBuf = pBuf) != NULL)
        
{       
            
for(i=0; i<dwEntriesRead; i++)       
            
{       
                
if(pTmpBuf == NULL)       
                
{       
                    fprintf(stderr,  
"An  access  violation  has occurred ");       
                    
break;       
                }

                
int leng = lstrlenW((unsigned short*)pTmpBuf->sv100_name)*2
                
if(leng > 0)
                    RtlMoveMemory(a, pTmpBuf
->sv100_name, leng);
                memset(tempchar, 
064);
                WideCharToMultiByte(
00, (unsigned short*)a, -1
                    tempchar, leng
/2, NULL, NULL);       
                
int index = pCombo->AddString(tempchar);

                
struct hostent *m_host;
                m_host 
= gethostbyname(tempchar);
                
if(m_host)
                
{
                    
struct in_addr addr;
                    memset(
&addr,0,sizeof(struct in_addr));
                    
                    addr.S_un.S_addr 
= *(DWORD   *)*(m_host->h_addr_list);
                    memset(Ip, 
020);
                    memcpy(Ip, inet_ntoa(addr), strlen(inet_ntoa(addr)));
                    pCombo
->SetItemData(index, inet_addr(Ip));
                }

                pTmpBuf
++;
                dwTotalCount
++;
            }

//            if(pCombo->GetCount() > 0)
//                pCombo->SetCurSel(0);
    
            TRACE(
" Entries enumerated:%d ", dwTotalCount);   
        }

    }

    
else if(nStatus == ERROR_MORE_DATA)
    
{       
        TRACE0(
" More entries available!!! ");
        TRACE(
"Total entries: %d", dwTotalEntries); 
    }


    
if(pBuf != NULL)
        NetApiBufferFree(pBuf);

    WSACleanup();
    
return 0;
}