
5ый семестр / 1. Производственная практика_1 / стащил с работы / Начинающему сетевому программисту _ Хабр
.pdf
Начинающему сетевому программисту / Хабр |
https://habr.com/ru/post/582370/ |
da-nie 11.10.2021 в 18:18
Это приложение будет использовать Win32API
«К тому же в Unix нет никаких WSA-функций.» — это как бы намёк, что другие ОС обходятся и без WSA. :)
0 Ответить
DistortNeo 11.10.2021 в 18:07
Вас спасёт select/poll/epool.
Ага. То есть мало просто перевести сокет в неблокирующий режим, надо ещё и по-хитрому с ним работать. Причём способ получается ещё и системо-зависимый.
См. выше. Сможет и будет отлично работать.
Вы не сможете без танцев с бубнами мультиплексировать операции по сокетам с событиями GUI в одном потоке. Так что да, все операции с сокетами — в отдельный поток + веселуха с межпотоковой синхронизацией.
0 Ответить
da-nie 11.10.2021 в 18:24
Ага. То есть мало просто перевести сокет в неблокирующий режим, надо ещё и по-хитрому с ним работать. Причём способ получается ещё и системо-зависимый.
Вот именно, что системонезависимый. В Windows это тоже будет работать (в отличие от WSA, которые ТОЛЬКО в Windows и есть).
Вы не сможете без танцев с бубнами мультиплексировать операции по сокетам с событиями GUI в одном потоке.
Счего бы это вдруг? ;)
+веселуха с межпотоковой синхронизацией.
Это вообще, обычно, никаких проблем не вызывает.
0 Ответить
DistortNeo 11.10.2021 в 18:39
Вот именно, что системонезависимый. В Windows это тоже будет работать (в отличие от WSA, которые ТОЛЬКО в Windows и есть).
С каких пор в Windows завезли epoll, во FreeBSD — IOCP, а в Linux — kqueue?
Или предлагаете по-старинке через select работать?
С чего бы это вдруг? ;)
Вы вообще представляете, как выглядит очередь сообщений в GUIприложений и как к ней прикрутить сокеты?
Стр. 21 из 27 |
28.02.2022, 11:29 |

Начинающему сетевому программисту / Хабр |
https://habr.com/ru/post/582370/ |
Это вообще, обычно, никаких проблем не вызывает.
Пользователь в GUI-приложении нажал на кнопку отмены, нужно остановить операцию по сокету в другом потоке, висящим на select/epoll_wait. Что предложите?
+1 Ответить
da-nie 11.10.2021 в 19:32
Или предлагаете по-старинке через select работать?
Почему бы и нет? Вам же нужна независимость от ОС?
А не через select (и не через WSA) вы покроете почти все UNIXсистемы, но не покроете Windows. С WSA же вы получите всё ровно наоборот — только Windows и всё. Впрочем, тот же Pool есть как WSAPool и вы можете просто сделать макрос замены. При этом код менять не потребуется.
Вы вообще представляете, как выглядит очередь сообщений в GUI-приложений и как к ней прикрутить сокеты?
Единственное, чего я не представляю, так это выдуманные на пустом месте проблемы. :)
Что вам помешает передать требуемые работы с сокетами события потоку? Прямо из GUI, да. А потоку их можно хоть в очередь ставить, хоть сразу исполнять — это уже его дело.
Пользователь в GUI-приложении нажал на кнопку отмены, нужно остановить операцию по сокету в другом потоке, висящим на select/epoll_wait. Что предложите?
Вы в потоке крутитесь в цикле while(true) с внутренним select:
timeval timeout; while true
{
timeout.tv_sec=0 timeout.tv_usec=timeout_us;
long ret=select( 0,&Readen 0,&Exeption,&timeout);
}
Что помешает вам проверить сразу после select какое-либо событие (его можете хоть как флаг сделать, защитив мютексом или критической секцией)?
Кстати, а вы не смотрели, с какой частотой Windows переключает потоки? ;) Думаете, очередь сообщений (вместе с GUI) работает быстрее? Ну-ну.
0 Ответить
DistortNeo 11.10.2021 в 19:54
Почему бы и нет? Вам же нужна независимость от ОС?
Стр. 22 из 27 |
28.02.2022, 11:29 |

