Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
19 / 19 / 5
Регистрация: 05.12.2008
Сообщений: 157
1

Туннелирование сокетами, разных протоколов

16.06.2012, 09:51. Показов 2391. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте многопочтенные!
Нужна ваша консультация, по реализации следующей задачи: Необходимо создать туннелирование пакетов, если конкретно, то IPv6 заголовок + Данные упаковывается в заголовок IPv4 и передается по UDP. Приемник пакета делает декапсуляцию и получает IPv6'й пакет. Задумал это сделать через сокеты, на Linux. Закопавшись в литературу и кучу мануалов до сих пор для себя не осознал решения. Думалось практически это реалезуется благодаря низкоуровневым сокетам (SOCK_RAW), где получится указывать в заголовках маркеры фрагментации и туннеля. Но мало того что про низкоуровневые сокеты очень мало материала, по SOCK_RAW для IPv6 совершенно ни чегошеньки не нашел.
После того как натыкнулся в книге на текст: "Структуры адреса сокета используются только на данном узле: сама структура не передается между узлами, хотя определенные поля (например IP-адреса и порта) используются для соединения." Совершенно отчаялся и решил спросить у Вас, реально ли то что я хочу через сокеты, какие могут быть альтернативы в принципе (кроме сокетов, мало себе представляю сетевое программирование). Подскажите Литературу, ссылки, любая информация будет полезной ибо сроки как всегда жмут. Заранее большое спасибо.

Добавлено через 13 часов 0 минут
Товарищи! Кажется нашёл способ тунелирования через сокеты, путём сериализации. К сожалению пока что рабочего кода нет, у кого есть идеи, пожалуйста делитесь.
В итоге, создается два сокета, AF_INET и AF_INET6; Сокет AF_INET6 проходит сериализацию (перевод структуры адреса и сокета в побитовую последовательность) + данные (скорей всего тоже икапсулированые). Полученый буфер естествеено маркеруется заголовками (объем данных, где заканчивается сокет, начинаются данные и т.д.), все это передается через сокет AF_INET, SOCK_DGRAM. На конечном узле переданый буфер десериализуется, по его части востонавливается struct in6_addr + данные.
p.s.
Пока есть клиент/сервер IPv6 и клиент/сервер IPv4, как сделаю сериализацию IPv6 и запихаю это в IPv4 - будет исходик, поделюсь = \
есть советы по приведению структуры в биты?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.06.2012, 09:51
Ответы с готовыми решениями:

Туннелирование, ака соксификация
Я хочу реализовать некую программку, которая бы туннелировала трафик приложений, запущенных на...

Туннелирование
Доброго времени суток!!!!! такой вопрос есть три подсети, настроена динамическая маршрутизация,...

