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

  • 相关阅读:
    minio 注意事项
    vim编辑器的快捷命令
    kubernetes Label的增删改查
    JVM java堆内存
    navicat注册机
    hibernate学习笔记_基础配置
    Hibernate学习笔记_helloworld
    junit4初级
    Struts学习笔记_声明式异常处理
    Struts学习笔记_拦截器
  • 原文地址:https://www.cnblogs.com/hjblog/p/1877782.html
Copyright © 2011-2022 走看看