Программа запускающая прокси сервер на вашем компе. Написана на Delphi 7. Прога : http://tortop.msk.ru./MyProxy.exe Исходники : http://tortop.msk.ru./myproxy.zip
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 за старанее