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

Возник вопрос по 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;
Ответить с цитированием