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

📄 main.c

📁 微软的http服务器实例代码
💻 C
字号:
/*++
 Copyright (c) 2002 - 2002 Microsoft Corporation.  All Rights Reserved.

 THIS CODE AND INFORMATION IS PROVIDED "AS-IS" WITHOUT WARRANTY OF
 ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
 PARTICULAR PURPOSE.

 THIS CODE IS NOT SUPPORTED BY MICROSOFT. 

--*/

#include "precomp.h"
#pragma hdrstop

/***************************************************************************++

Routine Description:
    main routine.

Arguments:
    argc - # of command line arguments.
    argv - Arguments.

Return Value:
    Success/Failure.

--***************************************************************************/
int _cdecl wmain(int argc, LPWSTR argv[])
{
    DWORD           Status = NO_ERROR;
    HTTPCFG_TYPE    Type;
    HTTPAPI_VERSION HttpApiVersion = HTTPAPI_VERSION_1;
    WORD            wVersionRequested;
    WSADATA         wsaData;

    // Parse command line parameters.

    if(argc < 3)
    {
        NlsPutMsg(HTTPCFG_USAGE, argv[0]);
        return 0;
    }

    argv++; argc --;

    //
    // First parse the type of operation.
    //
   
    if(_wcsicmp(argv[0], L"set") == 0)
    {
        Type = HttpCfgTypeSet;
    }
    else if(_wcsicmp(argv[0], L"query") == 0)
    {
        Type = HttpCfgTypeQuery;
    }
    else if(_wcsicmp(argv[0], L"delete") == 0)
    {
        Type = HttpCfgTypeDelete;
    }
    else if(_wcsicmp(argv[0], L"?") == 0)
    {
        NlsPutMsg(HTTPCFG_USAGE, argv[0]);
        return 0;
    }
    else
    {
        NlsPutMsg(HTTPCFG_INVALID_SWITCH, argv[0]);
        return ERROR_INVALID_PARAMETER;
    }
    argv++; argc--;

    //
    // Call HttpInitialize.
    //

    if((Status = HttpInitialize(
                    HttpApiVersion, 
                    HTTP_INITIALIZE_CONFIG, 
                    NULL)) != NO_ERROR)
    {
        NlsPutMsg(HTTPCFG_HTTPINITIALIZE, Status);
        return Status;
    }

    //
    // Call WSAStartup as we are using some winsock functions.
    //
    wVersionRequested = MAKEWORD( 2, 2 );

    if(WSAStartup( wVersionRequested, &wsaData ) != 0)
    {
        HttpTerminate(HTTP_INITIALIZE_CONFIG, NULL);
        return GetLastError();
    }

    //
    // Call the corresponding API.
    //

    if(_wcsicmp(argv[0], L"ssl") == 0)
    {
        argv++; argc--;
        Status = DoSsl(argc, argv, Type);
    }
    else if(_wcsicmp(argv[0], L"urlacl") == 0)
    {
        argv++; argc--;
        Status = DoUrlAcl(argc, argv, Type);
    }
    else if(_wcsicmp(argv[0], L"iplisten") == 0)
    {
        argv++; argc--;
        Status = DoIpListen(argc, argv, Type);
    }
    else 
    {
        NlsPutMsg(HTTPCFG_INVALID_SWITCH, argv[0]);
        Status = ERROR_INVALID_PARAMETER;
    }

    WSACleanup();
    HttpTerminate(HTTP_INITIALIZE_CONFIG, NULL);

    return Status;
}

/***************************************************************************++

Routine Description:
    Write output

Arguments:
    Handle    - Handle to write to.
    MsgNumber - The message number.
    ...       - Optional arguments.

Return Value:
    Success/Failure.

--***************************************************************************/
UINT 
NlsPutMsg (
    IN UINT MsgNumber, 
    IN ...
    )
{
    UINT    msglen;
    VOID    *vp;
    va_list arglist;

    va_start(arglist, MsgNumber);

    msglen = FormatMessage(
                FORMAT_MESSAGE_FROM_HMODULE | 
                FORMAT_MESSAGE_ALLOCATE_BUFFER,   // dwFlags.
                NULL,                             // lpSource. 
                MsgNumber,                        // dwMessageId. 
                0L,                               // dwLanguageId (default)
                (LPWSTR)&vp,
                0,
                &arglist
                );

    if(!msglen)
    {
        return 0;
    }

    wprintf(L"%ws", vp);

    LocalFree(vp);

    return msglen;
}

/***************************************************************************++

Routine Description:
    Given a WCHAR IP, this routine converts it to a SOCKADDR. 

Arguments:
    pIp     - IP address to covert.
    pBuffer - Buffer, must be == sizeof(SOCKADDR_STORAGE)
    Length  - Length of buffer

Return Value:
    Success/Failure.

--***************************************************************************/
DWORD
GetAddress(
    PWCHAR  pIp, 
    PVOID   pBuffer,
    ULONG   Length
    )
{
    DWORD Status;
    DWORD TempStatus;

    if(pIp == NULL)
    {
        return ERROR_INVALID_PARAMETER;
    }

    //
    // The address could be a v4 or a v6 address. First, let's try v4.
    //

    Status = WSAStringToAddress(
                pIp,
                AF_INET,
                NULL,
                pBuffer,
                (LPINT)&Length
                );

    if(Status != NO_ERROR)
    {
        //
        // Now, try v6
        //

        Status = WSAGetLastError();

        TempStatus = WSAStringToAddress(
                        pIp,
                        AF_INET6,
                        NULL,
                        pBuffer,
                        (LPINT)&Length
                        );

        //
        // If IPv6 also fails, then we want to return the original 
        // error.
        //
        // If it succeeds, we want to return NO_ERROR.
        //

        if(TempStatus == NO_ERROR)
        {
            Status = NO_ERROR;
        }
    }

    return Status;
}

⌨️ 快捷键说明

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