|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
Цитата:
Мои исхи давно канули в лету, поэтому привожу пример из книги Фленова (вечный сервер, вырубается по ошибке): Код:
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
|
||||
|
||||
Цитата:
Ни кто не наезжает. По его посту видно то что он не вник в суть вопроса. Сравни то что я спрашиваю и то что он советует... Ну да ладно. Что касательно темы. Благодарю за подсказку. Испытаем. |
#18
|
||||
|
||||
ну так перед Terminate закрывай слушающий сокет и будет нормальный выход из потока.
Пишу программы за еду. __________________ |
#19
|
||||
|
||||
Цитата:
Не то чтобы нормальный выход из потока, но его я и взял на вооружение как наиболее удачный. Под не нормальным я имею в виду то, что у меня после вызова функции 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. |