<Cyber-punk>
13.11.2009, 15:56
Программа запускающая прокси сервер на вашем компе.
Написана на 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)
//Соединение с сервером
if connect(_srvSocket, _srvAddr, sizeof(_srvAddr))=SOCKET_ERROR then
begin
SendStr(_Client, '<h1>Error 404: NOT FOUND</h1>');
exit;
end;
А кто будет сокет закрывать клиента? и сокет для коннекта к серваку.
11)
//Если нам подсунули обычный ip, то просто преобразовывем
//его к нужному виду
if name[4]='.' then
_inAddr.s_addr := inet_addr(PChar(name))
else
А если у меня адрес будет типа xx.xxx.xxx.xxx
То проверка обломается. Также обломается и имя типа
2ip.com
Так что просто делай inet_addr сразу
а потом смотри что она вернула. Если ошибку, то тогда резолвить
12)
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 за старанее
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot