Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.02.2010, 17:59
shinobi2 shinobi2 вне форума
Прохожий
 
Регистрация: 22.11.2008
Сообщения: 4
Репутация: 10
По умолчанию WinSock и бесконечный цикл

Помогите, не могу никак решить одну проблему.
Есть функция отправки 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; 
Вызываю так:
WSAStartup($101, ws);
fWSRecv;

Тут ну всё испробовал, и ставил AF_INET вместо PF_INET, и т.д… но никак понять не могу, почему он открывает кучу соединений, в результате чего все виснет.
Кто знает в чем ошибка, пожалуйста подскажите.
Ответить с цитированием
  #2  
Старый 08.02.2010, 18:02
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Выкинь все, кроме отправки из цикла. Естественно, у тебя создается сокет на каждой итерации....
Ответить с цитированием
  #3  
Старый 08.02.2010, 18:17
shinobi2 shinobi2 вне форума
Прохожий
 
Регистрация: 22.11.2008
Сообщения: 4
Репутация: 10
По умолчанию

Не понял, что именно надо выкинуть? тут ведь всё важно, и если какую команду выкинуть, то запрос попросту не дойдёт.
Что касаемо закрытия, я тоже пологаю что команды
CloseSocket(hSocket);
будет явно мало, если я что то ещё не закрываю, то просьба указать что именно.

Или может я не в том месте цикл поставил? Просто в других местах он либо не работает вообще, либо работает вот так как есть, с кучей соединений ;(
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter