PDA

Просмотр полной версии : SOCKS4 Server


razzzar
31.12.2007, 21:37
Написал простенький сокс4 сервер. Может кому-то понадобится.

Умеет парсить коммандную строку для задания параметров порта, адресса для бинда, введения логов.
Справка по параметру --help ( -h ).

+ исходники

С Наступающим! ;)

Скачать (http://rapidshare.com/files/80344036/unksocks4.rar)

ElteRUS
31.12.2007, 21:49
Прикольно, огромное спасибо. Буду на досуге разбирать код )

Jes
31.12.2007, 22:17
С наступающим :)

DWORD
02.01.2008, 02:00
while ( true )
Лучше for(;;), вроде даже _Great_ на этом форуме рассказывал почему.
if ( stArgv.bLog == TRUE )
Сравнивать явно с условием ИСТИНА "считается" плохим тоном здесь, но даже не в этом дело, а в том, что в C++ никто не обещал существование константы TRUE.
uVal = 1;
ioctlsocket(sockAcc, FIONBIO, &uVal);
...
do
nLen = recv(sockData, &cDummy, sizeof ( cDummy ), 0);
while ( (nLen > 0) && (cDummy != cCond) );

У вас сервер по временам центральный ЦП не кушает под 100%? Холостой цикл (в общем случае успешный select, который вы сделали по-выше вас не спасет).
typedef struct tag_SOCKS4_REQUEST
{
BYTE ucVersion;
BYTE ucCommand;
WORD wDestPort;
DWORD dwDestIp;
} SOCKS4_REQUEST;

typedef struct tag_CONFIG_STRUCT
{
int nPort;
u_long ulListen;
BOOL bLog;
} CONFIG_STRUCT;

typedef struct tag_THREAD_ARGV_STRUCT
{
SOCKET sockParam;
sockaddr_in saParam;
BOOL bLog;
} THREAD_ARGV_STRUCT;
В С++ typedef ненужно писать перед объявлением структуры, имя структуры также является именем соответствующего типа даных.

closesocket(sockClnt);
shutdown(sockClnt, 0);
closesocket(sockAcc);
shutdown(sockAcc, 0);
...


----------------------
А вообще мне понравилось, хоть и нет в этом никакого смысла!
----------------------

KEZ
02.01.2008, 03:56
Лучше for(;;), вроде даже _Great_ на этом форуме рассказывал почему.


Не представляю, о чем там можно написать и почему что-то лучше.
А все остальное - да, согласен, быдлокодинг... Особенно про == TRUE.

__mad
02.01.2008, 05:10
Не представляю, о чем там можно написать и почему что-то лучше.
ну наверн потомучто экономится пару байт : D ну и исчезает бесползное сравнение с тру... : D

KEZ
02.01.2008, 06:29
>ну наверн потомучто экономится пару байт : D ну и исчезает бесползное сравнение с тру... : D

конпеляторы уже давно делают параллелизацию кода, оптимизацию под всякие SSE, MMX и конкретные процессоры, выкидывать неиспользуемый код, заменять константы,и ты думаешь, они не выкинут твое сравнение while (1) ?

я пишу


while (1)
{
__asm nop
}


и


for (;;)
{
__asm nop
}


а получаю и там и там:


003918AD > /90 nop
003918AE .^\EB FD jmp short test.003918AD


Собрано с использованием конпелятора Intel C++ 9 (с дефолтной оптимизацией)

KEZ
02.01.2008, 06:41
PS

но ни один конпелятор тебе не поможет, если ты будешь писать ТАКОЕ

