亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? wspiapi.h

?? IP協議分析工具ipdog開源代碼 好東西
?? H
?? 第 1 頁 / 共 2 頁
字號:
/*++

Copyright (c) 2000, Microsoft Corporation

Module Name:
    wspiapi.h

Abstract:
    The file contains protocol independent API functions.

Revision History:
    Wed Jul 12 10:50:31 2000, Created

--*/

#ifndef _WSPIAPI_H_
#define _WSPIAPI_H_

#include <stdio.h>              // sprintf()
#include <stdlib.h>             // calloc(), strtoul()
#include <malloc.h>             // calloc()
#include <string.h>             // strlen(), strcmp(), strstr()

#define WspiapiMalloc(tSize)    calloc(1, (tSize))
#define WspiapiFree(p)          free(p)
#define WspiapiSwap(a, b, c)    { (c) = (a); (a) = (b); (b) = (c); }
#define getaddrinfo             WspiapiGetAddrInfo
#define getnameinfo             WspiapiGetNameInfo
#define freeaddrinfo            WspiapiFreeAddrInfo

typedef int (WINAPI *WSPIAPI_PGETADDRINFO) (
    IN  const char                      *nodename,
    IN  const char                      *servname,
    IN  const struct addrinfo           *hints,
    OUT struct addrinfo                 **res);

typedef int (WINAPI *WSPIAPI_PGETNAMEINFO) (
    IN  const struct sockaddr           *sa,
    IN  socklen_t                       salen,
    OUT char                            *host,
    IN  size_t                          hostlen,
    OUT char                            *serv,
    IN  size_t                          servlen,
    IN  int                             flags);

typedef void (WINAPI *WSPIAPI_PFREEADDRINFO) (
    IN  struct addrinfo                 *ai);



#ifdef __cplusplus
extern "C" {
#endif
    
////////////////////////////////////////////////////////////
// v4 only versions of getaddrinfo and friends.
// NOTE: gai_strerror is inlined in ws2tcpip.h
////////////////////////////////////////////////////////////

_inline    
char *
WINAPI
WspiapiStrdup (
	IN  const char *                    pszString)
/*++

Routine Description
    allocates enough storage via calloc() for a copy of the string,
    copies the string into the new memory, and returns a pointer to it.

Arguments
    pszString       string to copy into new memory

Return Value
    a pointer to the newly allocated storage with the string in it.
    NULL if enough memory could not be allocated, or string was NULL.

--*/    
{
    char    *pszMemory;

    if (!pszString)
        return(NULL);

    pszMemory = (char *) WspiapiMalloc(strlen(pszString) + 1);
    if (!pszMemory)
        return(NULL);

    return(strcpy(pszMemory, pszString));
}

    
    
__inline
BOOL
WINAPI
WspiapiParseV4Address (
    IN  const char *                    pszAddress,
    OUT PDWORD                          pdwAddress)
/*++

Routine Description
    get the IPv4 address (in network byte order) from its string
    representation.  the syntax should be a.b.c.d.
    
Arguments
    pszArgument         string representation of the IPv4 address
    ptAddress           pointer to the resulting IPv4 address

Return Value
    Returns FALSE if there is an error, TRUE for success.
    
--*/
{
    DWORD       dwAddress   = 0;
    const char  *pcNext     = NULL;
    int         iCount      = 0;

    // ensure there are 3 '.' (periods)
    for (pcNext = pszAddress; *pcNext != '\0'; pcNext++)
        if (*pcNext == '.')
            iCount++;
    if (iCount != 3)
        return FALSE;

    // return an error if dwAddress is INADDR_NONE (255.255.255.255)
    // since this is never a valid argument to getaddrinfo.
    dwAddress = inet_addr(pszAddress);
    if (dwAddress == INADDR_NONE)
        return FALSE;

    *pdwAddress = dwAddress;
    return TRUE;
}



__inline
struct addrinfo *
WINAPI
WspiapiNewAddrInfo (
    IN  int                             iSocketType,
    IN  int                             iProtocol,
    IN  WORD                            wPort,
    IN  DWORD                           dwAddress)
/*++

Routine Description
    allocate an addrinfo structure and populate fields.
    IPv4 specific internal function, not exported.
    
Arguments
    iSocketType         SOCK_*.  can be wildcarded (zero).
    iProtocol           IPPROTO_*.  can be wildcarded (zero).
    wPort               port number of service (in network order).
    dwAddress           IPv4 address (in network order).
    
Return Value
    returns an addrinfo struct, or NULL if out of memory.

--*/    
{
    struct addrinfo     *ptNew;
    struct sockaddr_in  *ptAddress;

    // allocate a new addrinfo structure.
    ptNew       =
        (struct addrinfo *) WspiapiMalloc(sizeof(struct addrinfo));
    if (!ptNew)
        return NULL;

    ptAddress   =
        (struct sockaddr_in *) WspiapiMalloc(sizeof(struct sockaddr_in));
    if (!ptAddress)
    {
        WspiapiFree(ptNew);
        return NULL;
    }
    ptAddress->sin_family       = AF_INET;
    ptAddress->sin_port         = wPort;
    ptAddress->sin_addr.s_addr  = dwAddress;
    
    // fill in the fields...
    ptNew->ai_family            = PF_INET;
    ptNew->ai_socktype          = iSocketType;
    ptNew->ai_protocol          = iProtocol;
    ptNew->ai_addrlen           = sizeof(struct sockaddr_in);
    ptNew->ai_addr              = (struct sockaddr *) ptAddress;

    return ptNew;
}



__inline
int
WINAPI
WspiapiQueryDNS(
    IN  const char                      *pszNodeName,
    IN  int                             iSocketType,
    IN  int                             iProtocol,  
    IN  WORD                            wPort,      
    OUT char                            *pszAlias,
    OUT struct addrinfo                 **pptResult)
/*++

Routine Description
    helper routine for WspiapiLookupNode.
    performs name resolution by querying the DNS for A records.
    *pptResult would need to be freed if an error is returned.
    
Arguments
    pszNodeName         name of node to resolve.
    iSocketType         SOCK_*.  can be wildcarded (zero).
    iProtocol           IPPROTO_*.  can be wildcarded (zero).
    wPort               port number of service (in network order).
    pszAlias            where to return the alias.
    pptResult           where to return the result.
    
Return Value
    Returns 0 on success, an EAI_* style error value otherwise.

--*/    
{
    struct addrinfo **pptNext   = pptResult;
    struct hostent  *ptHost     = NULL;
    char            **ppAddresses;

    *pptNext    = NULL;
    pszAlias[0] = '\0';

    ptHost = gethostbyname(pszNodeName);
    if (ptHost)
    {
        if ((ptHost->h_addrtype == AF_INET)     &&
            (ptHost->h_length   == sizeof(struct in_addr)))
        {
            for (ppAddresses    = ptHost->h_addr_list;
                 *ppAddresses   != NULL;
                 ppAddresses++)
            {
                // create an addrinfo structure...
                *pptNext = WspiapiNewAddrInfo(
                    iSocketType,
                    iProtocol,
                    wPort,
                    ((struct in_addr *) *ppAddresses)->s_addr);
                if (!*pptNext)
                    return EAI_MEMORY;

                pptNext = &((*pptNext)->ai_next);
            }
        }

        // pick up the canonical name.
        strcpy(pszAlias, ptHost->h_name);
        return 0;
    }
    
    switch (WSAGetLastError())
    {
        case WSAHOST_NOT_FOUND: return EAI_NONAME;
        case WSATRY_AGAIN:      return EAI_AGAIN;
        case WSANO_RECOVERY:    return EAI_FAIL;
        case WSANO_DATA:        return EAI_NODATA;
        default:                return EAI_NONAME;
    }
}



__inline
int
WINAPI
WspiapiLookupNode(
    IN  const char                      *pszNodeName,
    IN  int                             iSocketType,
    IN  int                             iProtocol,  
    IN  WORD                            wPort,      
    IN  BOOL                            bAI_CANONNAME,
    OUT struct addrinfo                 **pptResult)
/*++

Routine Description
    resolve a nodename and return a list of addrinfo structures.
    IPv4 specific internal function, not exported.
    *pptResult would need to be freed if an error is returned.
    
    NOTE: if bAI_CANONNAME is true, the canonical name should be
          returned in the first addrinfo structure.
    
Arguments
    pszNodeName         name of node to resolve.
    iSocketType         SOCK_*.  can be wildcarded (zero).
    iProtocol           IPPROTO_*.  can be wildcarded (zero).
    wPort               port number of service (in network order).
    bAI_CANONNAME       whether the AI_CANONNAME flag is set.
    pptResult           where to return result.
    
Return Value
    Returns 0 on success, an EAI_* style error value otherwise.

--*/
{
    int     iError              = 0;
    int     iAliasCount         = 0;

    char    szFQDN1[NI_MAXHOST] = "";
    char    szFQDN2[NI_MAXHOST] = "";
    char    *pszName            = szFQDN1;
    char    *pszAlias           = szFQDN2;
    char    *pszScratch         = NULL;
    strcpy(pszName, pszNodeName);

    for (;;)
    {
        iError = WspiapiQueryDNS(pszNodeName,
                                 iSocketType,
                                 iProtocol,
                                 wPort,
                                 pszAlias,
                                 pptResult);
        if (iError)
            break;

        // if we found addresses, then we are done.
        if (*pptResult)
            break;

        // stop infinite loops due to DNS misconfiguration.  there appears
        // to be no particular recommended limit in RFCs 1034 and 1035.
        if ((!strlen(pszAlias))             ||
            (!strcmp(pszName, pszAlias))    ||
            (++iAliasCount == 16))
        {
            iError = EAI_FAIL;
            break;
        }

        // there was a new CNAME, look again.
        WspiapiSwap(pszName, pszAlias, pszScratch);
    }

    if (!iError && bAI_CANONNAME)
    {
        (*pptResult)->ai_canonname = WspiapiStrdup(pszAlias);
        if (!(*pptResult)->ai_canonname)
            iError = EAI_MEMORY;
    }

    return iError;
}



__inline
int
WINAPI
WspiapiClone (
    IN  WORD                            wPort,      
    IN  struct addrinfo                 *ptResult)
/*++

Routine Description
    clone every addrinfo structure in ptResult for the UDP service.
    ptResult would need to be freed if an error is returned.
    
Arguments
    wPort               port number of UDP service.
    ptResult            list of addrinfo structures, each
                        of whose node needs to be cloned.

Return Value
    Returns 0 on success, an EAI_MEMORY on allocation failure.

--*/
{
    struct addrinfo *ptNext = NULL;
    struct addrinfo *ptNew  = NULL;

    for (ptNext = ptResult; ptNext != NULL; )
    {
        // create an addrinfo structure...
        ptNew = WspiapiNewAddrInfo(
            SOCK_DGRAM,
            ptNext->ai_protocol,
            wPort,
            ((struct sockaddr_in *) ptNext->ai_addr)->sin_addr.s_addr);
        if (!ptNew)
            break;

        // link the cloned addrinfo
        ptNew->ai_next  = ptNext->ai_next;
        ptNext->ai_next = ptNew;
        ptNext          = ptNew->ai_next;
    }

    if (ptNext != NULL)
        return EAI_MEMORY;
    
    return 0;
}



__inline
void
WINAPI
WspiapiLegacyFreeAddrInfo (
    IN  struct addrinfo                 *ptHead)
/*++

Routine Description
    Free an addrinfo structure (or chain of structures).
    As specified in RFC 2553, Section 6.4.
    
Arguments
    ptHead              structure (chain) to free
    
--*/    
{
    struct addrinfo *ptNext;    // next strcture to free

    for (ptNext = ptHead; ptNext != NULL; ptNext = ptHead)
    {
        if (ptNext->ai_canonname)
            WspiapiFree(ptNext->ai_canonname);
        
        if (ptNext->ai_addr)
            WspiapiFree(ptNext->ai_addr);

        ptHead = ptNext->ai_next;
        WspiapiFree(ptNext);
    }
}



__inline
int
WINAPI
WspiapiLegacyGetAddrInfo(
    IN const char                       *pszNodeName,
    IN const char                       *pszServiceName,
    IN const struct addrinfo            *ptHints,
    OUT struct addrinfo                 **pptResult)
/*++

Routine Description
    Protocol-independent name-to-address translation.
    As specified in RFC 2553, Section 6.4.
    This is the hacked version that only supports IPv4.
    
Arguments
    pszNodeName         node name to lookup.
    pszServiceName      service name to lookup.
    ptHints             hints about how to process request.
    pptResult           where to return result.
    
Return Value
    returns zero if successful, an EAI_* error code if not.

--*/    
{
    int                 iError      = 0;
    int                 iFlags      = 0;
    int                 iFamily     = PF_UNSPEC;
    int                 iSocketType = 0;
    int                 iProtocol   = 0;
    WORD                wPort       = 0;
    DWORD               dwAddress   = 0;

    struct servent      *ptService  = NULL;
    char                *pc         = NULL;
    BOOL                bClone      = FALSE;
    WORD                wTcpPort    = 0;
    WORD                wUdpPort    = 0;
    
    
    // initialize pptResult with default return value.
    *pptResult  = NULL;


    ////////////////////////////////////////
    // validate arguments...
    //
    
    // both the node name and the service name can't be NULL.
    if ((!pszNodeName) && (!pszServiceName))
        return EAI_NONAME;

    // validate hints.
    if (ptHints)
    {
        // all members other than ai_flags, ai_family, ai_socktype
        // and ai_protocol must be zero or a null pointer.
        if ((ptHints->ai_addrlen    != 0)       ||
            (ptHints->ai_canonname  != NULL)    ||
            (ptHints->ai_addr       != NULL)    ||
            (ptHints->ai_next       != NULL))

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品免费日韩av| 亚洲大片免费看| 国产伦精一区二区三区| 欧美zozo另类异族| 国产乱码精品一区二区三区忘忧草| 欧美成人官网二区| 国产精一品亚洲二区在线视频| 国产欧美一区二区三区在线看蜜臀 | 久久精品免费在线观看| 国产精品久久久一本精品| 99re6这里只有精品视频在线观看| 国产精品欧美经典| 91高清视频在线| 日本视频在线一区| 久久精品人人做人人爽人人| caoporn国产一区二区| 亚洲一区二区美女| 欧美一区二区精品在线| 国产精品免费久久久久| 三级不卡在线观看| 亚洲精品一区二区精华| 91在线观看高清| 婷婷六月综合网| 久久久不卡网国产精品一区| 色婷婷av一区二区三区大白胸| 视频在线在亚洲| 国产精品久久网站| 日韩亚洲欧美综合| 99麻豆久久久国产精品免费| 日韩不卡在线观看日韩不卡视频| 成人激情动漫在线观看| 亚洲亚洲精品在线观看| 久久久99久久| 精品国产欧美一区二区| 99久久国产免费看| 久久超碰97中文字幕| 亚洲视频狠狠干| 2020国产成人综合网| 欧美午夜宅男影院| 成人激情午夜影院| 精品影视av免费| 91精品国产色综合久久不卡蜜臀| 成人污污视频在线观看| 日韩国产欧美一区二区三区| 国产精品污网站| 欧美精品一区在线观看| 欧美日韩电影在线| 一本色道亚洲精品aⅴ| 国产成人亚洲精品狼色在线| 日韩国产在线一| 亚洲影院免费观看| 椎名由奈av一区二区三区| 国产欧美一区视频| 久久久亚洲国产美女国产盗摄 | 不卡一区在线观看| 美女国产一区二区三区| 亚洲综合在线视频| 中文字幕亚洲精品在线观看 | 色综合色狠狠天天综合色| 久久99日本精品| 日韩不卡一区二区| 午夜国产不卡在线观看视频| 亚洲人成影院在线观看| 国产精品不卡在线| 国产亚洲欧美日韩日本| 久久婷婷综合激情| 久久亚洲一区二区三区四区| 精品国内二区三区| 久久毛片高清国产| xfplay精品久久| 久久精品夜夜夜夜久久| 精品福利视频一区二区三区| 日韩欧美国产精品| 精品国产第一区二区三区观看体验 | 94-欧美-setu| 97精品超碰一区二区三区| 亚洲线精品一区二区三区八戒| 亚洲精品国产精品乱码不99 | 久久午夜电影网| 99精品热视频| 一本久久精品一区二区| 91麻豆6部合集magnet| 免费观看在线综合色| 男女激情视频一区| 麻豆传媒一区二区三区| 精品一区二区三区在线观看国产| 麻豆精品在线看| 国产一区激情在线| 成人午夜av电影| 在线看国产一区| 精品一区二区精品| 国产91精品一区二区麻豆网站| 成人午夜大片免费观看| 91啪亚洲精品| 欧美日韩日日骚| 欧美成人福利视频| 国产精品护士白丝一区av| 日韩一区有码在线| 亚洲 欧美综合在线网络| 日本欧美一区二区三区| 国产福利一区在线观看| 日韩影视精彩在线| 国产乱妇无码大片在线观看| 91在线视频网址| 欧美高清你懂得| 久久精品一区二区三区四区| 亚洲视频免费看| 奇米在线7777在线精品| 成人一区二区三区视频| 欧洲一区二区三区在线| 3751色影院一区二区三区| 久久蜜桃一区二区| 亚洲欧美激情一区二区| 免费xxxx性欧美18vr| 成人av网站免费| 9191国产精品| 中文字幕在线播放不卡一区| 日韩精品久久久久久| 风间由美性色一区二区三区| 欧美日韩一二三| 欧美国产欧美综合| 日本中文字幕一区二区视频| 成人理论电影网| 8x8x8国产精品| 国产精品剧情在线亚洲| 青青草视频一区| 色婷婷亚洲精品| 久久精品一区四区| 日韩在线一区二区| 色成人在线视频| 久久精品亚洲精品国产欧美| 亚洲一区二区美女| 99久久国产综合精品麻豆| 精品国产一区二区精华| 亚洲精品视频在线观看免费| 国内偷窥港台综合视频在线播放| 欧美亚洲国产一卡| 中文字幕视频一区| 国模娜娜一区二区三区| 欧美福利视频导航| 亚洲欧美一区二区久久 | 成人av第一页| 精品粉嫩超白一线天av| 日韩高清不卡一区二区| 色呦呦网站一区| 中文字幕中文字幕一区二区| 久久精品999| 7878成人国产在线观看| 亚洲精品免费播放| 成人av在线看| 国产日韩av一区二区| 国产在线精品一区二区| 91精品国产综合久久精品性色| 亚洲成a人片在线不卡一二三区 | 麻豆成人av在线| 666欧美在线视频| 五月激情丁香一区二区三区| 91福利视频在线| 欧美日韩精品一区二区在线播放| 亚洲精品视频免费观看| 91美女蜜桃在线| 亚洲少妇最新在线视频| 91浏览器在线视频| 亚洲免费观看高清完整版在线观看熊| 成人短视频下载| 亚洲视频你懂的| 欧美午夜精品理论片a级按摩| 亚洲一区二区三区影院| 91久久久免费一区二区| 亚洲最新视频在线观看| 欧美中文字幕一区| 日韩精品电影在线| 日韩一级成人av| 精品制服美女丁香| 久久免费视频一区| 国产不卡在线一区| 1000精品久久久久久久久| 91在线视频观看| 亚洲综合视频在线| 4438亚洲最大| 国模一区二区三区白浆| 欧美激情中文字幕一区二区| 成人h动漫精品| 亚洲成av人片在www色猫咪| 欧美日韩国产一区二区三区地区| 日本一区中文字幕| 精品999在线播放| 国产成人精品亚洲777人妖| 中文字幕亚洲一区二区va在线| 91性感美女视频| 日本sm残虐另类| 久久久精品天堂| 色妹子一区二区| 蜜桃av一区二区三区| 国产偷国产偷精品高清尤物 | 午夜视频在线观看一区二区| 日韩一区二区在线看| 风间由美一区二区三区在线观看 | 精品免费视频.| 99久久精品免费看国产免费软件|