Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 16.02.2018
Сообщений: 4

Socks4 работа с локальной сетью

23.04.2019, 17:16. Показов 1389. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!!
Решил разработать локальный прокси сервер, для просмотра и контроля трафика.
Прочитал документацию, реализовал как там описано.
Получаю соединение к серверу, подключаюсь к указанному порту и адресу другим сокетом и возвращаю сообщение что запрос предоставлен, начинаю читать данные клиента и переотправлять куда надо, но клиент ничего не отправляет.
Подскажите пожалуйста где моя ошибка и что я делаю не правельно.

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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include <QCoreApplication>
 
#include <stdio.h>
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdlib.h>
#include <iostream>
 
 
#define DEFAULT_BUFLEN 1024
#define PORT 1080
#define REQUEST 15
 
#define SOCKS4 0x04
 
    //структура приветствия клиента
    struct request{
        BYTE version;
        BYTE conection;
        u_short port;
        u_long addr;
    };
 
    //ответ сервера
    struct answer{
        BYTE nullByte;
        BYTE ans;
        u_short twoByte;
        u_long fourByte;
 
    };
 
    //проверка и вывод приветствия
    bool check(request r)
    {
 
        if(r.version == 0x04)
            std::cout << 4 << std::endl;
        else
        {
            std::cout << "Invalid socks version/n/n";
            return false;
        }
 
        if(r.conection == 0x01)
            std::cout << "1: TCP/IP connection" << std::endl;
        else
            std::cout << "2: set TCP/IP protocol" << std::endl;
 
        std::cout << htons(r.port) << std::endl;
        //inet_ntop(AF_INET, )
        std::cout << inet_ntoa((in_addr&)r.addr) << std::endl;
 
        return true;
    }
 
    //работа с клиентом
    void socks(SOCKET s)
    {
        char buff[DEFAULT_BUFLEN] = "";
        request re;
        char req[sizeof (re)] = "";
 
        //структура приветствия клиента
        recv(s, req, sizeof(req), NULL);
 
        std::cout << req << std::endl;
        re = (request&)req;
 
        if(!check(re))
            return;
 
 
        //--------* ANSWER *----------//
        answer ans;
        ans.nullByte = NULL;
        ans.ans = 0x5A;
        ans.twoByte = re.port;
        ans.fourByte = re.addr;
 
        char ansBuff[sizeof(ans)] = "";
        memcpy(ansBuff, &(char&)ans, sizeof(ans));
 
 
        sockaddr_in paddr;
        ZeroMemory(&paddr, sizeof (paddr));
 
        paddr.sin_family = AF_INET;
        paddr.sin_port = re.port;
        paddr.sin_addr.s_addr = re.addr;
        
        SOCKET socky = socket(AF_INET, SOCK_STREAM, NULL);
        
        //соединение по указанным данным
        if(connect(socky, (sockaddr*)&paddr, sizeof (paddr)) != 0)
        {
            std::cout << "Connection failed!" <<std::endl;
            return;
        }
 
        //ответ клиенту
        send(s, ansBuff, sizeof(ansBuff), NULL);
 
        //цыкл переотправки сообщений
        while(true)
        {
            recv(s, buff, sizeof(buff), NULL);//сообщение клиента
 
            if(strlen(buff) != 0)
            {
                std::cout <<"\nbuffer:\n" << (unsigned short&)buff << std::endl;
                send(socky, buff, sizeof(buff), NULL);//пере адрисация
            }
            memset(&buff[0], 0, sizeof(buff));//очитска буфера
            recv(socky, buff, sizeof(buff), NULL);//получение данных клиента
 
 
            if(strlen(buff) != 0)
            {
                std::cout <<"\nbuffer:\n" << (unsigned short&)buff << std::endl;
                send(s, buff, sizeof(buff), NULL);//отправка данных клиенту
            }
            memset(&buff[0], 0, sizeof(buff));//очитска буфера
        }
    }
 
 
 
 
 
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    WSADATA wData;
    if(WSAStartup(MAKEWORD(2,2),&wData) != 0 )
    {
        return 1;
    }
 
    //инициализация данных прокси
    sockaddr_in maddr;
    ZeroMemory(&maddr, sizeof (maddr));
 
    maddr.sin_family = AF_INET;
    maddr.sin_port = htons(PORT);
    maddr.sin_addr.s_addr = inet_addr("127.0.0.1");
 
    
    SOCKET sock = socket(AF_INET, SOCK_STREAM, NULL);
 
    bind(sock, (sockaddr*)&maddr, sizeof(maddr));
    listen(sock, SOMAXCONN);
    std::cout << "Listen:\n";
 
    char buff[DEFAULT_BUFLEN] = "";
    int sizeofmaddr = sizeof(maddr);
    
    //список соединений
    SOCKET ac[100];
 
 
    //*-----*-----*//CONNECTING//*-----*-----*//
    for(int i = 0; i < 100; ++i){
 
        ac[i] = accept(sock, (sockaddr*)&maddr, &sizeofmaddr);
 
        if(ac[i] == 0) {
            std::cout << "No didn't conected" <<std::endl;
        } else {
            std::cout << "Is conected on socket: addr::" << std::endl;
            //новый поток обработки соединения
            CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)socks, (LPVOID)(ac[i]), NULL, NULL);
 
        }
    }
 
    return a.exec();
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.04.2019, 17:16
Ответы с готовыми решениями:

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

