|
Moderator - Level 7
Регистрация: 02.05.2009
Сообщений: 894
Провел на форуме: 4297091
Репутация:
2261
|
|
друзья, есть неожиданная, простая с виду проблема...
есть код
Код:
FillChar(addr, SizeOf(sockaddr_in), 0);
addr.sin_family:=AF_Inet;
addr.sin_port:=htons(25);
addr.sin_addr.S_addr:=inet_addr('97.164.93.167');
s:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
Connect(S,addr,SizeOf(TSockAddr));
send(s, sendbuff[1] , sLength(sendbuff), 0);
и есть сокс-4 прокси без авторизации (либо с авторизацией) "194.88.11.123:3987". Как дополнить этот код на дельфи так, чтобы коннект шел через эту прокси? (требуется как send, так и recv)
В гугле немало примеров работы через соксы на Си, и увы ни одного на Дельфи.
На Си есть следующий набор функций для работы с сокс (спасибо m_script):
Код:
//---------------------------------------------------------------------------
#include "Unit2.h"
//---------------------------------------------------------------------------
BOOL CTSocket::CreateSocket()
{
return (sock = socket(AF_INET, SOCK_STREAM, 0)) != NULL;
}
//---------------------------------------------------------------------------
BOOL CTSocket::Connect(unsigned long ip, unsigned short port)
{
SOCKADDR_IN addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = ip;
addr.sin_port = port;
return connect(sock, (SOCKADDR*)&addr, sizeof(addr)) == 0;
}
//---------------------------------------------------------------------------
BOOL CTSocket::Connect(LPCSTR name, unsigned short port)
{
HOSTENT* p = gethostbyname(name);
if(p == NULL)
return FALSE;
return Connect(p->h_addr_list[0], port);
}
//---------------------------------------------------------------------------
int CTSocket::Send(const char* str, int len)
{
return send(sock, str, len, 0);
}
//---------------------------------------------------------------------------
int CTSocket::Recv(char* buf, int max)
{
return recv(sock, buf, max, 0);
}
//---------------------------------------------------------------------------
void CTSocket::Close()
{
closesocket(sock);
}
//---------------------------------------------------------------------------
unsigned long CTSocket::GetHost()
{
SOCKADDR_IN addr;
int cbName = sizeof(addr);
if (getsockname(sock, (SOCKADDR*)&addr, &cbName) == 0)
{
return addr.sin_addr.S_un.S_addr;
}
else
return 0;
}
//---------------------------------------------------------------------------
BOOL CSocksSocket::CreateSocket()
{
if(!pSocket->CreateSocket())
return FALSE;
if(!pSocket->Connect(socks_ip, socks_port))
return FALSE;
buffer[0] = 5; // Ver
buffer[1] = 1; // 1 method
buffer[2] = 0; // no auth
pSocket->Send(buffer, 3);
int n = pSocket->Recv(buffer, 2);
if (n != 2)
return FALSE;
if (buffer[1] != 0)
return FALSE; // method 0 not supported
return TRUE;
}
//---------------------------------------------------------------------------
BOOL CSocksSocket::Connect(unsigned long ip, unsigned short port)
{
buffer[0] = 5; // Ver
buffer[1] = 1; // CONNECT
buffer[2] = 0; // Reserved
buffer[3] = 1; // IPv4
*((unsigned long*)(buffer + 4)) = ip;
*((unsigned short*)(buffer + 8)) = port;
pSocket->Send(buffer, 10);
int n = pSocket->Recv(buffer, 10);
if (n != 10)
return FALSE;
if (buffer[1] != 0)
return FALSE; // Can't connect
if (buffer[3] != 1)
return FALSE; // Будем требовать, чтобы нам сказали IP, а не что-нибудь другое.
l_ip = *((unsigned long*)(buffer + 4));
return TRUE;
}
//---------------------------------------------------------------------------
BOOL CSocksSocket::Connect(LPCSTR name, unsigned short port)
{
buffer[0] = 5;
buffer[1] = 1;
buffer[2] = 0;
buffer[3] = 3; // Domain name
int m = strlen(name);
buffer[4] = m; // Length byte
memcpy(buffer+5, name, m); // Копируем строку без завершающего нуля
*((unsigned short*)(buffer + 5 + m)) = port;
pSocket->Send(buffer, m + 7);
int n = pSocket->Recv(buffer, 10);
if (n != 10)
return FALSE;
if (buffer[1] != 0)
return FALSE;
if (buffer[3] != 1)
return FALSE; // Будем требовать, чтобы нам сказали IP, а не что-нибудь другое.
l_ip = *((unsigned long*)(buffer + 4));
return TRUE;
}
//---------------------------------------------------------------------------
int CSocksSocket::Send(const char* str, int len)
{
return pSocket->Send(str, len);
}
//---------------------------------------------------------------------------
int CSocksSocket::Recv(char* buf, int max)
{
return pSocket->Recv(buf, max);
}
//---------------------------------------------------------------------------
void CSocksSocket::Close()
{
pSocket->Close();
}
//---------------------------------------------------------------------------
unsigned long CSocksSocket::GetHost()
{
return l_ip;
}
//---------------------------------------------------------------------------
может у кого-то есть аналог на Дельфи?
"Переписать" прошу не предлагать. Если совсем будет тяжко - перепишу, но т.к. я не знаю Си, делать это очень не хочется. Не верится, что нет ничего готового и уже не дельфи.
За помощь отблагодарю плюсегами
Последний раз редактировалось ErrorNeo; 19.03.2010 в 23:04..
|