SOCKS4 Server

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by razzzar, 31 Dec 2007.

  1. razzzar

    razzzar Elder - Старейшина

    Joined:
    16 Jun 2007
    Messages:
    92
    Likes Received:
    75
    Reputations:
    5
    Написал простенький сокс4 сервер. Может кому-то понадобится.

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

    + исходники

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

    Скачать
     
    #1 razzzar, 31 Dec 2007
    Last edited: 31 Dec 2007
    7 people like this.
  2. ElteRUS

    ElteRUS Elder - Старейшина

    Joined:
    11 Oct 2007
    Messages:
    367
    Likes Received:
    460
    Reputations:
    93
    Прикольно, огромное спасибо. Буду на досуге разбирать код )
     
  3. Jes

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    С наступающим :)
     
    #3 Jes, 31 Dec 2007
    Last edited: 31 Dec 2007
    2 people like this.
  4. DWORD

    DWORD Elder - Старейшина

    Joined:
    24 Jul 2007
    Messages:
    129
    Likes Received:
    70
    Reputations:
    -36
    Code:
    while ( true )
    Лучше for(;;), вроде даже _Great_ на этом форуме рассказывал почему.
    Code:
    if ( stArgv.bLog == TRUE )
    Сравнивать явно с условием ИСТИНА "считается" плохим тоном здесь, но даже не в этом дело, а в том, что в C++ никто не обещал существование константы TRUE.
    Code:
    uVal = 1;
    ioctlsocket(sockAcc, FIONBIO, &uVal);
    ...
    do
    		nLen = recv(sockData, &cDummy, sizeof ( cDummy ), 0);
    	while ( (nLen > 0) && (cDummy != cCond) );
    
    У вас сервер по временам центральный ЦП не кушает под 100%? Холостой цикл (в общем случае успешный select, который вы сделали по-выше вас не спасет).
    Code:
    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 ненужно писать перед объявлением структуры, имя структуры также является именем соответствующего типа даных.
    Code:
    closesocket(sockClnt);
    shutdown(sockClnt, 0);
    Code:
    closesocket(sockAcc);
    shutdown(sockAcc, 0);
    ...


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

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Не представляю, о чем там можно написать и почему что-то лучше.
    А все остальное - да, согласен, быдлокодинг... Особенно про == TRUE.
     
  6. __mad

    __mad Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    ну наверн потомучто экономится пару байт : D ну и исчезает бесползное сравнение с тру... : D
     
  7. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    >ну наверн потомучто экономится пару байт : D ну и исчезает бесползное сравнение с тру... : D

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

    я пишу

    Code:
    while (1)
    {
    	__asm nop
    }
    
    и

    Code:
    for (;;)
    {
        __asm nop
    }
    
    а получаю и там и там:

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

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    PS

    но ни один конпелятор тебе не поможет, если ты будешь писать ТАКОЕ
    Code:
    	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

    Если ты все-таки решил юзать виндо-зависимые техники, то время (строкой) получается намного проще, нежели так:
    Code:
    	_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? Нафиг тут оно надо, по два байта хранить на символ?

    А это что?
    Code:
    #pragma comment(lib, "user32.lib")
    #pragma comment(lib, "kernel32.lib")
    #pragma comment(linker, "/SUBSYSTEM:WINDOWS")
    
    Причем, это сорец из журнала "Хакер", который ты переделал в худшую сторону.
     
  9. DWORD

    DWORD Elder - Старейшина

    Joined:
    24 Jul 2007
    Messages:
    129
    Likes Received:
    70
    Reputations:
    -36
    Действительно, невероятно, но факт. while(1) в MSVS при дефолтных настройках оптимизации дает:
    Code:
    0041139E  mov         eax,1 
    004113A3  test        eax,eax 
    004113A5  je          wmain+2Ah (4113AAh) 
    004113A7  nop              
    004113A8  jmp         wmain+1Eh (41139Eh)
    А for(;;) :

    Code:
    0041139E  nop              
    0041139F  jmp         wmain+1Eh (41139Eh) 
     
  10. presidentua

    presidentua милиционер Античата

    Joined:
    4 Nov 2007
    Messages:
    305
    Likes Received:
    236
    Reputations:
    15
    Во теоретики! :) Один байт економии это пипец как много, особенно если он для СоксСервера. :) Начитавшись советов больше не подойду к С и Делфи, буду только на асме кодить. Клянусь, клянусь, клянусь :)
     
    1 person likes this.
  11. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    DWORD, да, но во-первых, у меня к студии прикручен Intel-конпелятор, во-вторых, я всегда собираю с оптимизацией, которой у него очень даже дофига.
    Ну а вообще да. В общем случае лучше использовать for(;;) ...

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

    Во-первых, не один байт, а несколько, что зависит от конфигурации/оптимизации етц. Во вторых, байты тут не при чем, тут важна скорость и кол-во инструкций. Промотай два цикла пару сотен миллионов раз и срвни ... Тут это не важно, но в другом случае - очень важно будет.
     
    #11 KEZ, 3 Jan 2008
    Last edited: 3 Jan 2008
    5 people like this.
  12. presidentua

    presidentua милиционер Античата

    Joined:
    4 Nov 2007
    Messages:
    305
    Likes Received:
    236
    Reputations:
    15
    Вот, вот. я про то и хотел сказать. Просто начали грузить чела про оптимизацию СоксСервера. Вот если бы он игрушку писал или переборщик пароля или еще что-то в этом роде, то да.

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

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

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    Да странно это. Человек делится исходниками сокс-а а ему "парят" про оптимизацию на С-и при чем тут оптимизация? Если бы кто-то (кому не жалко.... мну жалко) выдал тут код на асинхронных сокетах и обьяснял бы ему в чем асинхронные лучше блокирующих, то тогда бы - ЭТО БЫЛО ПО ДЕЛУ!

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

    reversys Elder - Старейшина

    Joined:
    21 Nov 2007
    Messages:
    139
    Likes Received:
    57
    Reputations:
    7
    Вопросец 1: а эта штучка работает у когонить вообще?

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

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

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

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

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Угу, видно, что давно не спал. А если браузер приконектится к mail.ru и пошлет туда ещё и запрос для yandex.ru, он должен на яндекс попасть автоматом?)
    RFC по socks надо читать. Все что передает клиент после установления конекта идет к целевому серверу. Единственный вариант поменять цель - новый конект.
     
    1 person likes this.