Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   socks5 class (https://forum.antichat.xyz/showthread.php?t=102748)

St0nX 23.01.2009 21:19

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


Время: 11:58