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等。

  • 相关阅读:
    leetCode 移动零 问题记录
    leetCode 加一 问题记录
    leetCode 两个数组的交集 II 问题记录
    leetCode 只出现一次的数字 问题记录
    leetCode 旋转数组 问题记录
    将本地项目上传到git
    RabbitMQ Linux 安装教程
    springboot RabbitMQ 配置
    linux——mysql5.5 安装遇到问题总结&解决方式
    Js预编译 GO和AO活动对象
  • 原文地址:https://www.cnblogs.com/hjblog/p/1877782.html
Copyright © 2011-2022 走看看