Возник вопрос по Accept модуля WinSock.
Проблема в том, что функция
Код:
sClient := Accept(sServerListen, @ClientAddr, @iSize);
Останавливает выполнение потока на себе до тех пор, пока какой нить клиент не подключится к серверу.
Как можно ограничить по времени выполнение вышеуказанной функции ?
Вот код потока ожидающего подключения клиентов.
Код:
Procedure TServerThread.Execute;
Var
wData: WSADATA;
sServerListen, sClient: TSOCKET;
LocalAddr, ClientAddr: SockAddr_in;
iSize: Integer;
sl: TCPClientThread;
Begin
// Загрузка WinSock
if WSAStartup(MAKEWORD(1,1), wData) <> 0 then
Begin
MessageBox(0,'Не удалось загрузить WinSock.','Ошибка.',0);
Exit;
End;
// Создание сокета
sServerListen := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if sServerListen = INVALID_SOCKET then
Begin
MessageBox(0,'Ошибка создания сокета.','Ошибка.',0);
Exit;
end;
// Заполнение структуры адреса
LocalAddr.sin_addr.S_addr := HTONL(INADDR_ANY);
LocalAddr.sin_family := AF_INET;
LocalAddr.sin_port := HTONS(2990);
// Связывание сокета с локальным адресом
if bind(sServerListen, LocalAddr, SizeOf(LocalAddr)) = SOCKET_ERROR then
Begin
TestWinSockError('Bind');
Exit;
End;
// Прослушивание
if TestFuncError(Listen(sServerListen,4), 'Listen') then Exit;
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;