|
5 / 4 / 1
Регистрация: 16.08.2013
Сообщений: 110
|
|
на accept() зависает11.12.2013, 16:06. Показов 10442. Ответов 25
Метки нет (Все метки)
Доброго времени суток, делаю чат на основе win socket в консольном варианте всё работает, делаю в оконном интерфейсе зависает на accept(). Помогите кто может
0
|
|
| 11.12.2013, 16:06 | |
|
Ответы с готовыми решениями:
25
Зависает accept windows forms После Socket.Accept() зависает приложение accept |
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,454
|
|
| 11.12.2013, 17:15 | |
|
вы же понимаете, что функция accept придумана не вчера? и она работает. и работает как надо. она просто не может зависать. если она зависает у вас значит дело не в ней. нужно показать код.
0
|
|
|
Ушел с форума
|
|||
| 11.12.2013, 18:04 | |||
|
accept function (MSDN) http://msdn.microsoft.com/en-u... s.85).aspx
отдельном потоке.
1
|
|||
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,454
|
||||||||
| 11.12.2013, 18:10 | ||||||||
1
|
||||||||
|
Ушел с форума
|
|
| 11.12.2013, 18:19 | |
|
0
|
|
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,454
|
||
| 11.12.2013, 18:23 | ||
|
1 "да, она такая, погрузите себя с разбегу в атомную асинхронность и термоядерную многопоточность" 2.1 "висение оно бывает разное" 2.2 "не используйте дрель для забивания гвоздей"
1
|
||
|
Ушел с форума
|
|
| 11.12.2013, 18:46 | |
|
Мой вариант:
1. accept - для простых сценариев. Если нужна эффективность и хороший отклик, следует использовать AcceptEx / многопоточность. Я бы еще сюда IOCP прикрутил. 2.1 "висение бывает разное". 2.2 "не используйте дрель для забивания гвоздей, микроскоп для этого подходит куда лучше".
0
|
|
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,454
|
|
| 11.12.2013, 19:17 | |
|
конечно, к хорошему надо привыкать, но это издевательство советовать человеку, знания которого, если судить по вопросу, не позволяют свободно оперировать методиками способными дать "эффективность и хороший отклик" все эти штукенции. тем более, что в задаче которую решает этот человек (и все остальные 99,5 % разработчиков) отличия в производительности простой реализации от самой продвинутой будут "пшик да ничего"
0
|
|
|
5 / 4 / 1
Регистрация: 16.08.2013
Сообщений: 110
|
|
| 12.12.2013, 19:37 [ТС] | |
|
пожалуйста приведите пример асинхронного сервера
0
|
|
|
Ушел с форума
|
||||||
| 12.12.2013, 20:06 | ||||||
|
Вот сэмплы из Windows 7 SDK (overlap и iocp) - winsock.zip
Там есть все, что нужно для быстрого "въезжания" в тему. Вот код примера, взятый из документации к AcceptEx (MSDN): Кликните здесь для просмотра всего текста
А здесь простейший асинхронный TCP-сервер с использованием Boost.Asio: http://www.boost.org/doc/libs/... 3/src.html Очень рекомендую прочесть (хотя бы "по диагонали") документацию по WinSock в MSDN, а также найти где-нибудь книгу "Программирование в сетях Windows", т.к. там многие вопросы сетевого программирования, в том числе касающиеся асинхронного I/O и портов завершения, довольно хорошо разжеваны.
1
|
||||||
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,454
|
|||
| 12.12.2013, 20:14 | |||
) пример ожидания входящего подключения можно назвать интерактивным и неблокирующим - если это консоль: как сверхбыстрый вариант воткните в цикл функцию проверки нажатия клавиши и вы всегда сможете выйти из сервера.Добавлено через 7 минут
0
|
|||
|
Ушел с форума
|
||
| 12.12.2013, 20:28 | ||
|
WSAWaitForMultipleEvents в данном примере ожидает сразу несколько операций - как приема новых соединений, так и завершения чтения или записи на сокетах. Но под определенной нагрузкой этот код в плане производительности очень недалеко ушел от блокирующего accept. Да и в Windows есть ограничение на количество объектов, на которых можно ждать - это 64. Максимальная эффективность достигается использованием пула потоков и портов завершения ввода-вывода, под Windows это самая выгодная модель I/O, кстати, не только для сокетов, но и для практически любого другого I/O.
0
|
||
|
5 / 4 / 1
Регистрация: 16.08.2013
Сообщений: 110
|
||||||
| 12.12.2013, 22:10 [ТС] | ||||||
это как бы намёк на то что должно получиться, это серверная часть в асинхронном режиме, правда куда пихать функцию select вообще не пойму, поглядите плиз...
0
|
||||||
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,454
|
||||||||
| 13.12.2013, 07:05 | ||||||||
если возникнет вопрос - почему в примере нет FD_ISSET: потому что сокет в наборе один и нет необходимости проверять что установлен именно он: если в наборе установлен хоть один сокет, то это может быть только он
0
|
||||||||
|
Ушел с форума
|
||
| 13.12.2013, 11:43 | ||
|
что, на мой взгляд, несколько однобоко, тогда да, они эквивалентны.
0
|
||
|
5 / 4 / 1
Регистрация: 16.08.2013
Сообщений: 110
|
||||||
| 13.12.2013, 13:19 [ТС] | ||||||
|
а есть клиентская часть?
Добавлено через 14 минут вот переработал Вашу реализацию под приём сообщений , из консоли всё работает, спасибо) переношу на форму так чтобы этот код срабатывал от нажатия кнопки "создать сервер", и почем то зависает, или страшнее того блокируется) подскажите может есть какие-то различия?
заметил в Вашем коде переменную nsa но не нашёл где ей присваивается значение
0
|
||||||
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,454
|
||||||||||
| 13.12.2013, 19:30 | ||||||||||
|
1 по нажатию кнопки "создать сервер" создать сокет, связать с адресом, поставить на прослушивание 2 в таймере проверять наличие входящих подключений (вызывать select) и если подключение есть - принимать его - таймер будет у вас эквивалентом цикла 3 после приема подключения делать то на что рассчитана ваша программа. как вариант - в другом таймере проверять наличие входящих данных и если они есть - принимать, обрабатывать их и, возможно, отвечать как альтернатива - можно цикл реализовать не таймером, а поместить в поток, но у потоков свои особенности - просто так обращаться к форме или данным оттуда скорее всего не получится. Добавлено через 7 минут Добавлено через 35 секунд
1
|
||||||||||
|
5 / 4 / 1
Регистрация: 16.08.2013
Сообщений: 110
|
|
| 13.12.2013, 20:07 [ТС] | |
|
0
|
|
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,454
|
||
| 13.12.2013, 20:18 | ||
|
таймеры - это такие штуковины, они наверняка должны быть в вашей визуальной среде о которой мы до сих пор ничего не знаем
0
|
||
|
Ушел с форума
|
|||
| 13.12.2013, 22:13 | |||
|
Да, select и WSAEventSelect/WSAWaitForMultipleEvents ничем принципиальным друг от друга не отличаются. Можно сказать, что первое - это стандарт, а второе - его адаптация для Windows с учетом ее специфики (асинхронный I/O, наличие в сетевом стеке всяких провайдеров и тому подобное). В Windows все равно весь ввод-вывод в итоге сводится к стандартному обобщенному интерфейсу, который крутится вокруг абстракции под названием "файл" (за которой может скрываться все, что угодно): "создание I/O-запроса - ожидание - перевод дескриптора в сигнальное состояние - завершение запроса", все в асинхронном ключе, разумеется. Сокеты в этом плане не исключение, а различные модели работы с ними (блокирующий и неблокирующий режимы, select/WSAEventSelect, socket extensions и т.д.) являются просто обертками над этим интерфейсом, и если спуститься по сетевому стеку Windows ниже winsock, никаких select-ов мы там уже не увидим. Вопрос лишь в толщине (или тонкости) этих оберток и в том, насколько сильно они "искажают суть" реального I/O, который скрывается у них под капотом, где-то там, в глубине...
![]() Оффтоп: Кстати, а как в других (не-Windows) системах решается проблема select ? На Windows что select, что wait-функции могут обслужить за один вызов строго ограниченное количество дескрипторов, из-за этого модель select не особо популярна, но есть порт завершения, например, который свободен от многих проблем и позволяет делать эффективно и масштабируемо...
0
|
|||
| 13.12.2013, 22:13 | |
|
Помогаю со студенческими работами здесь
20
accept Подвисает accept accept не соединяет Функция accept accept error Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|