C++实现wifi共享(本地网卡共享虚拟网卡)(1)

//当然看这篇文章之前你要实现虚拟网卡的启动功能,这个功能的实现有很多,我就不贴这个代码了
//下面就来实现怎么把本地网卡共享给虚拟网卡,让虚拟网卡发出热点。让手机也能连接上网、
//1.现在相关头文件和链接(注意:不要在VC6.0版本测试,因为VC6.0不包含下面的部分头文件和链接)
//推荐使用(VS2010-vs2013版本,还有win7-win8.1系统)
//以下的代码可以直接复制到项目中,文字的地方已经被注释了,方便复制代码
//由于时间的问题,先写了寻找网卡的代码,
//等有时间待续。
#include <NetCon.h>
#include <locale>
#pragma comment(lib,"Iphlpapi.lib")
#pragma comment(lib,"Rpcrt4.lib")//GUID
//启用、禁用网卡
#pragma comment(lib,"ole32.lib")//CoCreateInstance函数需要

//2.声明相关的变量和赋初值,以下代码直接可以复制到main函数里面
 INetConnectionManager *pManager=NULL;
 INetConnection *pConnection=NULL;
 IEnumNetConnection *pEnum=NULL;
 ULONG           celt;
 INetSharingManager *pNetSharingManager=NULL;
 INetConnectionProps *pProps=NULL;
 INetSharingConfiguration *pConfiguration=NULL;
 NETCON_PROPERTIES*   Nproperties=NULL;

//3.
CoInitialize(NULL);//初始化COM库
//扩展知识:用来告诉 Windows以单线程的方式创建com对象,CoInitialize和CoUninitialize必须成对使用。
CoCreateInstance(CLSID_ConnectionManager, NULL, CLSCTX_SERVER, IID_INetConnectionManager, (void**)&pManager);//创建一个com对象
//CLSID_ConnectionManager是创建的Com对象的类标识符(CLSID)
//IID_INetConnectionManager是创建的Com对象的接口标识符
//最后一个参数是用来接收指向Com对象接口地址的指针变量

//4.前面的都准备后了,接下来就是实现的代码了。
//先做一下是否成功创建了com对象
         if(pManager == NULL)
 {
  printf("产生异常,创建失败,Error:%d\n",GetLastError());
  return 0;
 }
       
//接下来先看看一个函数的解释:
/*
 virtual HRESULT STDMETHODCALLTYPE EnumConnections( 
            [in]  NETCONMGR_ENUM_FLAGS Flags,
            [out]  __RPC__deref_out_opt IEnumNetConnection **ppEnum)
其中:  第一个参数可以有以下的参数选择、
        NCME_DEFAULT = 0,
 NCME_HIDDEN = 0x1

*/
       pManager->EnumConnections(NCME_DEFAULT, &pEnum);//开始枚举网卡

       while(  pEnum->Next(1, &pConnection, &celt) == S_OK )
 {  
/*
条件会返回2个值,分别是S_OK,S_FALSE
#define S_OK                                   ((HRESULT)0L)
#define S_FALSE                                ((HRESULT)1L)
*/

  pConnection->GetProperties(&NNproperties);
  
  if(NNproperties->Status == NCS_CONNECTED)//查询连接状态的网卡
  {
   wprintf(L"%s\n",Nproperties->pszwDeviceName);//pszwDeviceName储存着网卡的驱动名字
         }
  if(NNproperties->Status == NCS_DISCONNECTING)//查询断开连接状态的网卡
  {
   wprintf(L"%s\n",Nproperties->pszwDeviceName);
  }
 /*
        其中状态值有下面的值:
 NCS_DISCONNECTED = 0,
 NCS_CONNECTING = ( NCS_DISCONNECTED + 1 ) ,
 NCS_CONNECTED = ( NCS_CONNECTING + 1 ) ,
 NCS_DISCONNECTING = ( NCS_CONNECTED + 1 ) ,
 NCS_HARDWARE_NOT_PRESENT = ( NCS_DISCONNECTING + 1 ) ,
 NCS_HARDWARE_DISABLED = ( NCS_HARDWARE_NOT_PRESENT + 1 ) ,
 NCS_HARDWARE_MALFUNCTION = ( NCS_HARDWARE_DISABLED + 1 ) ,
 NCS_MEDIA_DISCONNECTED = ( NCS_HARDWARE_MALFUNCTION + 1 ) ,
 NCS_AUTHENTICATING = ( NCS_MEDIA_DISCONNECTED + 1 ) ,
 NCS_AUTHENTICATION_SUCCEEDED = ( NCS_AUTHENTICATING + 1 ) ,
 NCS_AUTHENTICATION_FAILED = ( NCS_AUTHENTICATION_SUCCEEDED + 1 ) ,
 NCS_INVALID_ADDRESS = ( NCS_AUTHENTICATION_FAILED + 1 ) ,
 NCS_CREDENTIALS_REQUIRED = ( NCS_INVALID_ADDRESS + 1 )
    NETCON_STATUS;
 */
  
      }

