Други Авто Автоматизация Архитектура Астрономия Аудит Биология Бухгалтерия Военное дело Генетика География геология Государство Дом Другое Журналистика Абонамент СМИ Изобретательство Иностранные языки Информатика Искусство Принтирай История Компьютеры Кулинария Культура Лексикология Литература Логика Маркетинг Математика Машиностроение Медицина Менеджмент Металлы Абонамент Сварка Механика Музыка население Образование инсталации Охрана безопасности жизни инсталации Охрана ТРУДА Педагогика Политика Право Приборостроение Программирование Производство Промышленность Психология Р дио Регилия Связь Социология Спорт Стандартизация строительство Технологии Торговля туризм Физика Физиология Философия Финансы Химия Хозяйство Ценнообразование Черчение Экология Эконометрика Экономика Электроника Юриспунденкция

Тексти програм

Читайте также:
  1. Създаване на VHDL източник (создание файла, содержащего текст программы на языке VHDL).
  2. II-этап: Гала - концерт 25 июня 2013года. В программе празднования Дня города.
  3. II. Требования на структурата на образователните програми за докторанти и образование
  4. III. Обучение по образователни програми
  5. III. ПРОГРАМА НАВЧАЛЬНОЇ ТА ВИРОБНИЧОЯ ПРАКТИКИ В ОРГАНАХ ДЕРЖАВНОЙ ВИКОНАВЧОЇ СЛУЖБИ УКРАЇНИ
  6. III. Требования к услом реализации основно образователни программы дошкольного образования
  7. IV ПРОГРАМА ПРАКТИКИ
  8. IV. Программа оберевнований
  9. IV. Извършване на резултати от основното образование в програмите за докторанти
  10. SWOT анализ раздела «Цели образователни програми»
  11. USB програмамматор ЭБУ.
  12. V. КРОССВОРД «ПУТЕШЕСТВИЕ ПО ТЕАТРАЛЬНОЙ ПРОГРАММКЕ»

Текст програми Сервер

// sniff.cpp: Определя входната точка за приложението.

//

#include "stdafx.h"

// Функция обработки сообщений диалогого окна

