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

255
09 февраля 2020, 14:40

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

#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();
}
READ ALSO
Проблема при использовании getline при считывании с файла [дубликат]

Проблема при использовании getline при считывании с файла [дубликат]

Суть проблемы в следующем, я хочу считать объект b с текстового файла, для удобства блок этого объекта выделен плюсамиИсключений не вызывает,...

284
Преобразовать массив по формуле

Преобразовать массив по формуле

Нужно преобразовать массив по формуле b(i) = (a(i) - a(i-1))/i В теории, мой код должен работаь, но что то не так

306
Последовательность нулей и единиц

Последовательность нулей и единиц

В двухбайтной ячейке памяти записана последовательность нулей и единицС помощью битовых операций переставьте биты так чтобы сначала шли...

265
Динамические массивы в stl

Динамические массивы в stl

Хочу создать квадратную матрицу с помощью stl и чтобы пользователь сам заполнял массивПока код такой:

290