Показать сообщение отдельно

  #7  
Старый 19.03.2010, 22:23
ErrorNeo
Moderator - Level 7
Регистрация: 02.05.2009
Сообщений: 894
Провел на форуме:
4297091

Репутация: 2261


Отправить сообщение для ErrorNeo с помощью ICQ
По умолчанию

друзья, есть неожиданная, простая с виду проблема...
есть код
Код:
     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..
 
Ответить с цитированием