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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 11.02.2013, 21:46
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Ха, гениально. Вот тока это не поможет. Сам то работал с WinSock ?
Не надо пытаться наезжать, если чего-то не понимаешь.

Мои исхи давно канули в лету, поэтому привожу пример из книги Фленова (вечный сервер, вырубается по ошибке):
Код:
tv.tv_sec := 1;  // Тайм-аут - секунды
tv.tv_usec := 0;
while true do
begin
  FD_ZERO(ReadSet);
  FD_SET(sServer, ReadSet);
  ReadySock := select(0, @ReadSet, 0, 0, @tv);
  if (ReadySock = SOCKET_ERROR) then
   exit;
  if (FD_ISSET(sServer, ReadSet)) then
  begin
    sClient := accept(sServer, ...); 
    if sClient = INVALID_SOCKET then
       exit;
    // клиент подключен
  end;
end;
Если убрать цикл - будет вырубаться по тайм-ауту.
Разумеется, сокет должен быть неблокирующий.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 11.02.2013 в 22:02.
Ответить с цитированием
  #17  
Старый 11.02.2013, 22:03
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
По умолчанию

Цитата:
Сообщение от Bargest
Не надо пытаться наезжать, если чего-то не понимаешь.
.

Ни кто не наезжает. По его посту видно то что он не вник в суть вопроса.
Сравни то что я спрашиваю и то что он советует... Ну да ладно.

Что касательно темы.
Благодарю за подсказку. Испытаем.
Ответить с цитированием
  #18  
Старый 12.02.2013, 08:40
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну так перед Terminate закрывай слушающий сокет и будет нормальный выход из потока.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #19  
Старый 12.02.2013, 18:11
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
По умолчанию

Цитата:
Сообщение от NumLock
ну так перед Terminate закрывай слушающий сокет и будет нормальный выход из потока.

Не то чтобы нормальный выход из потока, но его я и взял на вооружение как наиболее удачный.

Под не нормальным я имею в виду то, что у меня после вызова функции Accept и получения результата функции, идёт проверка на наличие ошибок с выводом той функции которая вызвала ошибку.

Вот код который был.
Код:
implementation

{ TCPServerTCP }

Procedure TServerThread.Execute;
Var
   wData: WSADATA;
   sServerListen, sClient: TSOCKET;
   LocalAddr, ClientAddr: SockAddr_in;
   iSize: Integer;
   sl: TCPClientThread;
Begin
{Здесь всё тоже самое как в посте ранее.} 
while not Terminated do
  Begin
     iSize := SizeOf(ClientAddr);
     // Приём нового соединения
     sClient := Accept(sServerListen, @ClientAddr, @iSize);
     if sClient = INVALID_SOCKET then
                                 Begin
                                 TestWinSockError('accept');
                                 Break;
                                 end
                                 Else
                                 Begin
     // Соединение принято, создаём поток
     sl := TCPClientThread.Create(True);
     sl.Sock := sClient;
     sl.Resume;
                                 End;
 End;
sl.Terminate;
sl.WaitFor;
FreeAndNil(sl);
CloseSocket(sServerListen);
end;

Дабы окно об ошибке не появлялось, понадобилось изменить его так.
Код:
Var
  sServerListen, sClient: TSOCKET; // Пришлось вывести переменные из процедуры в глобальные
  WorkServerSocket: Boolean; // Понадобылась дополнительная переменная

implementation

{ TCPServerTCP }

Procedure TServerThread.Execute;
Var
   wData: WSADATA;
   LocalAddr, ClientAddr: SockAddr_in;
   iSize: Integer;
   sl: TCPClientThread;
Begin
{Здесь всё тоже самое} 
while not Terminated do
  Begin
     iSize := SizeOf(ClientAddr);

     // Приём нового соединения
     sClient := Accept(sServerListen, @ClientAddr, @iSize);
     if sClient = INVALID_SOCKET then
                                 Begin
                                 if WorkServerSocket then {Если истина то делай проверку и иди на следующую итерацию}
                                 Begin
                                 TestWinSockError('accept');
                                 Break;
                                 End Else Exit; // Иначе выходи из процедуры
                                 end;
     // Соединение принято, создаём поток
     sl := TCPClientThread.Create(True);
     sl.Sock := sClient;
     sl.Resume;
  End;
CloseSocket(sServerListen);
sl.Terminate;
sl.WaitFor;
end;

Последний раз редактировалось seeman_tm, 12.02.2013 в 18:15.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter