К списку форумов К списку вопросов
сокеты и потоки
frau muller
28.04.2004 - 12:06
в дочернем потоке вызываю функцию accept для сокета:
clSock = accept(sock,(sockaddr*)&from, &fromlen);
если не ошибаюсь, accept вешает выполнение потока, пока не поступит запрос
от клиентского сокета.
Проблема такая: могу остановить выполнение потока только функцией
TerminateThread, ExitThread в данном случае не работает. А как корректно
завершить поток?
UE
1 - 28.04.2004 - 12:10
попробуй из другого потока вызвать closesocket(sock), тогда, afair, accept выйдет из состояния ожидания.
A1
2 - 06.05.2004 - 10:43
А как быть с функцией recv? Она ведь тоже ждет получения данных и вешает поток?
?
3 - 06.05.2004 - 12:20
а зачем вызывать accept если событее пока такое не пришло?
или recv? если нет данных в буфере. проверяй событя и потом если оно появляется то вызывай либой accept либо recv...
ste
4 - 06.05.2004 - 15:11
>3
Сервер-то на accepte висит, чего проверять? И какой буфер ты собрался проверять без вызова accepta предварительно?
?
5 - 06.05.2004 - 21:22
вообще то когда речь шла о буфере то имелся ввиду recv, прочти внимательнее, а насчёт accept'a ты сразу заходишь в поток и сразу вызываешь accept?? или как??
ste
6 - 06.05.2004 - 21:36
>5
Почитай тему внимательнее. Если ты имеешь ввиду recv, то причем здесь accept? Когда доходит дело до recv, то accept уже пройдет, выполнение продолжается и идет работа с конкретным подключением.
А человек имел ввиду, что он висит на accepte в потоке и ему из другого потока это дело надо прервать.
?
7 - 07.05.2004 - 06:44
(to 5)
речь зашла о recv как о примере, что бы человеку было понятней, читай внимательнее, ты мне отвечаешь не тот вопрос, я тебя спрашиваю не про поток обработки сокета который возвращается accept'ом, а про слушающий сокет, допустим создали мы слушайщий сокет, как ты себе представляешь дальнейшие действия? как ты обрабатываешь работу слушающего сокета в потоке? при каких условиях ты вызываешь accept?
ste
8 - 07.05.2004 - 10:39
Какие условия?
Создал сокет, привязал к адресу, выполнил listen и в цикле делаешь accept. А ты еще что-то делаешь до accepta? Нет, ты можешь, конечно, делать select или poll перед этим, но это НУЖНО только в редких случаях.
?
9 - 07.05.2004 - 12:01
вот те самые условия, для нормальной обработки потока не надо вызывать accept постоянно, ты сначало проверь на событее, можешь через WSAEnumNetworkEvents если присутствует событее FD_ACCEPT вот тогда и вызывай accept, тогда и поток зависать не будит, и завершить ты его сможешь корректно.
frau muller
10 - 07.05.2004 - 14:24
клиент связывается с сокетом с помощью connect,
далее вызываю shutdown.
после этого клиент вызывает connect с теми же параметрами, что и в первом случае, но connect возвращает ошибку.
в чем тут дело может быть?
frau muller
11 - 07.05.2004 - 14:36
shutdown вызываю для клиентского сокета

К списку вопросов на форуме Программирование

>>