INT_PTR CALLBACK ДиалогПрок (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {

static HANDLE hLogFile;

статичен SOCKET s;

статичен HWND hStartButton;

статичен HWND hStopButton;

static HWND hIDC_CHECK_PROTO_IGMPWnd;

static HWND hIDC_CHECK_OPTION_LOG_TARGET_IPWnd;

статичен HWND hIDC_CHECK_OPTION_LOG_SENDER_IPWnd;

static HWND hIDC_CHECK_OPTION_WRITE_PROTO_NAMEWnd;

статичен HWND hIDC_CHECK_OPTION_WRITE_PACKET_LENWnd;

static HWND hIDC_EDIT_LOG_FILENAMEWnd;

SYSTEMTIME st;

време за зареждане [20];

char * token;

int hms [3];

инт броя = 0;

AMPM [3];

превключвател (uMsg) {

случай WM_INITDIALOG:

CheckDlgButton (hwndDlg, IDC_CHECK_PROTO_ALL, BST_CHECKED);

CheckDlgButton (hwndDlg, IDC_CHECK_OPTION_LOG_TARGET_IP, BST_CHECKED);

CheckDlgButton (hwndDlg, IDC_CHECK_OPTION_LOG_SENDER_IP, BST_CHECKED);

CheckDlgButton (hwndDlg, IDC_CHECK_OPTION_WRITE_PROTO_NAME, BST_CHECKED);

CheckDlgButton (hwndDlg, IDC_CHECK_OPTION_WRITE_PACKET_LEN, BST_CHECKED);

SendDlgItemMessage (hwndDlg, IDC_EDIT_LOG_FILENAME, EM_LIMITTEXT, _MAX_FNAME - 1, 0);

SetDlgItemText (hwndDlg, IDC_EDIT_LOG_FILENAME, "sniff.log");

hStartButton = GetDlgItem (hwndDlg, IDC_BUTTON_START);

hStopButton = GetDlgItem (hwndDlg, IDC_BUTTON_STOP);

hIDC_CHECK_PROTO_IGMPWnd = GetDlgItem (hwndDlg, IDC_CHECK_PROTO_IGMP);

hIDC_CHECK_OPTION_LOG_TARGET_IPWnd = GetDlgItem (hwndDlg, IDC_CHECK_OPTION_LOG_TARGET_IP);

hIDC_CHECK_OPTION_LOG_SENDER_IPWnd = GetDlgItem (hwndDlg, IDC_CHECK_OPTION_LOG_SENDER_IP);

hIDC_CHECK_OPTION_WRITE_PROTO_NAMEWnd = GetDlgItem (hwndDlg, IDC_CHECK_OPTION_WRITE_PROTO_NAME);

hIDC_CHECK_OPTION_WRITE_PACKET_LENWnd = GetDlgItem (hwndDlg, IDC_CHECK_OPTION_WRITE_PACKET_LEN);

hIDC_EDIT_LOG_FILENAMEWnd = GetDlgItem (hwndDlg, IDC_EDIT_LOG_FILENAME);

WSADATA wsadata;

// Инициализация сокетов

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Ошибка. Не удается инициализировать сокеты.");



} else {

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Сокеты инициализированы.");

}

// Создание сокета

s = гнездо (AF_INET, SOCK_RAW, IPPROTO_IP);

ако (s == INVALID_SOCKET) {

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Ошибка. Не удается создать сокет.");

} else {

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Сокет создан.");

CHAR szHostName [16];

// Получение имени локального хоста

ако (gethostname (szHostName, sizeof szHostName)! = 0) {

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Ошибка.Не удается определить имя хоста.");

} else {

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Имя хоста получено.");

// Получва информация за локално меню

HOSTENT * phe = gethostbyname (szHostName);

ако (phe == NULL) {

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Ошибка.Не удается получи описание на хоста");

} else {

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Описание хоста получено.");

SOCKADDR_IN sa; // Адрес хоста

sa.sin_family = AF_INET;

sa.sin_addr.s_addr = ((struct in_addr *) phe-> h_addr_list [0]) -> s_addr;

// Связывание локального адреса и сокета

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Ошибка. Не удается осуществить привязку сокета.");

} else {

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Сокет привязан.");

// Включение promiscuous режим

DWORD flag = TRUE; // Флаг PROMISC Вкл / Выкл

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Ошибка. Не удается включить режим promiscuous.");

} else {

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Режим promiscuous включен.");

‡ агрузка ...

// Разблокирование кнопки "Старт"

EnableWindow (hStartButton, TRUE);

}

}

}

}

}

връщане TRUE;

случай WM_COMMAND:

ключ (HIWORD (wParam)) {

случай EN_UPDATE:

ако (LOWORD (wParam) == IDC_EDIT_LOG_FILENAME) {

CHAR szFileName [_MAX_FNAME];

DWORD dwFileSize = 0;

GetDlgItemText (hwndDlg, IDC_EDIT_LOG_FILENAME, szFileName, _MAX_FNAME);

HANDLE hFile = CreateFile (име на szFile, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);

ако (hFile! = INVALID_HANDLE_VALUE) {

dwFileSize = GetFileSize (hFile, NULL);

CloseHandle (hFile);

}

SetDlgItemInt (hwndDlg, IDC_EDIT_LOG_SIZE, dwFileSize, FALSE);

}

прекъсване;

}

