socks5 class

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by St0nX, 23 Jan 2009.

  1. St0nX

    St0nX Elder - Старейшина

    Joined:
    19 May 2007
    Messages:
    257
    Likes Received:
    46
    Reputations:
    0
    Вообщем писал класс для работы с socks5 возникли проблемы тут(файл socks5.cpp)

    Code:
    if(recv(s, re, sizeof(re), 0)!=-1)
    рекв принимает 0 байт, но когда все те же действия делал в main все работало как часы.
    вот исходники:

    socks5.cpp
    Code:
    #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
    Code:
    #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 код строго не судите. Класс сырой.