
16.04.2010, 00:20
|
|
Новичок
Регистрация: 26.11.2009
Сообщений: 20
Провел на форуме: 88440
Репутация:
60
|
|
Сообщение от Nightmarе
Есть функция отправки GET запроса на хост через сокеты, мне нужно сделать её в бесконечном цикле, чтобы она постоянно слала на хост этот запрос.
Но проблема в том, что при реализации этого через библиотеку WinSock запросы успешно выполняются, но и + ко всему на компьютере открывается кучу соединений, в результате чего компьютер попросту намертво виснет.
Вот моя функция:
Код:
function fWSRecv():string;
var
hSocket: TSocket;
hHost: PHostEnt;
hAddr: TSockAddrIn;
hTimeout: TTimeVal;
samzapros,kuda:string;
begin
kuda:='localhost';
samzapros:='GET /log/ass.php' + #13#10 +
'Host: localhost' + #13#10 +
'User-Agent: Mozilla/5.0' + #13#10 +
'Accept: text/html' + #13#10 +
'Accept-Language: ru' + #13#10 +
'Accept-Charset: windows-1251' + #13#10 +
'Connection: close' + #13#10#13#10;
while true do begin
hSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
hHost := gethostbyname(PChar(kuda));
hAddr.sin_family := PF_INET;
hAddr.sin_port := htons(80);
hAddr.sin_addr := pinaddr(hHost^.h_addr^)^;
hTimeout.tv_usec := 0;
hTimeout.tv_sec := mstimeout;
setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, @hTimeout, sizeof(ttimeval));
connect(hSocket, hAddr, SizeOf(hAddr));
Send(hSocket, samzapros[1], length(samzapros), 0);
CloseSocket(hSocket);
end;
end;
Вызываю так:
var
ws:TwsaData;
begin
WSAStartup($101, ws);
fWSRecv;
и всё, куча соединений и т.д... вообще даже приблизительно не знаю, в каком месте у меня ошибка.
PS: тока просьба не предлогать боянистые темы с интервалом в минуту и т.д... цикл должен быть максимально быстрым, в этом смысл кода
Ты при отсылки данных указываешь Connection:Close, то есть после закрытия очередного - каждый раз создается новое соединение. Можно открыть сокет, отправив Connection:Keep Alive, а дальше отсылать Get запрос только.
|
|
|