Начинающему сетевому программисту / Хабр |
https://habr.com/ru/post/582370/ |
Как уже написали в соседнем комментарии, если номер дескриптора больше, чем FD_SETSIZE (который захардкожен в 1024), то вы не сможете поместить его в select . Хорошая переносимость, правда?
Вы в потоке крутитесь в цикле while(true) с внутренним select
А select -у как сообщим, что надо прерваться? Или будем ждать таймаута, что само по себе является плохой практикой?
Кстати, а вы не смотрели, с какой частотой Windows переключает потоки? ;) Думаете, очередь сообщений (вместе с GUI) работает быстрее? Ну-ну.
Как-то раньше игрался: простой пинг-понг событиями между потоками показал что-то вроде 20-30к переключений в секунду. А вот сколько сообщений можно пропустить через очередь сообщений, я не замерял.
Ну а так-то да, логично всю обработку делать в отдельном потоке и не насиловать GUI-поток.
0 Ответить
da-nie 11.10.2021 в 20:10
Как уже написали в соседнем комментарии, если номер дескриптора больше, чем FD_SETSIZE (который захардкожен в 1024), то вы не сможете поместить его в select. Хорошая переносимость, правда?
Вы с этим сталкивались? ;) Нет, серьёзно, вы когда-нибудь ожидали 1024 сокета? Фантазировать, конечно, не запретишь, но всё же, как вам тогда 65535 портов хватает? Мне вот раз в 10 больше надо. :) Ну а почему бы и нет? ;)
А select-у как сообщим, что надо прерваться? Или будем ждать таймаута, что само по себе является плохой практикой?
Кто это сказал, что это плохая практика?
Как-то раньше игрался: простой пинг-понг событиями между потоками показал что-то вроде 20-30к переключений в секунду.
Не совсем.
0 Ответить
DistortNeo 11.10.2021 в 21:37
Вы с этим сталкивались?
Нет, потому что я использую epoll и IOCP.
Кто это сказал, что это плохая практика?
Это плохая практика, потому что если таймаут будет большой, тогда отзывчивость приложения будет низкой. А
Стр. 23 из 27 |
28.02.2022, 11:29 |

Начинающему сетевому программисту / Хабр |
https://habr.com/ru/post/582370/ |
если маленький, тогда поток будет постоянно просыпаться по таймауту select, что не есть хорошо.
Не совсем.
А причём тут таймер? ОС не ждёт следующего кванта времени, чтобы стартовать выполнение потока.
0 Ответить
da-nie 12.10.2021 в 17:35
Нет, потому что я использую epoll и IOCP.
Речь о количестве сокетов, а не о ограничениях. Если у вас набирается столько сокетов на один поток, то пора пересмотреть архитектуру приложения.
Аесли маленький, тогда поток будет постоянно просыпаться по таймауту select, что не есть хорошо.
Увас в любом случае потоки будут потреблять процессор. Не этот, так другой. Так что всё это не более, чем собственноручно введённые ограничения. Добавление в очередь асинхронных событий с сокетами тоже не святой дух делает.
Апричём тут таймер? ОС не ждёт следующего кванта времени, чтобы стартовать выполнение потока.
Разбор очереди сообщений привязан к этому таймеру. Если у вас один поток работает, то проблемы не будет, но если несколько, то вот с частотой этого таймера будет происходить их вытеснение. Это очень хорошо видно, если требуется в потоке опрашивать на шине какое-либо устройство чтением из порта с ожиданием готовности (если прерывание не завезли — так бывает). Там будут прелестные лаги во временной диаграмме.
0 Ответить
DistortNeo 12.10.2021 в 18:00
Речь о количестве сокетов, а не о ограничениях. Если у вас набирается столько сокетов на один поток, то пора пересмотреть архитектуру приложения.
Таки не поток, а процесс. Тот же nginx на пару порядков больше соединений может держать, кстати.
У вас в любом случае потоки будут потреблять процессор.
Нет. В нормальном случае поток будет спать и просыпаться только при выполнении условия просыпания по дескриптору.
Разбор очереди сообщений привязан к этому таймеру.
Ну если у вас всё на sleep-ах сделано, тогда да.
Стр. 24 из 27 |
28.02.2022, 11:29 |

Начинающему сетевому программисту / Хабр |
https://habr.com/ru/post/582370/ |
0 Ответить
da-nie 12.10.2021 в 18:06
Таки не поток, а процесс. Тот же nginx на пару порядков больше соединений может держать, кстати.
Ну может и может, вы лично 1024 использовали?
Нет. В нормальном случае поток будет спать и просыпаться только при выполнении условия просыпания по дескриптору.
Вы невнимательно читаете. Процессор в любом случае будет кем-то потребляться, хоть IDLE, но будет. И беречь в этом случае поток обработки смысла нет — ничего не выиграете.
Ну если у вас всё на sleep-ах сделано, тогда да.
Оно и без них будет идти неравномерно. То бежать, то приостанавливаться.
0 Ответить
DistortNeo 12.10.2021 в 19:09
Процессор в любом случае будет кем-то потребляться, хоть IDLE, но будет.
Энергосбережение? Нет, не слышали.
0 Ответить
da-nie 12.10.2021 в 19:13
Энергосбережение? Нет, не слышали.
Да ладно! :O
То есть, когда сайт сбербанка грузится хрен знает сколько или те же avito, youtube и ozon не стесняются кушать память и процессор в моём firefox, то это нормально, тут ни о каком энергосбережении речи как-то не заходит. :) Да и ОС с остальным ПО всё жиреют и жиреют. Процессор греется от натуги, вытаскивая все эти слои абстракций и прослоек. Но «это другое». :)
0 Ответить
DistortNeo 12.10.2021 в 20:01
Да, и это просто отвратительно. У меня есть и другие примеры, когда криво написанный сетевой софт отжирает в фоне процессорное время, даже если он не используется.
Например, в nxserver сделан epoll_wait с таймаутом 100 мс. Как следствие, он жрёт процессор. За 5 суток сожрал 7 минут процессорного времени. Мелочь, а неприятно.
Стр. 25 из 27 |
28.02.2022, 11:29 |

Начинающему сетевому программисту / Хабр |
https://habr.com/ru/post/582370/ |
С x2goserver ещё хуже: скрипт на perl, который раз в 2 секунды запускает несколько других процессов для очистки зависших сессий. Жрёт ещё больше. Частично пофиксил проблему, пропатчив скрипт и увеличив интервал до 120 секунд.
А теперь представьте себе, что такого достаточно много, и если всё это хозяйство запускать на ноуте, то это не очень хорошо скажется на времени его автономной работы.
0 Ответить
da-nie 12.10.2021 в 20:26
А теперь представьте себе, что такого достаточно много, и если всё это хозяйство запускать на ноуте, то это не очень хорошо скажется на времени его автономной работы.
А вы проведите такой эксперимент — напишите с ожиданием и на асинхронке. Думаю, результат разницы времени автономной работы ноутбука будет на уровне статистической погрешности (я про nxserver).
0 Ответить
morgot 10.10.2021 в 21:52
Есть хорошая книга - Джонс Энтони, Оланд Джим. "Программирование в сетях Microsoft Windows". Единственная по Winsock 2 , хоть ей лет 20, но в сетевом программировании мало что меняется. Еще есть несколько хороших по первой версии винсок (и где-то временам Windows 95).
0 Ответить
unC0Rr 12.10.2021 в 17:48
Неплохо бы раскрыть также и тему IPv6.
0 Ответить
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.
ПОХОЖИЕ ПУБЛИКАЦИИ
6 января 2021 в 13:16
В Windows 10 внедрят единый клиент Outlook вместо Почты и Календаря
+14 |
9.7K |
0 |
32 +32 |
7 декабря 2015 в 21:17
Microsoft добавил возможность отключения слежения в версиях Windows 10 для корпоративных клиентов
+30 |
81K |
76 |
90 +90 |
19 ноября 2013 в 12:02
Стр. 26 из 27 |
28.02.2022, 11:29 |

Начинающему сетевому программисту / Хабр |
https://habr.com/ru/post/582370/ |
Рисовалка под Windows на C++, или «Ребята, я тоже ненормальный!» (30+ строк кода)
+33 |
36K |
77 |
12 +12 |
ЛУЧШИЕ ПУБЛИКАЦИИ ЗА СУТКИ
сегодня в 00:00
Позиция Хабра по происходящему
+225 |
34K |
24 |
206 +206 |
вчера в 15:59
Отрасль IT в России поставили на паузу
+208 |
62K |
67 |
408 +408 |
вчера в 19:21
Кризис в России и финансовые вопросы: как не потерять то, что есть
+56 |
35K |
74 |
68 +68 |
вчера в 13:00
Делаем стреляющего джаггернаута из игры Turok: Evolution с помощью подручных материалов
+31 |
2.5K |
14 |
1 +1 |
Информация |
Услуги |
Ваш аккаунт |
|
|
Разделы |
||
сегодня в 00:22 |
|
|
Публикации |
Устройство сайта |
Реклама |
Войти |
|
|
|||
Из чего состоит мировой эфир. Последняя теория Менделеева |
Тарифы |
||||
Регистрация |
|
|
Новости |
Для авторов |
|
+27 |
4.2K |
21 |
Хабы 3 +3 |
Для компаний |
Контент |
|
|
|
Компании |
Документы |
Семинары |
|
|
|
Авторы |
Соглашение |
Мегапроекты |
Частичка Хабра про бессерверные технологии: боты, обзоры инструментов и |
|
||||
лайфхаки |
|
|
Песочница |
Конфиденциальность |
|
Турбо |
|
|
|
|
|
© 2006–2022 «Habr» Вернуться на старую версию |
Техническая поддержка О сайте |
Настройка языка |
Стр. 27 из 27 |
28.02.2022, 11:29 |