превключвател (LOWORD (wParam)) {

случай IDC_CHECK_PROTO_ALL: {

BOOL bChecked = IsDlgButtonChecked (hwndDlg, IDC_CHECK_PROTO_ALL);

EnableWindow (hIDC_CHECK_PROTO_IGMPWnd,! BChecked);

}

прекъсване;

случай IDC_BUTTON_START:

// Создаем файл лога

CHAR szFileName [_MAX_FNAME];

GetDlgItemText (hwndDlg, IDC_EDIT_LOG_FILENAME, szFileName, _MAX_FNAME);

hLogFile = Създаване на файл (szFileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, 0);

ако (hLogFile == INVALID_HANDLE_VALUE) {

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Ошибка.Запомняне на файл-файл");

} else {

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Лог-файл создан (открыт).");

SetFilePointer (hLogFile, 0, NULL, FILE_END);

EnableWindow (hStartButton, FALSE);

EnableWindow (hStopButton, TRUE);

EnableWindow (hIDC_CHECK_PROTO_IGMPWnd, FALSE);

EnableWindow (hIDC_CHECK_OPTION_LOG_TARGET_IPWnd, FALSE);

EnableWindow (hIDC_CHECK_OPTION_LOG_SENDER_IPWnd, FALSE);

EnableWindow (hIDC_CHECK_OPTION_WRITE_PROTO_NAMEWnd, FALSE);

EnableWindow (hIDC_CHECK_OPTION_WRITE_PACKET_LENВина, FALSE);

EnableWindow (hIDC_EDIT_LOG_FILENAMEWnd, FALSE);

// Связываем событие FD_READ с окном

WSAAsyncSelect (s, hwndDlg, WM_RECV, FD_READ);

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Прием пакетов.");

}

прекъсване;

случай IDC_BUTTON_STOP:

Знаме DWORD;

BOOL bChecked;

CloseHandle (hLogFile);

EnableWindow (hIDC_EDIT_LOG_FILENAMEWnd, TRUE);

EnableWindow (hIDC_CHECK_OPTION_LOG_TARGET_IPWnd, TRUE);

EnableWindow (hIDC_CHECK_OPTION_LOG_SENDER_IPWnd, TRUE);

EnableWindow (hIDC_CHECK_OPTION_WRITE_PROTO_NAMEWnd, TRUE);

EnableWindow (hIDC_CHECK_OPTION_WRITE_PACKET_LENВие, TRUE);

EnableWindow (hStopButton, FALSE);

// EnableWindow (hIDC_CHECK_PROTO_ALLWnd, TRUE);

EnableWindow (hIDC_CHECK_PROTO_IGMPWnd, TRUE);

bChecked = IsDlgButtonChecked (hwndDlg, IDC_CHECK_PROTO_ALL);

EnableWindow (hIDC_CHECK_PROTO_IGMPWnd,! BChecked);

// Включение promiscuous режим

flag = TRUE; // Флаг PROMISC Вкл / Выкл

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Ошибка. Не удается включить режим promiscuous.");

} else {

SetDlgItemText (hwndDlg, IDC_EDIT_STATUS, "Режим promiscuous включен.");

EnableWindow (hStartButton, TRUE);

}

прекъсване;

случай IDC_BUTTON_ABOUT:

Диалогов прозорец (GetModuleHandle (NULL), MAKEINTRESOURCE (IDD_DIALOG_ABOUT), hwndDlg, заDialogProc);

прекъсване;

случай IDC_BUTTON_CLOSE:

Изпращане на съобщения (hwndDlg, WM_CLOSE, 0, 0);

прекъсване;

}

връщане TRUE;

случай WM_RECV:

ако (WSAGETSELECTERROR (lParam)) {

} else {

ако (WSAGETSELECTEVENT (lParam) == FD_READ) {

// Буфер размера 64 Кб

CHAR btBuffer [65536];

// Получаем входящие данные

ако (recv (s, btBuffer, sizeof (btBuffer), 0)> = размер на (IPHeader)) {

IPHeader * hdr = (IPHeader *) btBuffer;

// Вычисляем размер. Т.к. в сети принят прямой порядок байт,

// не обратный, то придется поменять байты местами.

WORD размер = (hdr-> iph_length << 8) + (hdr-> iph_length >> 8);

// Получен пакет?

memset (време, 0,20);

memset (AMPM, 0,3);

вземете местното време

// Проверяем протокол

ако (IsDlgButtonChecked (hwndDlg, IDC_CHECK_PROTO_ALL)! = TRUE) {

връщане TRUE;

}

}

DWORD dwWritten;

// Записываем данные

ако (IsDlgButtonChecked (hwndDlg, IDC_CHECK_OPTION_LOG_TARGET_IP) == TRUE) {

IN_ADDR ia;

ia.s_addr = hdr-> iph_dest;

CHAR * pszTargetIP = inet_ntoa (ia);

}

ако (IsDlgButtonChecked (hwndDlg, IDC_CHECK_OPTION_LOG_SENDER_IP) == TRUE) {

IN_ADDR ia;

ia.s_addr = hdr-> iph_src;

CHAR * pszSourceIP = inet_ntoa (ia);

}

ако (IsDlgButtonChecked (hwndDlg, IDC_CHECK_OPTION_WRITE_PROTO_NAME) == TRUE) {

превключвател (hdr-> iph_protocol) {

случай IPPROTO_IGMP:

прекъсване;

}

}

ако (IsDlgButtonChecked (hwndDlg, IDC_CHECK_OPTION_WRITE_PACKET_LEN) == TRUE) {

CHAR szTemp [17];

wsprintf (szTemp, "% d \ r \ n", размер);

}

SetDlgItemInt (hwndDlg, IDC_EDIT_LOG_SIZE, GetFileSize (hLogFile, NULL), FALSE);

}

}

}

}

връщане TRUE;

случай WM_CLOSE:

// Конец работы със сокетами

closesocket (и);

WSACleanup ();

// Конец работы с логом

CloseHandle (hLogFile);

// Закрытие окна

EndDialog (hwndDlg, 0);

връщане TRUE;

}

връщане FALSE;

}

int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

// Проверяем версию системы

ако (LOBYTE (LOWORD (GetVersion ())) <5) {

MessageBox (0, "Данни за работа с Windows 2000 и младши", "sniff", MB_ICONEXCLAMATION);

връщане 0;

}

// Проверяем, что запущен единственный процесс сниффера

ако (AreWeAlone ("- = sniff =") == FALSE) {

MessageBox (0, "Сниффер уже запущен.", "Sniff", MB_ICONEXCLAMATION);

връщане 0;

}

// Устанавливаем текущую директорю

CHAR szCurDir [MAX_PATH];

GetModuleFileName (NULL, szCurDir, MAX_PATH);

* strrchr (szCurDir, '\\') = 0;

SetCurrentDirectory (szCurDir);

ако (IsCurrentUserAdmin () == FALSE) {

MessageBox (0, "Вие не сте прав администратор.", "Sniff", MB_ICONEXCLAMATION);

}

// Создаем главное окно программы

ако (DialogBox (hInstance, MAKEINTRESOURCE (IDD_DIALOG), NULL, DialogProc)! = 0) {

MessageBox (0, "Не удается создать главное окно сниффера.", "Sniff", MB_ICONERROR);

връщане 0;

}

връщане 0;

}

Текст програми Клієнт

// c.cpp: Определя входната точка за приложението.

//

#include <winsock2.h>

#include <ws2tcpip.h>

#include <stdio.h>

#include "stdafx.h"

#include "ch"

#include <string.h>

#include <stdlib.h>

SYSTEMTIME st;

време за зареждане [20];

char * token;

int hms [3];

инт броя = 0;

AMPM [3];

struct iphdr

{

неподписани символи: 4, версия: 4, tos;

неподписан кратък tot_len, id, frag_off;

неподписан char ttl, протокол;

незначителна кратка проверка;

неподписано int sadst, daddr;

};

struct igmphdr

{

неподписан тип знак, код;

неподписан кратък cksum;

struct in_addr group;

};

неподписан кратък in_chksum (неподписан кратък *, int);

дълго разрешение (char *);

дълго разрешение (char * хост)

{

struct hostent * hst;

long addr;

hst = gethostbyname (хост);

ако (hst == NULL)

връщане (-1);

връщане (адр);

}

#define MAX_LOADSTRING 100

// Глобални променливи:

ХИНСТАНС hInst; // настоящ инстанция

TCHAR szTitle [MAX_LOADSTRING]; // Текст на заглавната лента

TCHAR szWindowClass [MAX_LOADSTRING]; // името на класа на главния прозорец

// Декларации за функциите, включени в този кодов модул:

ATOM MyRegisterClass (HINSTANCE hInstance);

BOOL InitInstance (HINSTANCE, int);

LRESULT CALLBACK за WndProc (HWND, UINT, WPARAM, LPARAM);

INT_PTR CALLBACK За (HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain (HINSTANCE hInstance,

СЪСТОЯНИЕ,

LPTSTR lpCmdLine,

int nCmdShow)

{

UNREFERENCED_PARAMETER (hPrevInstance);

UNREFERENCED_PARAMETER (lpCmdLine);

// TODO: Поставете кода тук.

MSG msg;

HACCEL hAccelTable;

// Инициализиране на глобални струни

LoadString (hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString (hInstance, IDC_C, szWindowClass, MAX_LOADSTRING);

MyRegisterClass (hInstance);

// Извършване на инициализация на приложението:

ако (! InitInstance (hInstance, nCmdShow))

{

връщане FALSE;

}

hAccelTable = LoadAccelerators (hInstance, MAKEINTRESOURCE (IDC_C));

// Главна линия за съобщения:

{

{

}

}

връщане (int) msg.wParam;

}

//

// ФУНКЦИЯ: MyRegisterClass ()

//

// ЦЕЛ: Записва класа на прозореца.

//

// КОМЕНТАРИ:

//

// Тази функция и нейното използване са необходими само ако искате този код

// да бъде съвместим с Win32 системи преди "RegisterClassEx"

// функцията, която бе добавена към Windows 95. Важно е да се нарече тази функция

//, така че приложението ще получи "добре оформени" малки икони, свързани

// с него.

//

ATOM MyRegisterClass (HINSTANCE hInstance)

{

WNDCLASSEX wcex;

wcex.cbSize = размер на (WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc = WndProc;

wcex.cbClsExtra = 0;

wcex.cbWndExtra = 0;

wcex.hInstance = hInstance;

wcex.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_C));

wcex.hCursor = LoadCursor (NULL, IDC_ARROW);

wcex.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);

wcex.lpszMenuName = MAKEINTRESOURCE (IDC_C);

wcex.lpszClassName = szWindowClass;

wcex.hIconSm = LoadIcon (wcex.hInstance, MAKEINTRESOURCE (IDI_SMALL));

}

//

// ФУНКЦИЯ: InitInstance (HINSTANCE, int)

//

// ЦЕЛ: Запазва манипулацията на потребителски модел и създава основния прозорец

//

// КОМЕНТАРИ:

//

// В тази функция запазваме манипулатора на потребителски модел в глобална променлива и

// създайте и покажете главния прозорец на програмата.

//

BOOL InitInstance (HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd;

hInst = hInstance; // Магазин за потребителски модел в глобалната променлива

hWnd = CreateWindow (szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

ако (! hWnd)

{

връщане FALSE;

}

ShowWindow (hWnd, nCmdShow);

UpdateWindow (hWnd);

връщане TRUE;

}

//

// ФУНКЦИЯ: WndProc (HWND, UINT, WPARAM, LPARAM)

//

// ЦЕЛ: Процеси съобщения за главния прозорец.

//

// WM_COMMAND - обработва менюто на приложението

// WM_PAINT - Paint основния прозорец

// WM_DESTROY - публикува съобщение за отказване и се връща

//

//

LRESULT CALLBACK WndProc (HWND hWnd, съобщение UINT, WPARAM wParam, LPARAM lParam)

{

int wmId, wmEvent;

PAINTSTRUCT ps;

HDC HDD;

превключвател (съобщение)

{

случай WM_COMMAND:

wmId = LOWORD (wParam);

wmEvent = HIWORD (wParam);

// Разбор на селекциите на менюто:

превключвател (wmId)

{

case IDM_ABOUT:

Диалогов прозорец (hInst, MAKEINTRESOURCE (IDD_ABOUTBOX), hWnd, за);

прекъсване;

случай IDM_EXIT:

DestroyWindow (hWnd);

прекъсване;

по подразбиране:

връщане на DefWindowProc (hWnd, съобщение, wParam, lParam);

}

прекъсване;

случай WM_PAINT:

memset (време, 0,20);

memset (AMPM, 0,3);

вземете местното време

token = strtok (време, ":");

докато (ток! = NULL)

{

ако (брой <3)

{

HMS [брой] = atoi (токен);

съд << HMS [брой] << Endl;

}

още

{

strcpy (AMPM, знак);

съд << AMPM;

}

// увеличете броя

брои ++;

// Вземете следващия знак

token = strtok (NULL, ":");

}

struct sockaddr_in dst;

struct iphdr * ip;

struct igmphdr * igmp;

Дълъг баща, Саддър;

int s, i = 0, с, леща;

char buf [1500] = време;

daddr = resolve ('127.0.0.1');

saddr = resolve ('127.0.0.1');

memset (buf, 0, 1500);

dst.sin_addr.s_addr = daddr;

dst.sin_family = AF_INET;

ip-> ihl = 5;

ip-> версия = 4;

ip-> tos = 0;

ip-> tot_len = htons (10933);

ip-> id = htons (48648);

ip-> ttl = 64;

ip-> протокол = IPPROTO_IGMP;

ip-> проверка = in_chksum ((неподписан кратък *) ip, sizeof (struct

iphdr));

ip-> saddr = saddr;

ip-> daddr = daddr;

s = гнездо (AF_INET, SOCK_RAW, IPPROTO_RAW);

ако (s == -1)

връщане (1);

за (с = 0; с <2; с ++)

{

len = 220;

ip-> frag_off = тонове (0x73а);

за (i = 0; i ++)

{

(struct sockaddr_in)) == -1)

{

perror ("Грешка при изпращане на пакета");

изход (-1);

}

ако (ntohs (ip-> frag_off) == 0x2000)

прекъсване;

len = 1500;

ако аз)

ip-> frag_off = тонове (0x2681);

още

ip-> frag_off = тонове (ntohs (ip-> frag_off) - 185);

ip-> проверка = in_chksum ((неподписан кратък *) ip, sizeof

(struct iphdr));

}

}

връщане (1);

// TODO: Добавете кода за рисуване тук ...

прекъсване;

случай WM_DESTROY:

PostQuitMessage (0);

прекъсване;

по подразбиране:

връщане на DefWindowProc (hWnd, съобщение, wParam, lParam);

}

връщане 0;

}

// Манипулатор за съобщения за кутията.

INT_PTR CALLBACK За (HWND hDlg, съобщение UINT, WPARAM wParam, LPARAM lParam)

{

UNREFERENCED_PARAMETER (lParam);

превключвател (съобщение)

{

случай WM_INITDIALOG:

връщане (INT_PTR) TRUE;

случай WM_COMMAND:

ако (LOWORD (wParam) == IDOK || LOWORD (wParam) == IDCANCEL)

{

EndDialog (hDlg, LOWORD (wParam));

връщане (INT_PTR) TRUE;

}

прекъсване;

}

връщане (INT_PTR) FALSE;

}


1 | | 2 |


При использовании материала, поставете ссылку на Студалл.Огг (0.211 сек.)