Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Net;
- using System.Runtime.InteropServices;
- namespace ks
- {
- static class workWithId
- {
- static byte[] parse(string s)
- {
- string[] forParse = s.Split('.');
- byte[] re = new byte[4];
- for (int i = 0; i < 4; i++)
- re[i] = Convert.ToByte(forParse[i]);
- return re;
- }
- static string reParse(byte[] b)
- {
- string re = "";
- for (int i = 0; i < b.Length; i++)
- {
- re += b[i].ToString();
- if (i <= b.Length - 1)
- re += '.';
- }
- return re;
- }
- public static string hostID(string ip, string mask)
- {
- byte[] bIp = parse(ip);
- byte[] bMask = parse(mask);
- byte[] bHost = new byte[4];
- for (int i = 0; i < 4; i++)
- {
- bHost[i] = (byte)((int)bIp[i] & (~(int)bMask[i]));
- }
- return reParse(bHost);
- }
- public static string networkID(string ip, string mask)
- {
- byte[] bIp = parse(ip);
- byte[] bMask = parse(mask);
- byte[] bNet = new byte[4];
- for (int i = 0; i < 4; i++)
- {
- bNet[i] = (byte)((int)bIp[i] & ((int)bMask[i]));
- }
- return reParse(bNet);
- }
- [DllImport("iphlpapi.dll", ExactSpelling = true)]
- public static extern int SendARP(int destIp, int srcIP, byte[] macAddr, ref uint physicalAddrLen);
- public static string convertIpToMAC(string ip)
- {
- IPAddress dst = IPAddress.Parse(ip);
- byte[] macAddr = new byte[6];
- uint macAddrLen = (uint)macAddr.Length;
- if (SendARP(BitConverter.ToInt32(dst.GetAddressBytes(), 0), 0, macAddr, ref macAddrLen) != 0)
- return "SendARP failed";
- string[] str = new string[(int)macAddrLen];
- for (int i = 0; i < macAddrLen; i++)
- str[i] = macAddr[i].ToString("x2");
- return string.Join(":", str);
- }
- public static void DoGetHostEntry(string hostname)
- {
- IPHostEntry host;
- host = Dns.GetHostEntry(hostname);
- Console.WriteLine("Hostname: {0}", host.HostName);
- Console.WriteLine("GetHostEntry({0}) returns:", hostname);
- foreach (IPAddress ip in host.AddressList)
- {
- Console.WriteLine(" {0}", ip);
- }
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- try
- {
- /* string id = Console.ReadLine();
- string mask = Console.ReadLine();
- Console.WriteLine(workWithId.networkID(id, mask) + " " + workWithId.hostID(id, mask));*/
- Console.WriteLine(workWithId.convertIpToMAC("192.168.100.14"));
- workWithId.DoGetHostEntry(Dns.GetHostName());
- workWithId.DoGetHostEntry("87.250.250.242");
- }
- catch (Exception e)
- {
- Console.WriteLine(e);
- }
- Console.ReadLine();
- }
- }
- }
- #include "stdafx.h"
- #include <winsock2.h>
- #include <iphlpapi.h>
- #include <icmpapi.h>
- //директива #include <iphlpapi.h> должна предшествовать #include <icmpapi.h>.
- #pragma comment(lib, "iphlpapi.lib")
- #pragma comment(lib, "ws2_32.lib")
- #define ADDR "87.250.250.242" //IP- адрес
- int main()
- {
- setlocale(0, "rus");
- HANDLE hIcmpFile = IcmpCreateFile();//получение манипулятора для выполнения ICMP-запросов. Возвращается манипулятор функцией IcmpCreateFile без параметров
- if (hIcmpFile == INVALID_HANDLE_VALUE)
- {
- cout << "\tНевозможно открыть дискриптор.\n";
- printf(" Ошибка IcmpCreatefile: %ld\n", WSAGetLastError());
- return 0;
- }
- unsigned long ipaddr = inet_addr(ADDR); // преобразование IP-адреса к сетевому формату
- char SendData[32] = "Data Buffer"; // данные эхо-запроса
- LPVOID ReplyBuffer = NULL; // данные эхо-ответа
- /*
- Создание буфера для эхо-ответа ReplyBuffer
- и выделяем для него память:
- */
- DWORD ReplySize = 0; // размер буфера эхо-ответа
- ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData); // Выделение памяти
- ReplyBuffer = (VOID*)malloc(ReplySize);
- if (ReplyBuffer == NULL)
- {
- cout << "\tНевозможно выделить память\n";
- return 0;
- }
- /*
- Третий шаг – отправка эхо-запросов.
- Используется функция IcmpSendEcho:
- */
- /*
- IcmpSendEcho отправляет ICMP эхо-запрос по указанному IP-адресу и возвращает любые ответы,
- полученные в пределах заданного тайм-аута (Timeout) и до исчерпания пространства буфера
- ReplyBuffer. Эта функция синхронна (то есть приостанавливает выполнение процесса до
- завершения своей работы), и во избежание блокировки процесс должен перед ее вызовом
- породить соответствующую нить.
- */
- DWORD dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData), NULL, ReplyBuffer, ReplySize, 1000);
- if (dwRetVal != 0)
- {
- PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
- struct in_addr ReplyAddr;
- ReplyAddr.S_un.S_addr = pEchoReply->Address;
- printf("\tПосылка icmp сообщения на %s\n", ADDR);
- if (dwRetVal> 1)
- {
- printf("\tПолучен %ldicmp ответ\n", dwRetVal);
- printf("\tИнформация:\n");
- }
- else
- {
- printf("\tПолучен %ld icmp ответ\n", dwRetVal);
- printf("\tИнформация:\n");
- }
- printf("\t\tПолучено от %s\n", inet_ntoa(ReplyAddr));
- printf("\t\tСтатус = %ld\n", pEchoReply->Status);
- printf("\t\tВремя отклика = %ld миллисекунд \n", pEchoReply->RoundTripTime);
- }
- else
- {
- printf("\tВызов IcmpSendEcho завершился с ошибкой.\n");
- printf("\tIcmpSendEcho ошибка: %ld\n", WSAGetLastError());
- return -1;
- }
- BOOL bRetVal;
- //освобождаем дескриптор
- bRetVal = IcmpCloseHandle(hIcmpFile);
- if (bRetVal)
- printf("\tHandle was closed\n");
- else
- printf("IcmpCloseHandle failed with error: %ld\n", WSAGetLastError());
- system("pause");
- return 0;
- }
- #include "stdafx.h"
- #include <winsock2.h>
- #include <iphlpapi.h>
- #include <iostream>
- #include <icmpapi.h>
- #include <conio.h>
- #pragma comment(lib, "iphlpapi.lib")
- #pragma comment(lib, "ws2_32.lib")
- using namespace std;
- #define IP_STATUS_BASE 11000
- #define IP_SUCCESS NULL
- #define IP_DEST_NET_UNREACHABLE 11002
- #define IP_DEST_HOST_UNREACHABLE 11003
- #define IP_DEST_PROT_UNREACHABLE 11004
- #define IP_DEST_PORT_UNREACHABLE 11005
- #define IP_REQ_TIMED_OUT 11010
- #define IP_BAD_REQ 11011
- #define IP_BAD_ROUTE 11012
- #define IP_TTL_EXPIRED_TRANSIT 11013
- void Ping(const char* cHost, unsigned int Timeout, unsigned int RequestCount)
- {
- // Создать файл сервиса
- HANDLE hIP = IcmpCreateFile();
- if (hIP == INVALID_HANDLE_VALUE)
- {
- WSACleanup();
- return;
- }
- char SendData[32] = "Data for ping"; //буфер для передачи
- int LostPacketsCount = NULL; // кол-во потерянных пакетов
- unsigned int MaxMS = NULL; // максимальное время ответа (мс)
- int MinMS = -1; // минимальное время ответа (мс)
- // Выделяем память под пакет – буфер ответа
- PICMP_ECHO_REPLY pIpe = (PICMP_ECHO_REPLY)GlobalAlloc(GHND, sizeof(ICMP_ECHO_REPLY) + sizeof(SendData));
- if (pIpe == NULL)
- {
- IcmpCloseHandle(hIP);
- WSACleanup();
- return;
- }
- pIpe->Data = SendData;
- pIpe->DataSize = sizeof(SendData);
- unsigned long ipaddr = inet_addr(cHost);
- IP_OPTION_INFORMATION option = { 255, 255, 0, 0, 0 };
- typedef struct
- {
- unsigned char Ttl; //время доставки
- unsigned char Tos; //тип сервиса
- unsigned char Flags; //флаги IP заголовка
- unsigned char OptionsSize; //размер опций в байтах
- unsigned char *OptionsData; //указатель на опции
- DWORD IcmpSendEcho
- (
- __in HANDLE IcmpHandle, //дискриптор полученный функцией IcmpCreateFile
- __in IPAddr DestinationAddress, //IP адрес запроса
- __in LPVOID RequestData, //указатель на буфер эхо-запроса
- __in WORD RequestSize, //размер буфера эхо-запроса
- //указатель на структуру с опциями запроса
- __in PIP_OPTION_INFORMATION RequestOptions,
- __inout LPVOID ReplyBuffer, //указатель на буфер эхо-ответа
- __in DWORD ReplySize, //размер буфера эхо-ответа
- __in DWORD Timeout //таймаут в миллисекундах
- );
- };
- typedef struct icmp_echo_reply
- {
- IPAddr Address; // адрес ответившего узла
- ULONG Status; // статус ответа
- ULONG RoundTripTime; // время прохождения запроса в мс
- USHORT DataSize; // размер данных ответа
- USHORT Reserved; // зарезервировано
- PVOID Data; // указатель на данные ответа
- IP_OPTION_INFORMATION Options; // опции ответа
- } ICMP_ECHO_REPLY, *PICMP_ECHO_REPLY;
- for (unsigned int c = 0; c < RequestCount; c++)
- {
- DWORD dwStatus = IcmpSendEcho(hIP, ipaddr, SendData, sizeof(SendData), &option, pIpe, sizeof(ICMP_ECHO_REPLY) + sizeof(SendData), Timeout);
- if (dwStatus > NULL)
- {
- for (int i = 0; i < dwStatus; i++)
- {
- unsigned char* pIpPtr = (unsigned char*)&pIpe->Address;
- cout << "Ответ от " << (int)*(pIpPtr) << "." << (int)*(pIpPtr + 1) << "." << (int)*(pIpPtr + 2) <<
- "." << (int)*(pIpPtr + 3) << ": число байт = " << pIpe->DataSize << " время = " <<
- pIpe->RoundTripTime << "мс TTL = " << (int)pIpe->Options.Ttl << endl;
- MaxMS = (MaxMS > pIpe->RoundTripTime) ? MaxMS : pIpe->RoundTripTime;
- MinMS = (MinMS < (int)pIpe->RoundTripTime && MinMS >= 0) ? MinMS : pIpe->RoundTripTime;
- }
- }
- else
- {
- if (pIpe->Status)
- {
- LostPacketsCount++;
- switch (pIpe->Status)
- {
- case IP_DEST_NET_UNREACHABLE:
- case IP_DEST_HOST_UNREACHABLE:
- case IP_DEST_PROT_UNREACHABLE:
- case IP_DEST_PORT_UNREACHABLE:
- {
- cout << "Remote host may be down." << endl;
- break;
- }
- case IP_REQ_TIMED_OUT:
- {
- cout << "Request timed out." << endl;
- break;
- }
- case IP_TTL_EXPIRED_TRANSIT:
- {
- cout << "TTL expired in transit." << endl;
- break;
- }
- default:
- {
- cout << "Error code: %ld" << pIpe->Status << endl;
- break;
- }
- }
- }
- }
- }
- IcmpCloseHandle(hIP);
- WSACleanup();
- unsigned char* pByte = (unsigned char*)&pIpe->Address;
- cout << "Статистика Ping "
- << (int)*(pByte) << "." << (int)*(pByte + 1)<< "." << (int)*(pByte + 2) << "." << (int)*(pByte + 3) << endl;
- cout << "\tПакетов: отправлено = " << RequestCount << ", получено = " << RequestCount - LostPacketsCount <<
- ", потеряно = " << LostPacketsCount << "<" << (int)(100 / (float)RequestCount)* LostPacketsCount <<
- " % потерь>, " << endl;
- if (MinMS < NULL) MinMS = NULL;
- cout << "Приблизительное время приема-передачи:" << endl << "Минимальное = " << MinMS << "мс, Максимальное = " <<
- MaxMS << "мс, Среднее = " << (MaxMS + MinMS) / 2 << "мс" << endl;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- setlocale(LC_ALL, "RUS");
- cout << ("ВВЕДИТЕ IP")<<endl;
- char *ip = new char[9];
- cin >> ip;
- Ping(ip, 60, 10);
- getch();
- return 0;
- }
- //"127.0.0.1"
- //Проверка правильности
- // ConsoleApplication1.cpp: определяет точку входа для консольного приложения.
- //
- #include "stdafx.h"
- #include <winsock2.h>
- #include <iphlpapi.h>
- #include <iostream>
- #include <icmpapi.h>
- #include <conio.h>
- //#pragma comment(lib, "iphlpapi.lib")
- //#pragma comment(lib, "ws2_32.lib")
- using namespace std;
- //#define IP_STATUS_BASE 11000
- //#define IP_SUCCESS 0
- //#define IP_DEST_NET_UNREACHABLE 11002
- //#define IP_DEST_HOST_UNREACHABLE 11003
- //#define IP_DEST_PROT_UNREACHABLE 11004
- //#define IP_DEST_PORT_UNREACHABLE 11005
- //#define IP_REQ_TIMED_OUT 11010
- //#define IP_BAD_REQ 11011
- //#define IP_BAD_ROUTE 11012
- //#define IP_TTL_EXPIRED_TRANSIT 11013
- unsigned long ip;
- unsigned long mask;
- unsigned long subnet;
- unsigned long host;
- unsigned long broadcast;
- bool CheckAddress(char* ip_)
- {
- int points = 0, // количество точек
- numbers = 0; // значение октета
- char* buff; // буфер для одного октета
- buff = new char[3];
- for (int i = 0; ip_[i] != '\0'; i++) { // для строки IP-адреса
- if (ip_[i] <= '9'&& ip_[i] >= '0') // если цифра
- {
- if (numbers > 3) return false; //если больше трех чисел в октете – ошибка
- buff[numbers++] = ip_[i]; //скопировать в буфер
- }
- else if (ip_[i] == '.') // если точка
- {
- if (atoi(buff) > 255) // проверить диапазон октета
- return false; if (numbers == 0) //если числа нет - ошибка
- return false;
- numbers = 0;
- points++;
- delete[]buff;
- buff = new char[3];
- }
- else return false;
- }
- if (points != 3) // если количество точек в IP-адресе не 3 - ошибка
- return false;
- if (numbers == 0 || numbers > 3)
- return false;
- return true;
- }
- bool CheckMask(char* ip_)
- {
- int points = 0, // количество точек
- numbers = 0; // значение октета
- int targ = 0, cou = 0;
- char* buff; // буфер для одного октета
- buff = new char[3];
- int adr[4] = { -1,-1,-1,-1 };
- if (ip_[strlen(ip_) - 1] != '0') return false;
- for (int i = 0; ip_[i] != '\0'; i++)
- { // для строки IP-адреса
- if (ip_[i] <= '9'&& ip_[i] >= '0') // если цифра
- {
- if (numbers > 3) return false; //если больше трех чисел в октете – ошибка
- buff[numbers++] = ip_[i]; //скопировать в буфер
- }
- else if (ip_[i] == '.') // если точка
- {
- if (atoi(buff) > 255) // проверить диапазон октета
- return false;
- if (numbers == 0) //если числа нет - ошибка
- return false;
- else
- if (atoi(buff) != 0)
- {
- cou++;
- adr[targ] = atoi(buff);
- }
- targ++;
- numbers = 0;
- points++;
- delete[]buff;
- buff = new char[3];
- }
- else
- return false;
- }
- if (cou == 0) return false;
- for (int i = 0; i < 4; i++)
- {
- if (adr[i] != -1) cou--;
- else if (cou != 0) return false;
- }
- if (points != 3) // если количество точек в IP-адресе не 3 - ошибка
- return false;
- if (numbers == 0 || numbers > 3)
- return false;
- return true;
- }
- unsigned long CharToLong(char* ip_)
- {
- unsigned long out = 0;//число для IP-адреса
- char *buff;
- buff = new char[3]; //буфер для хранения одного октета
- for (int i = 0, j = 0, k = 0; ip_[i] != '\0'; i++, j++) {
- if (ip_[i] != '.') //если не точка
- buff[j] = ip_[i]; // записать символ в буфер
- if (ip_[i] == '.' || ip_[i + 1] == '\0')
- { // если следующий октет или последний
- out <<= 8; //сдвинуть число на 8 бит
- if (atoi(buff) > 255)
- return NULL; // еcли октет больше 255 – ошибка
- out += (unsigned long)atoi(buff); //преобразовать и добавить //к числу IP-адреса
- k++;
- j = -1;
- delete[]buff;
- buff = new char[3];
- }
- }
- return out;
- }
- char* LongToChar(unsigned long ip_)
- {
- unsigned long ip = ip_;//число для IP-адреса
- char *buff;
- buff = new char[16]; //буфер для хранения одного октета
- int ostatok;
- char b[2];
- ostatok = ip % 256;
- ip = ip / 256;
- itoa(ostatok % 10, b, 10);
- buff[15] = b[1];
- buff[14] = b[0];
- ostatok = ostatok / 10;
- itoa(ostatok % 10, b, 10);
- buff[13] = b[0];
- ostatok = ostatok / 10;
- itoa(ostatok % 10, b, 10);
- buff[12] = b[0];
- buff[11] = '.';
- ostatok = ip % 256;
- ip = ip / 256;
- itoa(ostatok % 10, b, 10);
- buff[10] = b[0];
- ostatok = ostatok / 10;
- itoa(ostatok % 10, b, 10);
- buff[9] = b[0];
- ostatok = ostatok / 10;
- itoa(ostatok % 10, b, 10);
- buff[8] = b[0];
- buff[7] = '.';
- ostatok = ip % 256;
- ip = ip / 256;
- itoa(ostatok % 10, b, 10);
- buff[6] = b[0];
- ostatok = ostatok / 10;
- itoa(ostatok % 10, b, 10);
- buff[5] = b[0];
- ostatok = ostatok / 10;
- itoa(ostatok % 10, b, 10);
- buff[4] = b[0];
- buff[3] = '.';
- ostatok = ip % 256;
- ip = ip / 256;
- itoa(ostatok % 10, b, 10);
- buff[2] = b[0];
- ostatok = ostatok / 10;
- itoa(ostatok % 10, b, 10);
- buff[1] = b[0];
- ostatok = ostatok / 10;
- itoa(ostatok % 10, b, 10);
- buff[0] = b[0];
- //cout << buff << endl;
- return buff;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- setlocale(LC_ALL, "RUS");
- unsigned long ip, mask, host,
- subnet, broadcast;
- char *ip_, *mask_;
- bool flag = true;
- ip_ = new char[16];
- mask_ = new char[16];
- A:
- {
- do
- {
- if (!flag) cout << "Неверно введён адрес!" << endl;
- cout << "IP: ";
- cin >> ip_;
- } while (!(flag = CheckAddress(ip_)));
- ip = CharToLong(ip_);
- flag = true;
- do {
- if (!flag) cout << "Неправильная маска!" << endl;
- flag = true;
- do
- {
- if (!flag) cout << "Неверно введена маска!" << endl;
- cout << "Маска: ";
- cin >> mask_;
- } while (!(flag = CheckAddress(mask_)));
- mask = CharToLong(mask_);
- } while (!(flag = CheckMask(mask_)));
- subnet = ip & mask;
- host = ip & ~mask;
- broadcast = ip & mask | ~mask;
- cout << "ID подсети: " << LongToChar(subnet) << endl << "ID хоста: " << LongToChar(host) << endl << "Broadcast адрес: " << LongToChar(broadcast) << endl;
- } goto A;
- }
- //Получение мака по ip
- #include "stdafx.h"
- #include <winsock2.h>
- #include <iphlpapi.h>
- #include <iostream>
- #include <stdio.h>
- #include <conio.h>
- #include <Ws2tcpip.h>
- #include <string>
- #include <string.h>
- #pragma comment(lib , "iphlpapi.lib")
- #pragma comment(lib , "ws2_32.lib")
- using namespace std;
- void GetMacAddress(unsigned char *, struct in_addr);
- int main()
- {
- setlocale(LC_ALL, "RUS");
- int type = 0;
- A:
- //cout << "Введите тип: (1-get ip from mac, 2-get mac from ip)\n";
- //cin >> type;
- type = 2;
- switch (type)
- {
- case 1:
- {
- string s = "";
- cout << "Введите mac: ";
- cin >> s;
- s = "arp -a | findstr \"" + s + "\"";
- system(s.c_str());
- break;
- }
- case 2:
- {
- unsigned char mac[6];
- struct in_addr srcip = { 0 };
- struct sockaddr_in sa;
- char ip_address[32];
- WSADATA firstsock;
- if (WSAStartup(MAKEWORD(2, 2), &firstsock) != 0)
- {
- cout << "Ошибка инициализации winsock";
- cout << WSAGetLastError();
- return -1;
- }
- cout << "Введите IP : ";
- cin >> ip_address;
- //преобразование IP адреса другим способом
- //srcip.s_addr = inet_addr(ip_address);
- inet_pton(AF_INET, ip_address, &(sa.sin_addr));
- //Получение MAC по IP
- GetMacAddress(mac, sa.sin_addr);
- //GetMacAddress(mac, srcip);
- printf("MAC адрес : %.2X-%.2X-%.2X-%.2X-%.2X-%.2X",
- mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
- printf("\n");
- _getch();
- break;
- }
- default:
- break;
- }
- goto A;
- return 0;
- goto A;
- }
- void GetMacAddress(unsigned char *mac, struct in_addr
- destip)
- {
- DWORD ret;
- IPAddr srcip;
- ULONG MacAddr[2];
- ULONG PhyAddrLen = 6;
- int i;
- srcip = 0;
- //Послать ARP пакет
- ret = SendARP((IPAddr)destip.S_un.S_addr,
- srcip, MacAddr, &PhyAddrLen);
- //Преобразовать адрес
- if (PhyAddrLen)
- {
- BYTE *bMacAddr = (BYTE *)& MacAddr;
- for (i = 0; i < (int)PhyAddrLen; i++)
- {
- mac[i] = (char)bMacAddr[i];
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement