Прога My Proxy

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by <Cyber-punk>, 13 Nov 2009.

  1. <Cyber-punk>

    <Cyber-punk> Smash the Stack

    Joined:
    1 Oct 2009
    Messages:
    658
    Likes Received:
    315
    Reputations:
    430
    _________________________
    2 people like this.
  2. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    1) НА WinAPI смотрелось бы лучше. Чем на VCL
    2) VCL тут реально лишнее. Потому как потоки можно и через CreateThread создавать
    3) Если ошибка, то лучше выводи её в лог. (хотябы в мемо) а не сообщением. Потому как при глобальнмо сбое посыпится куча их
    4) когда пробуеш получить HTTP заголовок то лучше ставь таймаут на Recv. Чтобы он не висел до посинения. также сразу получай длинну считанных данных чтобы не обрабатывать пустой буфер
    5) бывают случае когда HTTP запрос больше килобайта. Или приходит в виде двух и более пакетов. ТАк что считывай в цикле до тех пор пока не будет crlf 2 раза
    6) _request:=string(_buff); - ниесть гуд.
    7) адрес сервака береш из Host - а он не всегда может быть заполнен.
    Так что желательно данные брать из первой стоки (то что после GET/POST)
    8) Error 400: Invalid header и тому подобные вешь - это не правильно.
    лучше сразу по протоколу всё делай. типа
    HTTP/1.0 400 Bad Request
    HTTP/1.0 502 Bad Gateway
    итд
    9) когда создаеш сокет, то проверяй его на ошибку. бывают случае что сокет не создается
    10)
    Code:
     //Соединение с сервером
     if connect(_srvSocket, _srvAddr, sizeof(_srvAddr))=SOCKET_ERROR then
      begin
       SendStr(_Client, '<h1>Error 404: NOT FOUND</h1>');
       exit;
      end;
    
    А кто будет сокет закрывать клиента? и сокет для коннекта к серваку.
    11)
    Code:
    //Если нам подсунули обычный ip, то просто преобразовывем
    //его к нужному виду
     if name[4]='.' then
      _inAddr.s_addr := inet_addr(PChar(name))
     else
    
    А если у меня адрес будет типа xx.xxx.xxx.xxx
    То проверка обломается. Также обломается и имя типа
    2ip.com

    Так что просто делай inet_addr сразу
    а потом смотри что она вернула. Если ошибку, то тогда резолвить
    12)
    Code:
    procedure TClientThread.SendStr(s: TSocket; str: string);
    var
     _buff: array [0..255] of char;
     _temp: AnsiString;
    begin
    //Добавляем символы конца строка
     _temp :=str+#13+#10;
    //Заполняем _buff
     CopyMemory(@_buff, PChar(_temp), Length(_temp));
    //отправляем серверу
     send(s, _buff, Length(_temp), 0);
    end;
    
    Это вообще ниесть гуд. Зачем ты копируеш? Лучше бы сразу слал строку.
    примерно так: типа
    send(s, _temp[1], length(_temp),0);

    Более подробно влом смотреть. Но и этого ужа достаточно для проведения больших работ по исправлению итд итп. Ну а так можно поставить +1 за старанее
     
    #2 slesh, 13 Nov 2009
    Last edited: 13 Nov 2009
    2 people like this.
  3. <Cyber-punk>

    <Cyber-punk> Smash the Stack

    Joined:
    1 Oct 2009
    Messages:
    658
    Likes Received:
    315
    Reputations:
    430
    Понял.Исправлю.
     
    _________________________