for ( int i=0; i<nCount; i++ )
{
if ( (wcscmp(szCmdLine[i], L"--port") == 0) || (wcscmp(szCmdLine[i], L"-p") == 0) && (bPort == FALSE) )
{
stTmpConfig.nPort = _wtoi(szCmdLine[i+1]);
bPort = TRUE;
}

if ( (wcscmp(szCmdLine[i], L"--bind") == 0) || (wcscmp(szCmdLine[i], L"-b") == 0) )
{


далее, почему-то (видимо, для кросс-платформености) юзаются то виндовые типы, то стандартные....
unsigned long __stdcall AccThread
а тут вдруг
BOOL ParseCmdLine

Если ты все-таки решил юзать виндо-зависимые техники, то время (строкой) получается намного проще, нежели так:

_snprintf(szLogText, nLogLenth, "[%s] [%02d-%02d-%02d %02d:%02d:%02d]\r\n%s\r\n", szIp, stTime->tm_year+1900, stTime->tm_mon+1, stTime->tm_mday, stTime->tm_hour, stTime->tm_min, stTime->tm_sec, szText);

а через GetTimeFormat, GetDateFormat

И ещё, почему UNICODE? Нафиг тут оно надо, по два байта хранить на символ?

А это что?

#pragma comment(lib, "user32.lib")
#pragma comment(lib, "kernel32.lib")
#pragma comment(linker, "/SUBSYSTEM:WINDOWS")


Причем, это сорец из журнала "Хакер", который ты переделал в худшую сторону.

DWORD
02.01.2008, 14:27
Действительно, невероятно, но факт. while(1) в MSVS при дефолтных настройках оптимизации дает:

0041139E mov eax,1
004113A3 test eax,eax
004113A5 je wmain+2Ah (4113AAh)
004113A7 nop
004113A8 jmp wmain+1Eh (41139Eh)
А for(;;) :

0041139E nop
0041139F jmp wmain+1Eh (41139Eh)

presidentua
03.01.2008, 00:44
Во теоретики! :) Один байт економии это пипец как много, особенно если он для СоксСервера. :) Начитавшись советов больше не подойду к С и Делфи, буду только на асме кодить. Клянусь, клянусь, клянусь :)

KEZ
03.01.2008, 01:01
DWORD, да, но во-первых, у меня к студии прикручен Intel-конпелятор, во-вторых, я всегда собираю с оптимизацией, которой у него очень даже дофига.
Ну а вообще да. В общем случае лучше использовать for(;;) ...

Но интел все равно крут.


Один байт економии это пипец как много, особенно если он для СоксСервера.


Во-первых, не один байт, а несколько, что зависит от конфигурации/оптимизации етц. Во вторых, байты тут не при чем, тут важна скорость и кол-во инструкций. Промотай два цикла пару сотен миллионов раз и срвни ... Тут это не важно, но в другом случае - очень важно будет.

presidentua
05.01.2008, 15:52
Во-первых, не один байт, а несколько, что зависит от конфигурации/оптимизации етц. Во вторых, байты тут не при чем, тут важна скорость и кол-во инструкций. Промотай два цикла пару сотен миллионов раз и срвни ... Тут это не важно, но в другом случае - очень важно будет.
Вот, вот. я про то и хотел сказать. Просто начали грузить чела про оптимизацию СоксСервера. Вот если бы он игрушку писал или переборщик пароля или еще что-то в этом роде, то да.

Только ты KEZ меня понимаешь :)

А вобще про оптимизацию лучше почитать у Криса Касперского. Он много работает в этом направлении. Респект ему :)

Delimiter
05.01.2008, 23:57
Да странно это. Человек делится исходниками сокс-а а ему "парят" про оптимизацию на С-и при чем тут оптимизация? Если бы кто-то (кому не жалко.... мну жалко) выдал тут код на асинхронных сокетах и обьяснял бы ему в чем асинхронные лучше блокирующих, то тогда бы - ЭТО БЫЛО ПО ДЕЛУ!

А так гон.... бестолковый. Что по вашему проще писать картины или быть критиком?

reversys
09.01.2008, 16:15
Вопросец 1: а эта штучка работает у когонить вообще?

У меня через freecap ничего пахать не захотело.

Вопросец 2: я вот сорец посмотрел, поправьте меня, но помоему там если клиент (браузер) не рвёт соединение после отправки запроса и получения ответа а шлёт новый запрос но уже на другой хост, запрос пойдёт на старый хост и счастья не будет.

ЗЫ я может криво написал... не спал давно :mad:

ЗЗЫ плюс ТС всёравно заслужил.

KEZ
09.01.2008, 16:44
Вопросец 2: я вот сорец посмотрел, поправьте меня, но помоему там если клиент (браузер) не рвёт соединение после отправки запроса и получения ответа а шлёт новый запрос но уже на другой хост, запрос пойдёт на старый хост и счастья не будет.


Угу, видно, что давно не спал. А если браузер приконектится к mail.ru и пошлет туда ещё и запрос для yandex.ru, он должен на яндекс попасть автоматом?)
RFC по socks надо читать. Все что передает клиент после установления конекта идет к целевому серверу. Единственный вариант поменять цель - новый конект.