ICS分享分为公有共享和私有共享,对应的类型为ICSSHARINGTYPE_PUBLIC和ICSSHARINGTYPE_PRIVATE。
ICS需要一个能够访问Internet的网卡(公用网络连接),一个用于局域网连接的网卡(一般为可做AP的无线网卡,专用网络连接)。
把访问Internet的网卡设为公有共享,用于局域网的网卡设为私有共享。当把专用网络进行连接PRIVATE共享后,它会自动和本机的公用网络连接进行关联,实现内部的ICS
共享。并且专用网络会被分配一个196.168.0.1的ip地址。
下面是MSDN的部分代码:
#include "stdafx.h" // as in winsock.h #define NAT_PROTOCOL_TCP 6 #define NAT_PROTOCOL_UDP 17
//首先初始化COM库,获取 INetSharingManager接口
CoInitialize (NULL); // init security to enum RAS connections CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); INetSharingManager * pNSM = NULL; HRESULT hr = ::CoCreateInstance (__uuidof(NetSharingManager), NULL, CLSCTX_ALL, __uuidof(INetSharingManager), (void**)&pNSM);//枚举从电脑中的网卡并从中找出一个想要作为公有共享的网络和想要作为私有共享的网络,
//关键的代码已用蓝色字体标出
INetSharingEveryConnectionCollection * pNSECC = NULL; HRESULT hr = pNSM->get_EnumEveryConnection (&pNSECC); if (!pNSECC) wprintf (L"failed to get EveryConnectionCollection!\r\n"); else { // enumerate connections IEnumVARIANT * pEV = NULL; IUnknown * pUnk = NULL; hr = pNSECC->get__NewEnum (&pUnk); if (pUnk) { hr = pUnk->QueryInterface (__uuidof(IEnumVARIANT), (void**)&pEV); pUnk->Release(); } if (pEV) { VARIANT v; VariantInit (&v); while (S_OK == pEV->Next (1, &v, NULL)) { if (V_VT (&v) == VT_UNKNOWN) { INetConnection * pNC = NULL; V_UNKNOWN (&v)->QueryInterface (__uuidof(INetConnection), (void**)&pNC); if (pNC) { INetConnectionProps * pNCP = NULL; pNSM->get_NetConnectionProps (pNC, &pNCP); if (!pNCP) wprintf (L"failed to get NetConnectionProps!\r\n"); else { BSTR strName, strDeviceName,strGuid; NETCON_MEDIATYPE mediaType; pNCP->get_Guid(&strGuid); pNCP->get_Name(&strName); pNCP->get_DeviceName(&strDeviceName); pNCP->get_MediaType(&mediaType); CString csDeviceName = strDeviceName; //strSelectedWanAdapterName为想要公有共享的网卡的设备名称 if(wcscmp(strDeviceName,strSelectedWanAdapterName) == 0) { // check properties for firewalled or shared connection DWORD dwCharacteristics = 0; pNCP->get_Characteristics (&dwCharacteristics); m_strPublicAdapterName = strDeviceName; NETCON_MEDIATYPE MediaType = NCM_NONE; pNCP->get_MediaType (&MediaType); if ((MediaType != NCM_SHAREDACCESSHOST_LAN) && (MediaType != NCM_SHAREDACCESSHOST_RAS) ) { // got a shared/firewalled connection INetSharingConfiguration * pNSC = NULL; NETCON_STATUS Status; pNCP->get_Status(&Status); hr = pNSM->get_INetSharingConfigurationForINetConnection (pNC, &pNSC); if (!pNSC) wprintf (L"can't make INetSharingConfiguration object!\r\n"); else { pNSC->EnableSharing(ICSSHARINGTYPE_PUBLIC); pNCP->get_Characteristics (&dwCharacteristics); pNSC->Release(); } } }//strSelectedLANAdapterName为想要私有共享的网卡的设备名称 else if(wcscmp(strDeviceName,strSelectedLANAdapterName) == 0) { DWORD dwCharacteristics = 0; pNCP->get_Characteristics (&dwCharacteristics); NETCON_MEDIATYPE MediaType = NCM_NONE; pNCP->get_MediaType (&MediaType); if ((MediaType != NCM_SHAREDACCESSHOST_LAN) && (MediaType != NCM_SHAREDACCESSHOST_RAS) ) { // got a shared/firewalled connection INetSharingConfiguration * pNSC = NULL; NETCON_STATUS Status; pNCP->get_Status(&Status); hr = pNSM->get_INetSharingConfigurationForINetConnection (pNC, &pNSC); if (!pNSC) wprintf (L"can't make INetSharingConfiguration object!\r\n"); else { pNSC->EnableSharing(ICSSHARINGTYPE_PRIVATE); pNCP->get_Characteristics (&dwCharacteristics); pNSC->Release(); } } } pNCP->Release(); } pNC->Release(); } } VariantClear (&v); } pEV->Release(); } pNSECC->Release(); }
参考文章:
http://hi.baidu.com/ritrachiao/item/bf7715e6bb8cb3a0c10d75be