Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Академик
Рейтинг: 8452
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2701
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2636
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1682
Дата выхода:12.09.2011, 11:00
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:292 / 170
Вопросов / ответов:1 / 1

Консультация # 183980: Здравствуйте, уважаемые! Подскажите функцию (или несколько функций, если одной обойтись нельзя) WinAPI, которая бы отображала количество сетевых подключений к серверу на данный момент. ...


Консультация # 183980:

Здравствуйте, уважаемые!

Подскажите функцию (или несколько функций, если одной обойтись нельзя) WinAPI, которая бы отображала количество сетевых подключений к серверу на данный момент.

Дата отправки: 07.09.2011, 10:20
Вопрос задал: sir Henry (Старший модератор)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, sir Henry!
Вот Вам программа, показывающая TCP- и UDP-подключения к компьютеру.
Работа основана на двух функциях: GetTcpTable и GetUdpTable

Код :
#pragma once

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <iostream>
#include <Iphlpapi.h>
#include <Winsock2.h>
#include <conio.h>
#include <stdio.h>

#pragma comment( lib, "Iphlpapi.lib" )
#pragma comment( lib, "Ws2_32.lib" )

using namespace std;

// Функция преобразует состояние порта в строковый эквивалент
char * PortStateToStr(const DWORD State)
{
 switch (State)
 {
  case MIB_TCP_STATE_CLOSED:
   return "CLOSED";
  case MIB_TCP_STATE_LISTEN: 
   return "LISTEN";
  case MIB_TCP_STATE_SYN_SENT:
   return "SYN SENT";
  case MIB_TCP_STATE_SYN_RCVD:
   return "SYN RECEIVED";
  case MIB_TCP_STATE_ESTAB:
   return "ESTABLISHED";
  case MIB_TCP_STATE_FIN_WAIT1:
   return "FIN WAIT 1";
  case MIB_TCP_STATE_FIN_WAIT2:
   return "FIN WAIT 2";
  case MIB_TCP_STATE_CLOSE_WAIT:
   return "CLOSE WAIT";
  case MIB_TCP_STATE_CLOSING:
   return "CLOSING";
  case MIB_TCP_STATE_LAST_ACK:
   return "LAST ACK";
  case MIB_TCP_STATE_TIME_WAIT:
   return "TIME WAIT";
  case MIB_TCP_STATE_DELETE_TCB:
   return "DELETE TCB";
  default:
   return "UNKNOWN";
 }
}

// Получение TCP/UDP статистики при помощи стандартных методов
void Show(void)
{
 // Declare and initialize variables
 int    Count;
 DWORD   i, Size;
 PMIB_TCPTABLE pTCPTable;
 PMIB_UDPTABLE pUDPTable;
 in_addr   *paddr;

 // для успешного получения стстаистики первоначально необходимо определиться
 // сколько памяти потребует данная операция
 // для этого делаем так:
 // Вделяем память под TCP таблицу (под один элемент)
 pTCPTable = (MIB_TCPTABLE*) GlobalAlloc(GMEM_FIXED,sizeof(MIB_TCPTABLE));
    // Показываем что памяти у нас не выделено
    Size = 0;
    // Выполняем функцию и после этого переменная Size
    // будет содержать кол-во необходимой памяти
 if (GetTcpTable(pTCPTable, &Size, TRUE) != ERROR_INSUFFICIENT_BUFFER) 
  return;
    // освобождаем память занятую под один элемент
 GlobalFree(pTCPTable);
 // Теперь выделяем уже требуемое кол-во памяти
 pTCPTable = (MIB_TCPTABLE*) GlobalAlloc(GMEM_FIXED, Size);

 Count = 0;
    // Выполняем функцию 
 if (GetTcpTable(pTCPTable, &Size, TRUE) == NO_ERROR)
 {
  cout << endl;
  cout << "\tСтатистика TCP" << endl;
  cout.width(19);
  cout << "Удаленный IP-адрес";
  cout.width(15);
  cout << "Удаленный порт";
  cout.width(15);
  cout << "Состояние";
  cout.width(15);
  cout << "Локальный порт" << endl;
  cout << "================================================================" << endl;
  // и начинаем выводить данные по ТСР
  for (i=0; i<pTCPTable->dwNumEntries; i++)
  {
   paddr = (in_addr *)&pTCPTable->table[i].dwRemoteAddr;
   if (strcmp(inet_ntoa(*paddr), "0.0.0.0"))
   {
    cout.width(19);
    cout << inet_ntoa(*paddr);
    cout.width(15);
                cout << htons(pTCPTable->table[i].dwRemotePort);
    cout.width(15);
                cout << PortStateToStr(pTCPTable->table[i].dwState);
    cout.width(15);
                cout << htons(pTCPTable->table[i].dwLocalPort) << endl;
    Count++;
   }
  }
  cout << "================================================================" << endl;
  cout << "Всего соединений: " << Count << endl;

 }
 // Не забываем освободить память
 GlobalFree(pTCPTable);
 
 // По аналогии поступаем и с UDP статистикой
 pUDPTable = (MIB_UDPTABLE*) GlobalAlloc(GMEM_FIXED,sizeof(MIB_UDPTABLE));
    Size = 0;
 if (GetUdpTable(pUDPTable, &Size, TRUE) != ERROR_INSUFFICIENT_BUFFER) 
  return;
 GlobalFree(pUDPTable);
 pUDPTable = (MIB_UDPTABLE*) GlobalAlloc(GMEM_FIXED, Size);

 Count = 0;
 if (GetUdpTable(pUDPTable, &Size, TRUE) == NO_ERROR)
 {
  cout << endl << endl;
  cout << "\tСтатистика UDP" << endl;
  cout.width(19);
  cout << "Локальный IP-адрес";
  cout.width(15);
  cout << "Локальный порт" << endl;
  cout << "==================================" << endl;
  for (i=0; i<pUDPTable->dwNumEntries; i++)
  {
   paddr = (in_addr *)&pUDPTable->table[i].dwLocalAddr;
   if (strcmp(inet_ntoa(*paddr), "0.0.0.0"))
   {
    cout.width(19);
    cout << inet_ntoa(*paddr);
    cout.width(15);
                cout << htons(pTCPTable->table[i].dwLocalPort) << endl;
    Count++;
   }
  }
  cout << "==================================" << endl;
  cout << "Всего соединений: " << Count << endl;

 }
 GlobalFree(pUDPTable);
}

int main()
{
 setlocale(LC_ALL,"russian");
 Show();
 _getch();
 return 0;
}

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 08.09.2011, 13:49

5
нет комментария
-----
Дата оценки: 08.09.2011, 16:57

Рейтинг ответа:

НЕ одобряю +1 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное