Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
1

Низкоуровневые сокеты (ICMP протокол), Ошибка с типами, Клиент-Сервер

21.04.2014, 16:44. Показов 2226. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создать для клиента генератор пакетов (для проведения атаки ICMP-Flood), а для сокета-сервера чтение с защитой.

При компиляции клиента выдает забавную ошибку, которую пытался убрать с помощью просто перевода из одного типа в другой как вроде и просит компилятор, но это не проходит. Помогите справиться.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream>
 
#include <winsock2.h>
#include <windows.h>
using namespace std;
struct icmp_header 
{
unsigned char type; // тип ICMP- пакета
unsigned char code; // код ICMP- пакета 
unsigned short crc ; // контрольная сумма 
unsigned long orig_timestamp; // дополнительные поля 
unsigned long recv_timestamp; // уточняющий тип
unsigned long trns_timestamp; //ICMP-пакета
};
struct ip_header
{
unsigned char version; // номер версии протокола 
unsigned char tos; // тип сервиса 
unsigned short length; // общая длина пакета 
unsigned short id ; // идентификатор пакета
unsigned short flags; // флаги 
unsigned char ttl ; // Время жизни пакета 
unsigned char proto; // Протокол верхнего уровня 
unsigned short crc; // CRC заголовка 
unsigned int src_addr; // IP- адрес отправителя 
unsigned int dst_addr; // IP- адрес получателя 
}; 
//подсчет контрльной суммы
unsigned short rs_crc (unsigned short * buffer, int length)
{ 
unsigned long crc = 0;
// Вычисление CRC 
while (length > 1)
 { 
 crc += *buffer++; 
 length -= sizeof (unsigned short); 
 } 
if (length) crc += *(unsigned char*) buffer;
// Закончить вычисления 
crc = (crc >> 16) + (crc & 0xffff);
crc += (crc >> 16);
//Смещение CRC , если необходимо
if (1) crc = crc << 1; 
// Возвращаем инвертированное значение 
return (unsigned short)(~crc); 
} 
/*______________
отправка в сеть*/
int rs_send_ip (SOCKET s, struct ip_header iph, unsigned char * data, 
                     int data_length, unsigned short dst_port_raw)
{ 
char * buffer;
int result; 
sockaddr_in target; 
unsigned char header_length;
unsigned int packet_length;
memset (&target, 0, sizeof (target));
target.sin_family = AF_INET; 
target.sin_addr.s_addr = iph.dst_addr; 
target.sin_port = dst_port_raw; 
// Вычисление длины и заголовка пакета 
header_length = sizeof (struct ip_header); 
packet_length = header_length + data_length; 
// Установка CRC. 
iph.crc = 0; 
// Заполнение некоторых полей заголовка IP . 
iph.version = header_length / 4 + (unsigned char) atoi ("4") * 16;
// Если длина пакета не задана , то 
//длина пакета приравнивается к длине заголовка 
if (!iph.length) iph.length = htons (packet_length); 
buffer =(char *) calloc (packet_length, sizeof (char)); 
// Копирование заголовка пакета в буфер ( CRC равно 0). 
memcpy (buffer, &iph, sizeof (struct ip_header));
// Копирование данных в буфер 
if (data) memcpy (buffer + header_length, data, data_length); 
// Вычисление CRC. 
iph.crc = rs_crc ((unsigned short *) buffer, packet_length); 
// Копирование заголовка пакета в буфер ( CRC посчитана). 
memcpy (buffer, &iph, sizeof (struct ip_header)); 
// Отправка IP пакета в сеть.
result = sendto (s, buffer, packet_length, 0,(struct sockaddr *)
                 &target, sizeof (target));
free (buffer); 
return result;
} 
int rs_send_icmp (SOCKET s, struct ip_header iph, struct icmp_header icmph, 
                      unsigned char * data, int data_length)
{
char * buffer; 
int result; 
unsigned char header_length; 
unsigned int packet_length; 
data_length = 0; 
// вычисление длин пакета и заголовка.
header_length = sizeof (struct icmp_header); 
packet_length = header_length + data_length; 
icmph.crc = 0; 
buffer = (char *)calloc (packet_length, sizeof (char)); 
// Копирование заголовка пакета в буфер ( CRC равно 0).
memcpy (buffer, &icmph, sizeof (struct icmp_header)); 
// Вычисление CRC.
icmph.crc = rs_crc ((unsigned short *) buffer, packet_length); 
// Копирование заголовка пакета в буфер ( CRC посчитана). 
memcpy (buffer, &icmph, sizeof (struct icmp_header)); 
// Отправка IP пакета со вложенным ICMP пакетом.
//unsigned char u = (unsigned)buffer;
result = rs_send_ip (s, iph, buffer, packet_length, 0);
free (buffer); 
return result; 
} 
int main(int argc, char *argv[])
{
    //Инициализация библиотеки WinSock
    WSADATA wsaData;
        int errcod;
        errcod = WSAStartup(MAKEWORD(2, 2), &wsaData);
            if(errcod!=0)
            {
             cout<<"WinSock not found!";
             return 0;
            }
 struct ip_header iph;
 struct icmp_header icmph;
icmph.type = 8; // тип ICMP- пакета
icmph.code= 0; // код ICMP- пакета 
icmph.crc=0; // контрольная сумма 
icmph.orig_timestamp; // дополнительные поля 
icmph.recv_timestamp; // уточняющий тип
icmph.trns_timestamp; //ICMP-пакета
iph.version=0x4; // номер версии протокола 
iph.tos= 0; // тип сервиса (нормальный)
iph.length= 10; // общая длина пакета 
iph.id= htonl(54321) ; // идентификатор пакета
iph.flags= htons(0); // флаги 
iph.ttl=255 ; // Время жизни пакета 
iph.proto = IPPROTO_ICMP; // Протокол верхнего уровня 
iph.crc=0; // CRC заголовка 
iph.src_addr=inet_addr("192.168.1.100"); // IP- адрес отправителя 
iph.dst_addr=inet_addr("192.168.1.107"); // IP- адрес получателя 
SOCKET s= socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if(s == INVALID_SOCKET)
    {
        cout<<"Error create socket";
    }
    else cout<<"Create socket succesfull";
  //отправляем ICMP пакет
  //for (int y=0;y<N;y++) {будет отправка пакетов, ниже приведена единичная отправка}
  rs_send_icmp (s, iph, icmph, NULL, 0);
    system("PAUSE");
    return EXIT_SUCCESS;
}
Также кто может подскажите как быть с кодом для сервера? Какие функции в нем именно должны быть: recfrom -для примера или другие какие (чтение чтобы пакета прошло) Очень нужна ваша помощь!
Ошибка - в скрине видна.
Низкоуровневые сокеты (ICMP протокол), Ошибка с типами, Клиент-Сервер
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2014, 16:44
Ответы с готовыми решениями:

