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

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

razzzar 31.12.2007 21:37

SOCKS4 Server
 
Написал простенький сокс4 сервер. Может кому-то понадобится.

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

+ исходники

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

Скачать

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

Цитата:

Сообщение от kez
Не представляю, о чем там можно написать и почему что-то лучше.

ну наверн потомучто экономится пару байт : 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

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


Время: 17:22