//最后就是结束程序后的工作了,如果写在了一个类里面,直接可以把下面的代码放在斥构函数里面
        if(pManager) pManager->Release();
 if(pConnection) pConnection->Release();
 if(pEnum) pEnum->Release();
 if(pNetSharingManager) pNetSharingManager->Release();
 if(pConfiguration) pConfiguration->Release();
 CoUninitialize();//记得添加
//待续

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: python 与 c 可以通过 ctypes 模块来实现内存共享。 下面是一个简单的例子: 首先,我们在 c 中定义一个函数,它接受一个整数指针和一个整数作为参数,并将整数加 1: ``` void add_one(int *x, int n) { for (int i = 0; i < n; i++) { x[i] += 1; } } ``` 然后我们可以使用 python 的 ctypes 模块来调用这个函数: ``` import ctypes # 加载动态链接库 lib = ctypes.cdll.LoadLibrary('./libfoo.so') # 定义参数类型 lib.add_one.argtypes = [ctypes.POINTER(ctypes.c_int), ctypes.c_int] # 创建一个整数数组,并将其转换为 c_int 类型的指针 arr = [1, 2, 3, 4] arr_p = (ctypes.c_int * len(arr))(*arr) arr_p = ctypes.cast(arr_p, ctypes.POINTER(ctypes.c_int)) # 调用 add_one 函数 lib.add_one(arr_p, len(arr)) # 打印修改后的数组 print(list(arr_p)) # 输出: [2, 3, 4, 5] ``` 这样,我们就在 python 中调用了 c 函数,并通过 ctypes 模块在 python 中使用 c 指针来实现内存共享。 ### 回答2: Python和C都是常见的编程语言,虽然在某些方面有所不同,但它们可以通过一些方法实现内存共享。 首先,Python可以通过ctypes库调用C语言编写的代码,这样就可以在Python中共享内存。例如,我们可以在C中创建一个包含一些数据的数组,并使用ctypes库将其传递给Python。Python可以直接访问该数组,实现内存共享。 另外,Python还可以使用共享内存模块multiprocessing.shared_memory实现与C的内存共享。该模块允许Python进程创建一个共享内存段,并将其传递给C进程,以便它们可以通过该共享内存进行通信。这种方法可以在Python和C之间高效地共享大量数据。 此外,Python还支持使用共享内存来实现多进程之间的内存共享。通过使用multiprocessing模块,Python进程可以创建一个共享内存对象,并将其传递给其他Python或C进程。这些进程可以通过该共享内存进行数据共享。 综上所述,Python和C可以通过使用ctypes库、共享内存模块multiprocessing.shared_memory或multiprocessing模块来实现内存共享。这些方法可以帮助Python与C之间有效地传递数据,以实现内存共享。 ### 回答3: Python与C可以通过共享内存进行通信和数据传输。在C语言中,我们可以使用共享内存区域,然后导出这个内存区域的标识符,使其可以被其他进程访问。然后,在Python中,我们可以通过ctypes模块来访问同样的内存区域。 下面是一个示例,展示了如何在Python和C之间实现内存共享: C代码: ```c #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #define SHM_SIZE 1024 int main() { key_t key; int shmid; char *data; // 创建共享内存 key = ftok(".", 'R'); shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666); // 连接到共享内存 data = shmat(shmid, NULL, 0); // 写入数据到共享内存 sprintf(data, "Hello from C"); // 断开与共享内存的连接 shmdt(data); return 0; } ``` Python代码: ```python import ctypes # 定义共享内存大小 SHM_SIZE = 1024 # 使用ctypes库加载C代码中的共享库 shared_library = ctypes.CDLL("./shared_library.so") # 创建共享内存 shared_library.create_shared_memory.argtypes = ctypes.c_int shared_library.create_shared_memory.restype = ctypes.c_void_p shm = shared_library.create_shared_memory(SHM_SIZE) # 连接到共享内存 shared_library.attach_to_shared_memory.argtypes = ctypes.c_void_p shared_library.attach_to_shared_memory.restype = ctypes.c_void_p data = ctypes.cast(shared_library.attach_to_shared_memory(shm), ctypes.POINTER(ctypes.c_char)) # 读取共享内存中的数据 print("Data from C:", data[:].decode()) # 断开与共享内存的连接 shared_library.detach_from_shared_memory.argtypes = ctypes.c_void_p shared_library.detach_from_shared_memory(data) ``` 上述代码在C端创建了一个大小为1024字节的共享内存区域,并向其中写入了数据。然后在Python端,我们使用ctypes库加载了C代码中的共享库,并对共享内存进行了连接和读取操作。 请注意,上述代码只是一个简单的示例,实际应用中需要注意共享内存的同步和互斥,以及异常处理等问题,以确保共享内存区域的正确访问和数据安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢吃一口烤肉的啵啵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值