c++关于局域网,路由器。
2017-09-29 09:37
330 查看
重启路由器:qt5.8
#include <stdio.h>
#include <winsock2.h>
#include <QDebug>
#pragma comment( lib , "ws2_32" )
int main()
{
char Fs[1000];
char Js[1000];
WSADATA wsadata;
SOCKET Socket;
SOCKADDR_IN Local, to;
{
WSAStartup( 0x0202, &wsadata );
}
Socket = socket( AF_INET, SOCK_STREAM, 0 );
if (!Socket)
{
return -1;
}
Local.sin_family = AF_INET;
Local.sin_port = htons(102);
Local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
to.sin_family = AF_INET;
to.sin_port = htons(80);
to.sin_addr.S_un.S_addr = inet_addr("192.168.1.1");
if (bind(Socket, (SOCKADDR*)&Local, sizeof(Local)) == SOCKET_ERROR)
{
return -1;
}
if (connect(Socket, (SOCKADDR*)&to, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
return -1;
}
{
memset(Fs, 0, 1000);
memset(Js, 0, 1000);
strcpy(Fs, "GET /userRpm/SysRebootRpm.htm?Reboot=%D6%D8%C6%F4%C2%B7%D3%C9%C6%F7 HTTP/1.1\r\n" );
strcat(Fs, "Host: 192.168.1.1\r\n" );
strcat(Fs, "Authorization: Basic YWRtaW46YWRtaW4=\r\n" );
strcat(Fs, "\r\n");
}
if (send(Socket, Fs, strlen(Fs), 0) == SOCKET_ERROR)
{
return -1;
}
closesocket(Socket);
WSACleanup();
qDebug()<<"sssss";
return 0;
}c++获取路由表:
// libnet.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <Iphlpapi.h>
#pragma comment(lib, "Iphlpapi.lib")
#pragma comment(lib, "WS2_32.lib")
PMIB_IPFORWARDTABLE MyGetIpForwardTable(BOOL bOrder);
void MyFreeIpForwardTable(PMIB_IPFORWARDTABLE pIpRouteTab);
void PrintIpForwardTable();
int main()
{
PrintIpForwardTable();
getchar();
return 0;
}
void PrintIpForwardTable()
{
PMIB_IPFORWARDTABLE pIpRouteTable = MyGetIpForwardTable(TRUE);
if (pIpRouteTable != NULL)
{
DWORD i, dwCurrIndex;
struct in_addr inadDest;
struct in_addr inadMask;
struct in_addr inadGateway;
PMIB_IPADDRTABLE pIpAddrTable = NULL;
char szDestIp[128];
char szMaskIp[128];
char szGatewayIp[128];
printf("Active Routes:\n\n");
printf(" Network Address Netmask Gateway Address Interface Metric\n");
for (i = 0; i < pIpRouteTable->dwNumEntries; i++)
{
dwCurrIndex = pIpRouteTable->table[i].dwForwardIfIndex;
// 目的地址
inadDest.s_addr = pIpRouteTable->table[i].dwForwardDest;
// 子网掩码
inadMask.s_addr = pIpRouteTable->table[i].dwForwardMask;
// 网关地址
inadGateway.s_addr = pIpRouteTable->table[i].dwForwardNextHop;
strcpy(szDestIp, inet_ntoa(inadDest));
strcpy(szMaskIp, inet_ntoa(inadMask));
strcpy(szGatewayIp, inet_ntoa(inadGateway));
printf(" %15s %16s %16s %16d %7d\n",
szDestIp,
szMaskIp,
szGatewayIp,
pIpRouteTable->table[i].dwForwardIfIndex, // 可以在此调用GetIpAddrTable获取索引对应的IP地址
pIpRouteTable->table[i].dwForwardMetric1);
}
MyFreeIpForwardTable(pIpRouteTable);
}
}
PMIB_IPFORWARDTABLE MyGetIpForwardTable(BOOL bOrder)
{
PMIB_IPFORWARDTABLE pIpRouteTab = NULL;
DWORD dwActualSize = 0;
// 查询所需缓冲区的大小
if (::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == ERROR_INSUFFICIENT_BUFFER)
{
// 为MIB_IPFORWARDTABLE结构申请内存
pIpRouteTab = (PMIB_IPFORWARDTABLE)::GlobalAlloc(GPTR, dwActualSize);
// 获取路由表
if (::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == NO_ERROR)
return pIpRouteTab;
::GlobalFree(pIpRouteTab);
}
return NULL;
}
void MyFreeIpForwardTable(PMIB_IPFORWARDTABLE pIpRouteTab)
{
if (pIpRouteTab != NULL)
::GlobalFree(pIpRouteTab);
}本机流量监控类:
MFNetTraffic.h
#ifndef MFNetTraffic_H
#define MFNetTraffic_H
#if !defined(AFX_MFNETTRAFFIC_H__9CA9C41F_F929_4F26_BD1F_2B5827090494__INCLUDED_)
#define AFX_MFNETTRAFFIC_H__9CA9C41F_F929_4F26_BD1F_2B5827090494__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <afxtempl.h>
class MFNetTraffic
{
public:
enum TrafficType //流量类型
{
AllTraffic = 388,//总的流量
IncomingTraffic = 264,//输入流量
OutGoingTraffic = 506 //输出流量
};
void SetTrafficType(int trafficType); //设置流量类型
DWORD GetInterfaceTotalTraffic(int index); //得到index索引接口的总流量
BOOL GetNetworkInterfaceName(CString *InterfaceName, int index);//得到网络接口名字
int GetNetworkInterfacesCount(); //得到接口的数目
double GetTraffic(int interfaceNumber); //得到流量
DWORD GetInterfaceBandwidth(int index); //得到index索引接口的带宽
MFNetTraffic();
virtual ~MFNetTraffic();
private:
BOOL GetInterfaces();
double lasttraffic;
CStringList Interfac
4000
es;
CList < DWORD, DWORD &> Bandwidths; //带宽
CList < DWORD, DWORD &> TotalTraffics;//总的流量
int CurrentInterface;
int CurrentTrafficType;
};
#endif // !defined(AFX_MFNETTRAFFIC_H__9CA9C41F_F929_4F26_BD1F_2B5827090494__INCLUDED_)
#endif // CARMODEL_HMFNetTraffic.cpp
#include <stdio.h>
#include <winsock2.h>
#include <QDebug>
#pragma comment( lib , "ws2_32" )
int main()
{
char Fs[1000];
char Js[1000];
WSADATA wsadata;
SOCKET Socket;
SOCKADDR_IN Local, to;
{
WSAStartup( 0x0202, &wsadata );
}
Socket = socket( AF_INET, SOCK_STREAM, 0 );
if (!Socket)
{
return -1;
}
Local.sin_family = AF_INET;
Local.sin_port = htons(102);
Local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
to.sin_family = AF_INET;
to.sin_port = htons(80);
to.sin_addr.S_un.S_addr = inet_addr("192.168.1.1");
if (bind(Socket, (SOCKADDR*)&Local, sizeof(Local)) == SOCKET_ERROR)
{
return -1;
}
if (connect(Socket, (SOCKADDR*)&to, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
return -1;
}
{
memset(Fs, 0, 1000);
memset(Js, 0, 1000);
strcpy(Fs, "GET /userRpm/SysRebootRpm.htm?Reboot=%D6%D8%C6%F4%C2%B7%D3%C9%C6%F7 HTTP/1.1\r\n" );
strcat(Fs, "Host: 192.168.1.1\r\n" );
strcat(Fs, "Authorization: Basic YWRtaW46YWRtaW4=\r\n" );
strcat(Fs, "\r\n");
}
if (send(Socket, Fs, strlen(Fs), 0) == SOCKET_ERROR)
{
return -1;
}
closesocket(Socket);
WSACleanup();
qDebug()<<"sssss";
return 0;
}c++获取路由表:
// libnet.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <Iphlpapi.h>
#pragma comment(lib, "Iphlpapi.lib")
#pragma comment(lib, "WS2_32.lib")
PMIB_IPFORWARDTABLE MyGetIpForwardTable(BOOL bOrder);
void MyFreeIpForwardTable(PMIB_IPFORWARDTABLE pIpRouteTab);
void PrintIpForwardTable();
int main()
{
PrintIpForwardTable();
getchar();
return 0;
}
void PrintIpForwardTable()
{
PMIB_IPFORWARDTABLE pIpRouteTable = MyGetIpForwardTable(TRUE);
if (pIpRouteTable != NULL)
{
DWORD i, dwCurrIndex;
struct in_addr inadDest;
struct in_addr inadMask;
struct in_addr inadGateway;
PMIB_IPADDRTABLE pIpAddrTable = NULL;
char szDestIp[128];
char szMaskIp[128];
char szGatewayIp[128];
printf("Active Routes:\n\n");
printf(" Network Address Netmask Gateway Address Interface Metric\n");
for (i = 0; i < pIpRouteTable->dwNumEntries; i++)
{
dwCurrIndex = pIpRouteTable->table[i].dwForwardIfIndex;
// 目的地址
inadDest.s_addr = pIpRouteTable->table[i].dwForwardDest;
// 子网掩码
inadMask.s_addr = pIpRouteTable->table[i].dwForwardMask;
// 网关地址
inadGateway.s_addr = pIpRouteTable->table[i].dwForwardNextHop;
strcpy(szDestIp, inet_ntoa(inadDest));
strcpy(szMaskIp, inet_ntoa(inadMask));
strcpy(szGatewayIp, inet_ntoa(inadGateway));
printf(" %15s %16s %16s %16d %7d\n",
szDestIp,
szMaskIp,
szGatewayIp,
pIpRouteTable->table[i].dwForwardIfIndex, // 可以在此调用GetIpAddrTable获取索引对应的IP地址
pIpRouteTable->table[i].dwForwardMetric1);
}
MyFreeIpForwardTable(pIpRouteTable);
}
}
PMIB_IPFORWARDTABLE MyGetIpForwardTable(BOOL bOrder)
{
PMIB_IPFORWARDTABLE pIpRouteTab = NULL;
DWORD dwActualSize = 0;
// 查询所需缓冲区的大小
if (::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == ERROR_INSUFFICIENT_BUFFER)
{
// 为MIB_IPFORWARDTABLE结构申请内存
pIpRouteTab = (PMIB_IPFORWARDTABLE)::GlobalAlloc(GPTR, dwActualSize);
// 获取路由表
if (::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == NO_ERROR)
return pIpRouteTab;
::GlobalFree(pIpRouteTab);
}
return NULL;
}
void MyFreeIpForwardTable(PMIB_IPFORWARDTABLE pIpRouteTab)
{
if (pIpRouteTab != NULL)
::GlobalFree(pIpRouteTab);
}本机流量监控类:
MFNetTraffic.h
#ifndef MFNetTraffic_H
#define MFNetTraffic_H
#if !defined(AFX_MFNETTRAFFIC_H__9CA9C41F_F929_4F26_BD1F_2B5827090494__INCLUDED_)
#define AFX_MFNETTRAFFIC_H__9CA9C41F_F929_4F26_BD1F_2B5827090494__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <afxtempl.h>
class MFNetTraffic
{
public:
enum TrafficType //流量类型
{
AllTraffic = 388,//总的流量
IncomingTraffic = 264,//输入流量
OutGoingTraffic = 506 //输出流量
};
void SetTrafficType(int trafficType); //设置流量类型
DWORD GetInterfaceTotalTraffic(int index); //得到index索引接口的总流量
BOOL GetNetworkInterfaceName(CString *InterfaceName, int index);//得到网络接口名字
int GetNetworkInterfacesCount(); //得到接口的数目
double GetTraffic(int interfaceNumber); //得到流量
DWORD GetInterfaceBandwidth(int index); //得到index索引接口的带宽
MFNetTraffic();
virtual ~MFNetTraffic();
private:
BOOL GetInterfaces();
double lasttraffic;
CStringList Interfac
4000
es;
CList < DWORD, DWORD &> Bandwidths; //带宽
CList < DWORD, DWORD &> TotalTraffics;//总的流量
int CurrentInterface;
int CurrentTrafficType;
};
#endif // !defined(AFX_MFNETTRAFFIC_H__9CA9C41F_F929_4F26_BD1F_2B5827090494__INCLUDED_)
#endif // CARMODEL_HMFNetTraffic.cpp
#include "stdafx.h" #include "MFNetTraffic.h" #include "float.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[] = __FILE__; #define new DEBUG_NEW #endif #include "winperf.h" MFNetTraffic::MFNetTraffic() { lasttraffic = 0.0; CurrentInterface = -1; CurrentTrafficType = AllTraffic; GetInterfaces(); } MFNetTraffic::~MFNetTraffic() { } PERF_OBJECT_TYPE *FirstObject(PERF_DATA_BLOCK *dataBlock) { return (PERF_OBJECT_TYPE *)((BYTE *)dataBlock + dataBlock->HeaderLength); } PERF_OBJECT_TYPE *NextObject(PERF_OBJECT_TYPE *act) { return (PERF_OBJECT_TYPE *)((BYTE *)act + act->TotalByteLength); } PERF_COUNTER_DEFINITION *FirstCounter(PERF_OBJECT_TYPE *perfObject) { return (PERF_COUNTER_DEFINITION *)((BYTE *)perfObject + perfObject->HeaderLength); } PERF_COUNTER_DEFINITION *NextCounter(PERF_COUNTER_DEFINITION *perfCounter) { return (PERF_COUNTER_DEFINITION *)((BYTE *)perfCounter + perfCounter->ByteLength); } PERF_COUNTER_BLOCK *GetCounterBlock(PERF_INSTANCE_DEFINITION *pInstance) { return (PERF_COUNTER_BLOCK *)((BYTE *)pInstance + pInstance->ByteLength); } PERF_INSTANCE_DEFINITION *FirstInstance(PERF_OBJECT_TYPE *pObject) { return (PERF_INSTANCE_DEFINITION *)((BYTE *)pObject + pObject->DefinitionLength); } PERF_INSTANCE_DEFINITION *NextInstance(PERF_INSTANCE_DEFINITION *pInstance) { PERF_COUNTER_BLOCK *pCtrBlk = GetCounterBlock(pInstance); return (PERF_INSTANCE_DEFINITION *)((BYTE *)pInstance + pInstance->ByteLength + pCtrBlk->ByteLength); } char *WideToMulti(wchar_t *source, char *dest, int size) { WideCharToMultiByte(CP_ACP, 0, source, -1, dest, size, 0, 0); return dest; } //得到接口号为interfaceNumber的接口流量 double MFNetTraffic::GetTraffic(int interfaceNumber) { try { #define DEFAULT_BUFFER_SIZE 40960L POSITION pos; CString InterfaceName; pos = Interfaces.FindIndex(interfaceNumber); if (pos == NULL) return 0.0; //得到当前的接口名字 InterfaceName = Interfaces.GetAt(pos); //为性能数据缓冲 unsigned char *data = new unsigned char[DEFAULT_BUFFER_SIZE]; // 从RegQueryValueEx返回的值:本例中忽略改变量 DWORD type; // 缓冲的尺寸 DWORD size = DEFAULT_BUFFER_SIZE; // RegQueryValueEx返回的值 DWORD ret; // 从网络对象(索引是510)查询性能数据 while ((ret = RegQueryValueEx(HKEY_PERFORMANCE_DATA, L"510", NULL, &type, data, &size)) != ERROR_SUCCESS) { if (ret == ERROR_MORE_DATA) { // 缓冲尺寸太小,增加内存分配 size += DEFAULT_BUFFER_SIZE; delete[] data; data = new unsigned char[size]; } else { // 未定义的错误 return 1; } } //性能数据块 PERF_DATA_BLOCK *dataBlockPtr = (PERF_DATA_BLOCK *)data; //枚举链表中第一个对象 PERF_OBJECT_TYPE *objectPtr = FirstObject(dataBlockPtr); //遍历链表 for (int a = 0; a<(int)dataBlockPtr->NumObjectTypes; a++) { char nameBuffer[255]; // 判断是否是网络对象索引号是510 if (objectPtr->ObjectNameTitleIndex == 510) { // 偏移变量 DWORD processIdOffset = ULONG_MAX; // 找到第一个计数器 PERF_COUNTER_DEFINITION *counterPtr = FirstCounter(objectPtr); // 遍历链表 for (int b = 0; b<(int)objectPtr->NumCounters; b++) { // 判断接收的数据类型是否是我们需要的 if ((int)counterPtr->CounterNameTitleIndex == CurrentTrafficType) processIdOffset = counterPtr->CounterOffset; // 下一个计数器 counterPtr = NextCounter(counterPtr); } //数据类型不是我们需要的 if (processIdOffset == ULONG_MAX) { delete[] data; return 1; } // 找到第一个实列(instance) PERF_INSTANCE_DEFINITION *instancePtr = FirstInstance(objectPtr); DWORD fullTraffic; DWORD traffic; //遍历整个实列 for (int b = 0; b<objectPtr->NumInstances; b++) { wchar_t *namePtr = (wchar_t *)((BYTE *)instancePtr + instancePtr->NameOffset); // 得到这个实列的PERF_COUNTER_BLOCK PERF_COUNTER_BLOCK *counterBlockPtr = GetCounterBlock(instancePtr); // 现在我们得到了接口的名字 char *pName = WideToMulti(namePtr, nameBuffer, sizeof(nameBuffer)); CString iName; wchar_t str_s[20] = { L"%s" }; iName.Format(str_s, pName); POSITION pos = TotalTraffics.FindIndex(b); if (pos != NULL) { fullTraffic = *((DWORD *)((BYTE *)counterBlockPtr + processIdOffset)); TotalTraffics.SetAt(pos, fullTraffic); } // 如果当前的接口就是我们选择的接口 if (InterfaceName == iName) { traffic = *((DWORD *)((BYTE *)counterBlockPtr + processIdOffset)); double acttraffic = (double)traffic; double trafficdelta; // 判断处理的接口是否是新的 if (CurrentInterface != interfaceNumber) { lasttraffic = acttraffic; trafficdelta = 0.0; CurrentInterface = interfaceNumber; } else { trafficdelta = acttraffic - lasttraffic; lasttraffic = acttraffic; } delete[] data; return(trafficdelta); } //下一个实列 instancePtr = NextInstance(instancePtr); } } // 下一个对象 objectPtr = NextObject(objectPtr); } delete[] data; return 0; } catch (...) { return 0; } } //枚举安装的接口 BOOL MFNetTraffic::GetInterfaces() { try { #define DEFAULT_BUFFER_SIZE 40960L Interfaces.RemoveAll(); unsigned char *data = (unsigned char*)malloc(DEFAULT_BUFFER_SIZE); DWORD type; DWORD size = DEFAULT_BUFFER_SIZE; DWORD ret; char s_key[4096]; sprintf(s_key, "%d", 510); WCHAR wszClassName[256] = { 0 };//定义宽字符缓冲区 memset(wszClassName, 0, sizeof(wszClassName)); MultiByteToWideChar(CP_ACP, 0, s_key, strlen(s_key) + 1, wszClassName, sizeof(wszClassName) / sizeof(wszClassName[0])); //RegQueryValueEx的固定调用格式 while ((ret = RegQueryValueEx(HKEY_PERFORMANCE_DATA, wszClassName, 0, &type, data, &size)) != ERROR_SUCCESS) { while (ret == ERROR_MORE_DATA) { size += DEFAULT_BUFFER_SIZE; data = (unsigned char*)realloc(data, size); } if (ret != ERROR_SUCCESS) { return FALSE; } } //得到数据块 PERF_DATA_BLOCK *dataBlockPtr = (PERF_DATA_BLOCK *)data; //得到第一个对象 PERF_OBJECT_TYPE *objectPtr = FirstObject(dataBlockPtr); for (int a = 0; a<(int)dataBlockPtr->NumObjectTypes; a++) { char nameBuffer[255]; if (objectPtr->ObjectNameTitleIndex == 510) { DWORD processIdOffset = ULONG_MAX; PERF_COUNTER_DEFINITION *counterPtr = FirstCounter(objectPtr); for (int b = 0; b<(int)objectPtr->NumCounters; b++) { if (counterPtr->CounterNameTitleIndex == 520) processIdOffset = counterPtr->CounterOffset; counterPtr = NextCounter(counterPtr); } if (processIdOffset == ULONG_MAX) { free(data); return 1; } PERF_INSTANCE_DEFINITION *instancePtr = FirstInstance(objectPtr); for (int b = 0; b<objectPtr->NumInstances; b++) { wchar_t *namePtr = (wchar_t *)((BYTE *)instancePtr + instancePtr->NameOffset); PERF_COUNTER_BLOCK *counterBlockPtr = GetCounterBlock(instancePtr); char *pName = WideToMulti(namePtr, nameBuffer, sizeof(nameBuffer)); DWORD bandwith = *((DWORD *)((BYTE *)counterBlockPtr + processIdOffset)); DWORD tottraff = 0; Interfaces.AddTail(CString(pName)); Bandwidths.AddTail(bandwith); TotalTraffics.AddTail(tottraff); instancePtr = NextInstance(instancePtr); } } objectPtr = NextObject(objectPtr); } free(data); return TRUE; } catch (...) { return FALSE; } } //返回安装的接口数 int MFNetTraffic::GetNetworkInterfacesCount() { return Interfaces.GetCount() - 1; } //返回接口名称 BOOL MFNetTraffic::GetNetworkInterfaceName(CString *InterfaceName, int index) { POSITION pos = Interfaces.FindIndex(index); if (pos == NULL) return FALSE; wchar_t strname[20] = {L"%s"}; InterfaceName->Format(strname, Interfaces.GetAt(pos)); return TRUE; } //返回接口带宽 DWORD MFNetTraffic::GetInterfaceBandwidth(int index) { POSITION pos = Bandwidths.FindIndex(index); if (pos == NULL) return 0; else return Bandwidths.GetAt(pos) / 8; } //具体接口接收和发送的数据量 DWORD MFNetTraffic::GetInterfaceTotalTraffic(int index) { DWORD totaltraffic = 0; POSITION pos; pos = TotalTraffics.FindIndex(index); if (pos != NULL) { totaltraffic = TotalTraffics.GetAt(pos); if (totaltraffic == 0.0) { GetTraffic(index); pos = TotalTraffics.FindIndex(index); if (pos != NULL) { totaltraffic = TotalTraffics.GetAt(pos); } } } return(totaltraffic); } void MFNetTraffic::SetTrafficType(int trafficType) { CurrentTrafficType = trafficType; }
相关文章推荐
- 关于两台路由器建立局域网
- 关于部分局域网上网用户和通过路由器用户 无法使用VPDN网上申报的临时解决方法
- C++关于参数为const引用类型的函数调用参数成员函数的一个问题
- 关于c++的class(继承、重载、隐藏)
- 实用程序软件包(关于使用静态函数报错问题“Static function declared but not defined in C+++ "eh.h is only for C++!"报错问题)
- c++里关于cerr,clog,cout三者的区别
- 关于C++中的前置声明(1)
- 关于C++的一些小知识点
- 关于C++里面使用set_union,set_intersection等函数的使用总结
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 关于c c++ .h .cpp .c
- C/C++中关于__int64与long long 的区别
- 关于C++中的指针应用
- 关于C++思考
- C/C++拾遗录--查看关于_declspec(naked)与普通的函数在寄存器变化方面的不同点
- 关于学C++的50条建议
- COM 打通 C++ 和 C# 关于 COM 组件互相调用的任督二脉 (转)
- 关于C++中文字符的处理
- 关于C/C++中的trigraph,类似"??!"