Как взаимодействуют клиент-сервер в готовой программе(сокеты)
Скачал курсовую &quot;Комплекс сетевой защиты&quot;. 2 программы клиент(raw_send) - сервер (raw_recv). в...

icmp протокол
Здравствуйте. Никак не могу информацию найти про, &quot;широковещательные icmp&quot;, подскажите что это...

Низкоуровневые сокеты. Udp клиент-сервер
Здравствуйте.Помогите пожалуйста поправить код сервера,принимающего сообщение от клиента и...

Клиент - сервер протокол
Всем привет. Я пытаюсь понять как и с помощью чего можно организовать клиент-серверное приложение....

3
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
22.04.2014, 09:03 2
Цитата Сообщение от tymrfik Посмотреть сообщение
выдает забавную ошибку, которую пытался убрать с помощью просто перевода из одного типа в другой
на скрине эта ошибка да?
что такого приведите к unsigned char * и делов то раз ругается, или измените в ф-ции что бы принимала не unsigned
Цитата Сообщение от tymrfik Посмотреть сообщение
C++
1
int rs_send_icmp (SOCKET s, struct ip_header iph, struct icmp_header icmph, unsigned char * data, int data_length)
что то не совсем ясно зачем тут есть unsigned char * data который в итоге в мэйне NULL
0
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
12.06.2014, 13:53  [ТС] 3
С типами все исправил. Помогите с написанием приложения для сервера? Очень прошу, предзащита на след. неделе.
1. recvfrom должен принять эхо-запрос от клиента (тип 8, код 0)
2. дальше проверки на кол-во запросов + проверка на длину пакета.
3. Отправить на клиент в случае превышения кол-в или длины сообщение ответ - можно использовать эхо-ответ (тип 0, код 0) ????
Как изменить bind, listen и accept для сервера в связи с пунктами (1-3)?
0
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
15.06.2014, 15:11  [ТС] 4
КАК ПЕРЕПИСАТЬ КЛИЕНТ ПОД УТИЛИТУ ПИНГ?????! ЧТОБ ОПРОСЫ ШЛИ И ТРЕБОВАЛИ ОТВЕТА....
0
15.06.2014, 15:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2014, 15:11
Помогаю со студенческими работами здесь

Клиент-Сервер (сокеты)
В общем есть сервер, на него отправляет некую команду клиент , сервер обрабатывает её.... У меня...

Сокеты. Клиент-сервер
Добрый день, начал разбирать сетевое программирование, на одном компе у меня все прекрасно...

Клиент-Сервер Сокеты
Объясните пожалуйста. Пытаюсь пока разобраться как вообще работает. Есть ServerSocket и...

Клиент-сервер сокеты
Здравствуйте, учусь работать с сокетами, только начал! Хочу вникнуть, пока не получается, ожидаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru