![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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;Разумеется, сокет должен быть неблокирующий. Последний раз редактировалось 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. |