Решил разработать локальный прокси сервер, для просмотра и контроля трафика. Прочитал документацию, реализовал как там описано. Получаю соединение к серверу, подключаюсь к указанному порту и адресу другим сокетом и возвращаю сообщение что запрос предоставлен, начинаю читать данные клиента и переотправлять куда надо, но клиент ничего не отправляет. Подскажите пожалуйста где моя ошибка и что я делаю не правельно.
#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();
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей