socks5 class
Вообщем писал класс для работы с socks5 возникли проблемы тут(файл socks5.cpp)
Код:
if(recv(s, re, sizeof(re), 0)!=-1)
рекв принимает 0 байт, но когда все те же действия делал в main все работало как часы.
вот исходники:
socks5.cpp
Код:
#include "socks5.h"
WSADATA _WsaData;
long socks5::dec_hex(int n)
{
static char number[MAXNUMBER];
sprintf(number, "%lx", n);
char null = '\x0';
char * adr_null = &null;
ULONG a = strtoul(number, &adr_null, 16);
return a;
}
int socks5::connect_s(char *proxy_name, int proxy_port, char *host_ip, int host_port)
{
char *Message;
bool flag = false;
if(WSAStartup (0x0101, &_WsaData)!=0)
{return ERR_WSA;}
SOCKADDR_IN anAddr;
anAddr.sin_family = AF_INET;
anAddr.sin_port = htons(proxy_port);
anAddr.sin_addr.S_un.S_addr = inet_addr(proxy_name);
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(connect(s, (struct sockaddr *)&anAddr, sizeof(struct sockaddr))==0)
{
Message = new char[3];
Message[0] = 0x05;
Message[1] = 0x01;
Message[2] = 0x00;
if(send(s, Message, 3, 0)==SOCKET_ERROR)
{
return ERR_SEND;
closesocket(s);
}
memset(Message,0,3);
recv(s, Message, 3, 0);
flag = true;
}
if(flag==true)
if(Message[1])
{
closesocket(s);
return ERR_AUTH;
}
else
{
delete(Message);
Message = 0;
Message = new char[10];
int ip[4];
sscanf(host_ip,"%i.%i.%i.%i",&ip[0],&ip[1],&ip[2],&ip[3]);
Message[0]=0x05;
Message[1]=0x01;
Message[2]=0x00;
Message[3]=0x01;
Message[4]=dec_hex(ip[0]);
Message[5]=dec_hex(ip[1]);
Message[6]=dec_hex(ip[2]);
Message[7]=dec_hex(ip[3]);
Message[8]=0x00;
Message[9]=dec_hex(host_port);
if(send(s, Message, 10, 0)==SOCKET_ERROR)
{
return ERR_SEND;
closesocket(s);
}
memset(Message,0,10);
recv(s, Message, 10, 0);
if(Message[1])
{
closesocket(s);
return ERR_AUTH;
}
}
conn = true;
return 0;
};
int socks5::close_s()
{
closesocket(s);
return 0;
}
char* socks5::send_host(char *data)
{
if(conn == true)
{
char *re;
re = new char[1024];
if(send(s, data, sizeof(data), 0)==SOCKET_ERROR)
{
return (char *)ERR_SEND;
}
else
{
if(recv(s, re, sizeof(re), 0)!=-1)
{
return re;
}
else
{
return (char *)-1;
}
}
}
else
{
return (char *)-1;
}
};
socks5::~socks5()
{
if(conn==true)
closesocket(s);
};
socks5.h
Код:
#include <winsock.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
#define MAXNUMBER 100
#define ERR_AUTH 10;
#define ERR_WSA 11;
#define ERR_SEND 12;
#define DATA_MAX 1024;
extern WSADATA _WsaData;
class socks5
{
protected:
SOCKET s;
bool conn;
public:
~socks5();
int connect_s(char *proxy_name,int proxy_port,char *host_ip,int host_port);
char *send_host(char *data);
int close_s();
private:
long dec_hex(int n);
};
PS код строго не судите. Класс сырой.
|