MySqlConnection ssh-туннелирование
try { //string ConnetStr = "SERVER=login.mysql:3306...

Туннелирование через SSH
В общем, есть следующая задача: существует сайт, который доступен только из определенной сети. На...

3
19 / 19 / 5
Регистрация: 05.12.2008
Сообщений: 157
18.06.2012, 01:21  [ТС] 2
Друзья есть наброски, каждую строку комментировал как осознал, пожалуйста оцените если где не так понимаю поправьте, буду рад.
С сериализацией задачка для меня пока слижком сложная, по срокам не успеваю разобраться, решил попробовать воспользоваться memcpy.
В итоге столкнулся с проблемой, что структура упакованая в массив есть, она печатается со стороны клиента. Со стороны сервера этот массив должен приниматься, но судя по выводу ничего нет, пусто. Пожалуйста помогите.

Клиент:
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
#include <arpa/inet.h>
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
 
struct UdpHeader
{
  u_short src_port;
  u_short targ_port;
  u_short length;
  u_short checksum;
};
 
using namespace std;
 
int main()
{
  int sock6, sock4, sockmem;
  char ip6[INET6_ADDRSTRLEN]; // IPv6-адрес
  char pack[1024];
  
  struct sockaddr_in sa4; // IPv4
  struct sockaddr_in6 sa6; // IPv6
  struct UdpHeader header; // UDP
  
  sock6 = socket(AF_INET6, SOCK_DGRAM, 0); //создаем UDP сокет IPv6
    if(sock6 < 0)
  {
    perror("socket");
    exit(1);
  }
  
  sock4 = socket(AF_INET, SOCK_RAW, IPPROTO_UDP); // создаем сырой сокет IPv4, с редактирвоанием UDP заголовка
  if(sock4 < 0)
  {
    perror("socket");
    exit(2);
  }
  
  inet_pton(AF_INET6, "::1", &(sa6.sin6_addr)); // функцией заполняем структуру IPv6
 
  //sa6.sin6_addr = in6addr_any;
  //sa6.sin6_family = AF_INET6;
  //sa6.sin6_port = htons(3447);  
  
  sockmem = sizeof(sa6);
  
  
  char *buf = new char[sockmem]; // создем массив размером со структуру
  memset(buf, 0, sockmem); // инициализируем массив буфера
  memset(pack, 0, 1024); // инициализируем массив пакета 
  memcpy((void*)buf, (void*)&sockmem, sockmem); //копируем монолит памяти структры в массив буфера
  
  
  header.targ_port = htons(3447); // задаем пакету порт на UDP заголовок
  header.length = htons(sizeof(header) + sizeof(buf)); // ставим размер пакета буфер + заголовок
  header.checksum = 0; // опустим контрольную сумму учитывая протокол UDP
 
   memcpy((void *) pack, (void *)&header, sizeof(header)); // сохраняем в пакет заголовок UDP
   memcpy((void *)(pack+sizeof(header)), (void*)&buf, sizeof(buf)); // добавляем в пакет+заголовок буфер со структурой 
  
  sendto(sock4, buf, sizeof(pack), 0, (struct sockaddr *)&sock4, sizeof(sock4)); // отправляем пакет по пути сокета IPv4
  
      close(sock4); // закрываем массив
      
    cout << "Massiv:\n";          // посмотрим какой там массив получился
     for(int i=0; i < 1024; i++)
    {
    cout << pack[i] << " ";
    }
 
    return 0;
}

Сервер:
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
#include <arpa/inet.h>
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
 
using namespace std;
 
int main()
{
  int sock6, sock4;
  char ip6[INET6_ADDRSTRLEN]; // IPv6-адрес
  
  struct sockaddr_in sa4; // IPv4
  struct sockaddr_in6 sa6; // IPv6
  char buf[1024];  //Буфер данных 
  int bytes_read; 
  
  sock4 = socket(AF_INET, SOCK_DGRAM, 0); //создаем сокет IPv4
  if(sock4 < 0)
  {
    perror("socket");
    exit(1);
  }
   
  sa4.sin_family = AF_INET; //указываем структуре сокета домен v4
  sa4.sin_port = htons(3447); //указываем структуре порт для прослушки
  sa4.sin_addr.s_addr = htonl(INADDR_ANY); // адрес прослушки любой интерфейс этого узла
  
  if(bind(sock4, (struct sockaddr *)&sa4, sizeof(sa4)) < 0) // биндим сокет
  {
    perror("bind");
    exit(2);
  }  
    
    memset(buf, 0, 1024); //инициализируем слушающий буфер
    buf[sock4] = '\0';  // хз что такое это было в одном из мануалов
    while(1)            // делаем цикл для слушания
  {
    bytes_read = recvfrom(sock4, buf, 1024, 0, NULL, NULL); // ловим приходящий сокет и записываем в buf
    
    cout << "\n bla bla";
    for(int i=0; i < 1024; i++) // сморим что пришло
    {
      cout << buf[i];
    }
    cout<<endl;
  
  }
  
  return 0;
}
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
18.06.2012, 14:12 3
Цитата Сообщение от Bumerang Посмотреть сообщение
Но мало того что про низкоуровневые сокеты очень мало материала, по SOCK_RAW для IPv6 совершенно ни чегошеньки не нашел.
Есть хороший набор из 32 уроков по raw-сокетам на сайте "Первые шаги"
1
19 / 19 / 5
Регистрация: 05.12.2008
Сообщений: 157
18.06.2012, 19:10  [ТС] 4
Спасибо, Van111. Пристально изучим.
Люди добрые посоветуйте, принцип сериализации, в интернете их много хочу Вашего совета, для передачи структуры по сети. Альтернативы методу memcpy есть? По возможности на «пальчиках» показать, было бы тогда все значительно оперативней ^_^
0
18.06.2012, 19:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2012, 19:10
Помогаю со студенческими работами здесь

Реферата по теме. Электропроводность в аморфных сверхрешетках. Резонансное туннелирование и прыжковая подвижно
Помогите пожалуйста с рефератом,в инете искал,никакой информации полезной не нашел,и литературы не...

Стек протоколов
Добрый день. Насколько я понимаю существует 4 стека протоколов. OSI TCP/IP IPX/SPX NetBIOS/SMB. Что...

Redistribute Протоколов
Скажите как правильно настроить перераспределение статики в eigrp, rip??

Стек протоколов
Добр-ый день. Хотел уточнить термин &quot;стек протоколов&quot;. Стек протоколов - это набор протоколов, по...


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

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