⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nlaquery.cpp

📁 这个是网络编程
💻 CPP
字号:
//
// Module: nlaquery.cpp
//
// Description:
//    This sample demonstrates how to query and monitor the 
//    Network Location Awareness service using the 
//    WSALookupServiceBegin, WSALookupServiceNext and the 
//    WSALookupServiceEnd APIs to obtain a list of network 
//    names available to the system. For each network name 
//    found, network characteristics such as speed and 
//    conectivity properties are printed. 
//
// Compile:
//    cl nlaquery.cpp ws2_32.lib
//
// Command Line Arguments/Parameters
//    nlaquery.exe
//

#include <winsock2.h>
#include <mswsock.h>
#include <stdio.h>

void main(int argc, char **argv)
{
    WSADATA        wsd;
    int            Ret;
    char           buff[16384];
    DWORD          BufferSize;
    WSAQUERYSET   *qs=NULL;
    GUID           NLANameSpaceGUID = NLA_SERVICE_CLASS_GUID;
    HANDLE         hNLA;
    WSAEVENT       Event;

    // Load Winsock
    //
    if ((Ret = WSAStartup(MAKEWORD(2,2), &wsd)) != 0)
    {
        printf("WSAStartup failed with error: %d\n", Ret);
        return;
    }

    // Initalize the WSAQUERYSET structure for the query
    //
    qs = (WSAQUERYSET *) buff;

    memset(qs, 0, sizeof(*qs));

    // Required values

    qs->dwSize = sizeof(WSAQUERYSET);
    qs->dwNameSpace = NS_NLA;
    qs->lpServiceClassId = &NLANameSpaceGUID;

    // Optional values

    qs->dwNumberOfProtocols = 0;
    qs->lpszServiceInstanceName = NULL;
    qs->lpVersion = NULL;
    qs->lpNSProviderId = NULL;
    qs->lpszContext = NULL;
    qs->lpafpProtocols = NULL;
    qs->lpszQueryString = NULL;
    qs->lpBlob = NULL;

    
    if (WSALookupServiceBegin(qs, LUP_RETURN_ALL | LUP_DEEP,
                &hNLA) == SOCKET_ERROR)
    {
        printf("WSALookupServiceBegin failed with error %d\n", 
               WSAGetLastError());
        return;
    }


    if ((Event = WSACreateEvent()) == WSA_INVALID_EVENT)
    {
        printf("WSACreateEvent failed with error %d\n", WSAGetLastError());
        return;
    }

    while(1)
    {
        DWORD BytesReturned;
        WSACOMPLETION WSAComplete;
        WSAOVERLAPPED WSAOverlap;

        printf("Querying for Networks...\n");

        while (1)
        {
            memset(qs, 0, sizeof(*qs));

            BufferSize = sizeof(buff);
            if (WSALookupServiceNext(hNLA, LUP_RETURN_ALL,
                                     &BufferSize, qs) == SOCKET_ERROR)
            {
                int Err = WSAGetLastError();

                if (Err == WSA_E_NO_MORE)
                {
                    // There is no more data. Stop asking.
                    //
                    break;
                }

                printf("WSALookupServiceNext failed with error %d\n",
                       WSAGetLastError());

                WSALookupServiceEnd(hNLA);
                return;
            }

            printf("\nNetwork Name: %s\n", qs->lpszServiceInstanceName);
            printf("Network Friendly Name: %s\n", qs->lpszComment);

            if (qs->lpBlob != NULL)
            {
                //
                // Cycle through BLOB data list
                //
                DWORD     Offset = 0;
                PNLA_BLOB pNLA;

                do
                {
                    pNLA = (PNLA_BLOB) &(qs->lpBlob->pBlobData[Offset]);

                    switch (pNLA->header.type)
                    {
                        case NLA_RAW_DATA:
                            printf("\tNLA Data Type: NLA_RAW_DATA\n");
                            break;
                        case NLA_INTERFACE:
                            printf("\tNLA Data Type: NLA_INTERFACE\n");
                            printf("\t\tType: %d\n", pNLA->data.interfaceData.dwType);
                            printf("\t\tSpeed: %d\n", pNLA->data.interfaceData.dwSpeed);
                            printf("\t\tAdapter Name: %s\n", pNLA->data.interfaceData.adapterName);
                            break;
                        case NLA_802_1X_LOCATION:
                            printf("\tNLA Data Type: NLA_802_1X_LOCATION\n");
                            printf("\t\tInformation: %s\n", pNLA->data.locationData.information);
                            break;
                        case NLA_CONNECTIVITY:
                            printf("\tNLA Data Type: NLA_CONNECTIVITY\n");
                            switch(pNLA->data.connectivity.type)
                            {
                                 case NLA_NETWORK_AD_HOC:
                                     printf("\t\tNetwork Type: AD HOC\n");
                                     break;
                                 case NLA_NETWORK_MANAGED:
                                     printf("\t\tNetwork Type: Managed\n");
                                     break;
                                 case NLA_NETWORK_UNMANAGED:
                                     printf("\t\tNetwork Type: Unmanaged\n");
                                     break;
                                 case NLA_NETWORK_UNKNOWN:
                                     printf("\t\tNetwork Type: Unknown\n");
                            }
                            switch(pNLA->data.connectivity.internet)
                            {
                                 case NLA_INTERNET_NO:
                                     printf("\t\tInternet connectivity: No\n");
                                     break;
                                 case NLA_INTERNET_YES:
                                     printf("\t\tInternet connectivity: Yes\n");
                                     break;
                                 case NLA_INTERNET_UNKNOWN:
                                     printf("\t\tInternet connectivity: Unknown\n");
                                     break;
                            }

                            break;
                        case NLA_ICS:
                            printf("\tNLA Data Type: NLA_ICS\n");
                            printf("\t\tSpeed: %d\n", pNLA->data.ICS.remote.speed);
                            printf("\t\tType: %d\n", pNLA->data.ICS.remote.type);
                            printf("\t\tState: %d\n", pNLA->data.ICS.remote.state);
                            printf("\t\tMachine Name: %S\n", pNLA->data.ICS.remote.machineName);
                            printf("\t\tShared Adapter Name: %S\n", pNLA->data.ICS.remote.sharedAdapterName);
                            break;

                        default:
                            printf("\tNLA Data Type: Unknown to this program\n");
                            break;
                    }

                    Offset = pNLA->header.nextOffset;
                } 
                while (Offset != 0);
            }
        }

        printf("\nFinished query, Now wait for change notification...\n");

        WSAOverlap.hEvent = Event;
        WSAComplete.Type = NSP_NOTIFY_EVENT;
        WSAComplete.Parameters.Event.lpOverlapped = &WSAOverlap;

        if (WSANSPIoctl(hNLA, SIO_NSP_NOTIFY_CHANGE, NULL, 0, NULL, 0,
            &BytesReturned, &WSAComplete) == SOCKET_ERROR)
        {
            int Ret = WSAGetLastError();

            if (Ret != WSA_IO_PENDING)
            {
                printf("WSANSPIoctrl failed with error %d\n", Ret);
                return;
            }
        }

        if (WSAWaitForMultipleEvents(1, &Event, TRUE, WSA_INFINITE, FALSE) == WSA_WAIT_FAILED)
        {
            printf("WSAWaitForMultipleEvents failed with error %d\n", WSAGetLastError());
            return;
        }

        WSAResetEvent(Event);

    }

    WSALookupServiceEnd(hNLA);

    WSACleanup();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -