Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

17.03.2010, 23:04
|
|
Участник форума
Регистрация: 18.07.2009
Сообщений: 278
Провел на форуме: 3055344
Репутация:
259
|
|
А на счет того что вам втирали в университете, это ИМХО не фига, потому что все завит от условия задачи
я ей тоже самое втирал)))))) но она сцук все равно заставила переделать))))
|
|
|

17.03.2010, 23:06
|
|
Участник форума
Регистрация: 07.02.2010
Сообщений: 189
Провел на форуме: 870084
Репутация:
79
|
|
Я в школе еще )) Так что тут некому втирать( сам больше учителей знаю )..... А насчет обращения к элементам, а что измениться если будет 500 элементов?
|
|
|

17.03.2010, 23:10
|
|
Познающий
Регистрация: 17.02.2010
Сообщений: 45
Провел на форуме: 195184
Репутация:
47
|
|
fenixelite...ничего не будет, программа будет корректно работать, только повторяю, значения элементов, а не количество элементов...количество элементов может быть столько, сколько максимальное значение типа, и их значение тоже должно быть в диапазоне типа, который указывался в начале
var
a: byte (Shortint, Word, Integer, Longint, Int64(в делфи))
У каждого типа свой диапазон значений
Последний раз редактировалось Soherox; 17.03.2010 в 23:14..
|
|
|

19.03.2010, 12:09
|
|
Участник форума
Регистрация: 02.02.2010
Сообщений: 107
Провел на форуме: 612028
Репутация:
28
|
|
просветите в чем проблема..
если из коммандной строки запускать
dir c:\ /a:d /b > c:\list.txt
, то все работает отлично, а если в делфи вот так:
shellexecute(0,nil,pchar('dir'),pchar('c:\ /a:d /b > c:\list.txt'),nil,0);
то нифига не работает! в чем проблема?
|
|
|

19.03.2010, 12:18
|
|
Участник форума
Регистрация: 02.07.2008
Сообщений: 132
Провел на форуме: 1035284
Репутация:
52
|
|
[stranger]
попробуй так
Код:
shellexecute(0,nil,pchar('cmd.exe'),pchar(' /C dir c:\ /a:d /b > c:\list.txt'),nil,0);
да и dir это команда консоли а не программа то есть ты должен запустить консоль (cmd.exe) и передать ей команду с параметрами
Код:
/C Выполнение указанной команды (строки) с последующим завершением.
Последний раз редактировалось transserg; 19.03.2010 в 12:21..
|
|
|

19.03.2010, 12:31
|
|
Участник форума
Регистрация: 02.02.2010
Сообщений: 107
Провел на форуме: 612028
Репутация:
28
|
|
мда.. это ж надо было так проглупить..  спать больше надо.. спасибо большое!
что интересно этот код работал! непонятно как, но файл появлялся..
|
|
|

19.03.2010, 22:23
|
|
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..
|
|
|

19.03.2010, 23:02
|
|
Moderator - Level 7
Регистрация: 02.05.2009
Сообщений: 894
Провел на форуме: 4297091
Репутация:
2261
|
|
нет, про цепочку я ничего не говорил.
Мне просто нужно настроить работу приложения через (одну) сокс-4 прокси.
уточню:
моё приложение работает по протоколу smtp, потому задать "адрес" в строчке "host" (как это было бы при http запросе) нет возможности.
Надо как-то по-другому объяснить соксу, куда именно он должен дальше слать запрос (destination ip&port)
Последний раз редактировалось ErrorNeo; 19.03.2010 в 23:09..
|
|
|

19.03.2010, 23:56
|
|
Постоянный
Регистрация: 12.05.2009
Сообщений: 395
Провел на форуме: 4761503
Репутация:
229
|
|
errorneo, вообщем вот: delphikingdom.info/asp/answer.asp?IDAnswer=56157
просмотри эту тему и тебе все станет ясно (заранее говорю: вся фишка в TSOCKS4_REQUEST)(первый send - структуры TSOCKS4_REQUEST, которая дает знать соксу что мы имеем дело с ******** данными, второй сенд - уже нормальный пакет посылаем (конкретно не имел дело с сокс протокол, так что это все на догадках и предположениях))
не понял? попробуй погуглить на структуру TSOCKS4_REQUEST + delphi (или же лучше всего - описание протокола SOCKs в руки  )
Последний раз редактировалось wolmer; 20.03.2010 в 00:02..
|
|
|

20.03.2010, 00:46
|
|
Moderator - Level 7
Регистрация: 02.05.2009
Сообщений: 894
Провел на форуме: 4297091
Репутация:
2261
|
|
ответ на мой вопрос:
FillChar(addr, SizeOf(sockaddr_in), 0);
addr.sin_family:=AF_Inet;
addr.sin_port:=htons(3987);
addr.sin_addr.S_addr:=inet_addr('194.88.11.123'); //да, логично кто конектимся к прокси
s:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
Connect(S,addr,SizeOf(TSockAddr));
sendbuff:=
{BYTE version - 04} chr(4) +
{01 - TCP Connect} chr(1) +
{тут порт, он у нас 0025} chr(0)+chr(25) +
{тут ip, который 97.164.93.167}chr(97)+chr(164)+chr(93)+chr(167) +
{тут неведомая ***я} chr(77)+chr(79)+chr(90)+chr(0);
send(s, sendbuff[1] , Length(sendbuff);, 0);
sendbuff:= "нужный запрос"
send(s, sendbuff[1] , sLength(sendbuff), 0);
//да, по идее нужно писать структуру и отправлять её, но можно и так.. по-суровому. Хотя разницы, в общем-то, нет. Просто так выглядит примитивнее
Последний раз редактировалось ErrorNeo; 20.03.2010 в 00:56..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|