Russian Qt Forum

Программирование => С/C++ => Тема начата: frau muller от Апрель 28, 2004, 11:14



Название: сокеты и потоки
Отправлено: frau muller от Апрель 28, 2004, 11:14
в дочернем потоке вызываю функцию accept для сокета:
clSock = accept(sock,(sockaddr*)&from, &fromlen);
если не ошибаюсь, accept вешает выполнение потока, пока не поступит запрос
от клиентского сокета.
Проблема такая: могу остановить выполнение потока только функцией
TerminateThread, ExitThread в данном случае не работает. А как корректно
завершить поток?


Название: сокеты и потоки
Отправлено: ods от Апрель 28, 2004, 12:19
man 7 socket, man 2 fcntl на предмет установки O_NONBLOCK
man 2 select, man 2 poll


Название: сокеты и потоки
Отправлено: npak от Апрель 28, 2004, 14:04
Цитата: "ods"
man 7 socket, man 2 fcntl на предмет установки O_NONBLOCK
man 2 select, man 2 poll


Судя по первому постингу, это Винда.  Там нет ни fcntl, ни poll.

Смотри в MSDN про nonblocking socket (в частности, WSPIoctl)

Если нужна переносимость, то можно воспользоваться select.


Название: сокеты и потоки
Отправлено: Злой от Апрель 28, 2004, 21:30
Делаешь в основном потоке closesoket, после чего с помощью WaitForSingleObject ждешь завершения работы дочернего потока. В дочернем потоке функция accept после того, как где-нибудь данный сокет был закрыт, возвращает управление. Проверяешь код ошибки и, в зависимости от его значения, завершаешь работу потока или делаешь ещё что-нибудь (тебе, как автору программы, виднее, что именно).