Delphi 7 добавление в блокнот, и работа с локальной сетью
Уважаемые программисты, я не силён в данной сфере и прошу у вас помощи. Цель: имеется текстовый файл который располагается в локальной...

Как создать сетевой мост между виртуальной сетью WI-FI и локальной сетью
Цель: ноутбуки в организации, подключенные к локальной сети шнуром, сделать точками доступа WI-FI. Чтобы пользователи, подключенные к этим...

7
33 / 26 / 7
Регистрация: 06.03.2019
Сообщений: 76
23.04.2019, 17:28
гуглим без кавычек "WORD g_ProxyPort = SOCKS5PROXYPORT;"
1
0 / 0 / 0
Регистрация: 16.02.2018
Сообщений: 4
23.04.2019, 17:37  [ТС]
углим без кавычек "WORD g_ProxyPort = SOCKS5PROXYPORT;"
надеюсь это не шутка, ибо гугыл показывает лишь одну ссылку, и там нет ничего касательно программирования
0
33 / 26 / 7
Регистрация: 06.03.2019
Сообщений: 76
23.04.2019, 17:58
не шутка, там пример кода в программе 2000 года, Сэра Дистика из 'Культа дохл. коровы' коннективаемого к серваку SOCKS5
- если нет возможности просмотра кода ( то скажите - видимо Дистик не обидется, что выложу здесь

Добавлено через 5 минут
вот линк на прогу - сохранить как...
http://www.decuslib.com/decus/... nbname.cpp
1
0 / 0 / 0
Регистрация: 16.02.2018
Сообщений: 4
23.04.2019, 19:27  [ТС]
конечно спасибо, но у меня другая версия протокола, да и в коде на 2500+ строк мне тяжело разобратся
0
33 / 26 / 7
Регистрация: 06.03.2019
Сообщений: 76
23.04.2019, 20:15
да не вопрос, - пожалуйста!
1
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
24.04.2019, 05:42
Цитата Сообщение от Good_bug Посмотреть сообщение
C++
1
re = (request&)req;
Цитата Сообщение от Good_bug Посмотреть сообщение
C++
1
&(char&)ans
это что такое?
Цитата Сообщение от Good_bug Посмотреть сообщение
paddr.sin_port = re.port;
Цитата Сообщение от Good_bug Посмотреть сообщение
paddr.sin_addr.s_addr = re.addr;
htons + htonl?
Цитата Сообщение от Good_bug Посмотреть сообщение
strlen(buff)
неверно.
strlen ищет в буфере нулевой байт, из сетевого сообщения он может приходить хоть первым и тогда strlen выдаст 0. надо смотреть на то, что возвращает функция recv, а конкретнее она возвращает кол-во прочитанных из сокета байт. почитайте её описание на msdn.
https://docs.microsoft.com/en-... turn-value
0
0 / 0 / 0
Регистрация: 16.02.2018
Сообщений: 4
24.04.2019, 12:03  [ТС]
C++
1
re = (request&)req;
Преобразую приветствие клиента в структуру для удобного хранения

C++
1
&(char&)ans
Преобразование ответа клиенту из структуры в строку

C++
1
paddr.sin_port = re.port;
C++
1
paddr.sin_addr.s_addr = re.addr;
в новую структуру sockaddr_in передаю порт и адрес для подключения, в преобразование структур нет необходимости, по скольку клиент их преобразовал перед отправкой.

Запрос клиента и ответ ему отправляются без искажений, проверял пакеты сторонней прогой, там и протокол был указан как socks, но клиент после получения ответа ничего не отправлял
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.04.2019, 12:03
Помогаю со студенческими работами здесь

Проблемы с локальной сетью
Добрый вечер! Есть публичная сеть с компьютерами 192.168.1.250, 192.168.1.17. Нужно стало подключить третий компьютер. Так как на...

Проблемы с локальной сетью
Локальная сеть ПК(А) Пк(Б) и коммутатор. Сеть равноправная на каждом ПК было настроено Сетевое подключение розданы IP в ручную и маска...

Проблема с локальной сетью
Добрый вечер Форумчане! У меня вот такая трабла которая мучает меня уже второй день. Купил себе ноутбук пришел к другу, подключился к...

Проблема с локальной сетью
Есть устройства, ноутбук и пк !БЕЗ! WiFi свистка, на обоих стоит десятка, на одном LTSB, на другом LTSC. На ноутбуке понятное дело...

Заковыка с локальной сетью
Возникла проблема с локальной сетью(подключена к роутеру). На иконке подключения красный крест. Захожу в изменение парвметров...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru