zoukankan      html  css  js  c++  java
  • Windows Sockets2 提供者专用扩展机制

    服务提供商可以对winsock进行扩展。WSAIoctl函数使得服务提供商可以提供自己专用的特性扩展。应用程序如果要使用一个扩展函数,必须得到该扩展函数的地址,即函数指针。通过调用WSAIoctl函数并指定SIO_GET_EXTENSION_FUNCTION_POINTER控制代码和一个标示该函数的GUID值(InBuffer参数),在OutBuffer参数中就返回了该函数的地址。

    扩展函数的函数原型、GUID值以及详细调用信息由服务提供商负责提供,调用者不需要知道其实现细节。这使得对与同一个功能函数可以由多个服务提供商提供。

    mswsock.h中包含了微软对Windows Sockets Api的专有扩展(微软也是一个服务提供商啊)。下面代码详细演示了如何使用微软提供的扩展函数LPFN_DISCONNECTEX


    代码
    //1、取得函数指针

    void * mDisconnectExFunc;

    int loadDisconnectEx( SOCKET fd )

    {

         LPFN_DISCONNECTEX fnDisConnectEx 
    = NULL;

         GUID guidDisConnectEx 
    = WSAID_DISCONNECTEX;

         DWORD dwByte;

         ::WSAIoctl( fd, SIO_GET_EXTENSION_FUNCTION_POINTER,

                  
    &guidDisConnectEx, sizeof(guidDisConnectEx),

                  
    &fnDisConnectEx, sizeof(fnDisConnectEx),

                  
    &dwByte, NULL, NULL);

     

         mDisconnectExFunc 
    = fnDisConnectEx;

     

         
    return NULL != mDisconnectExFunc ? 0 : -1;

    }

    //2、调用

    LPFN_DISCONNECTEX fnDisConnectEx 
    = (LPFN_DISCONNECTEX)mDisconnectExFunc;

         
    if( NULL != fnDisConnectEx ) {

             
    return fnDisConnectEx( fd, lpOverlapped, dwFlags, reserved );
         }


    以上代码在xp以上系统中没必要那么麻烦,可以直接使用DisconnectEx函数。

    查看msdn只要是带有Ex后缀的都是微软专有扩展函数,如AcceptEx,ConnectEx等。

  • 相关阅读:
    《STL源码剖析》 stl_multimap.h [转]
    2007元旦粤北山区:英西峰林走廊,小赵州桥
    东师回忆录 之 二舍被拆记
    学生二三事
    2007元旦粤北山区:乳源大峡谷
    元旦粤北骑游计划
    通过配置php来屏蔽PHP错误
    什么是负载平衡
    ORACLE 日期函数大全
    linux 如何运行sh文件
  • 原文地址:https://www.cnblogs.com/hjblog/p/1877782.html
Copyright © 2011-2022 走看看