![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
io2me |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 3.3.2006 Где: .NET Репутация: нет Всего: нет |
Здраствуйте. Вот хотел спросить сабж.
Помоему есть 2 варианта: 1. Запустить N потоков, каждый ждет поключения (помоему что попало) 2. Запустить цыкл while, ожидающий подключения, и если ктото коннектиться обрабатывать его в потоки, чтобы сразу ждать других коннектов. Что скажете ? Как лучше ? |
|||
|
||||
adonin |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 16.12.2005 Где: Новочеркасск Рост овская обл. Репутация: 1 Всего: 5 |
Лучше так:
в основном потоке делаете listen(), затем accept(). accept() возвратит вам описатель нового сокета, через который вы можете общаться с данным клиентом. После этого создаёте новый поток для работы через данный сокет. а в основном потоке опять делаете listen(). и accept(). --------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР) |
|||
|
||||
io2me |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 3.3.2006 Где: .NET Репутация: нет Всего: нет |
можно пример ?
|
|||
|
||||
adonin |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 16.12.2005 Где: Новочеркасск Рост овская обл. Репутация: 1 Всего: 5 |
Примерно так. ![]() --------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР) |
|||
|
||||
io2me |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 3.3.2006 Где: .NET Репутация: нет Всего: нет |
спасиб, идея понятна.. а можна без win32 ?
а то я буду на linux переводить ! |
|||
|
||||
adonin |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 16.12.2005 Где: Новочеркасск Рост овская обл. Репутация: 1 Всего: 5 |
Не-а
![]() Спроси в форуме "Программирование под linux". Но принцип тот же. Особо переделывать не придётся. --------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР) |
|||
|
||||
io2me |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 3.3.2006 Где: .NET Репутация: нет Всего: нет |
да в том форуме все молчат )))
маздаевцы ![]() |
|||
|
||||
YanTsys |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 22.3.2006 Репутация: нет Всего: нет |
Как я понимаю после открытия сокет активен пока его принудительно не закрыть...
А нет нигде параметра позволяющего сокету автоматически закрываться в случае если оборвана связь? Или нужно по таймеру делать опрос всех открытых сокетов на живность? |
|||
|
||||
Kill_em_all |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 2.4.2005 Репутация: нет Всего: нет |
А с помощью асинхронных сокетов?
Еще лучший вариант! Забудьте про использование потоков для такой цели |
|||
|
||||
adonin |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 16.12.2005 Где: Новочеркасск Рост овская обл. Репутация: 1 Всего: 5 |
Так делать не хорошо: клиенты будут обслуживаться по очереди!!! им придётся ждать, если нагрузка на сервер будет значительной. И потом, если у вас многопроцессорная система, Вы получите значительный выигрыш в скорости, если будете использовать потоки. Жаль, нет под рукой MSDN. Скорее всего, уровень TCP скажет вам о разрыве соединения (recv не получит данные, а GetLastError возвратит ошибку!=0). Но, возможно и нет. Легче всего проверить на двух машинах: выдернуть сетевой кабель из клиента, когда сервер будет ожидать запрос. Посмотрите функцию SetSockOpt() возможно там что-нибудь будет: что-то типа SO_KEEP_ALIVE --------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР) |
|||
|
||||
LuckLess |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: нет Всего: 1 |
listen опять не надо
клиентам в любом случае придеться ждать. и к томуже 1 процесс может создать всего около 1300 потоков(в винде) лучший вариант - комбинированный - асинхронные сокеты + потоки. но не знаю как его реализовать под nix системы. |
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: нет Всего: 146 |
Имхо в
нет потоков имхо надо , т.к. аксепт сьедает под себя сокет, а при создании нового ему снова надо говорит "слушай" -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
LuckLess |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: нет Всего: 1 |
Не надо . Листен лишь говорит какова максимальная очередь ожидающих соединения и все. Добавлено @ 16:12 Ну наверняка чтото похожее есть ![]() Добавлено @ 16:12 не fork()-иться же каждый раз.. Это сообщение отредактировал(а) LuckLess - 29.3.2006, 16:13 |
|||
|
||||
Бонифаций |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 827 Регистрация: 15.9.2005 Где: Brisbane Репутация: нет Всего: 40 |
Есть. Куда же они денутся. mysql к примеру многопоточный сервер, oops прокси, firebird-ss. -------------------- Бонифаций. |
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: нет Всего: 146 |
точно не надо аксепт создает новый сокет есть эт точно ![]() -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
Бонифаций |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 827 Регистрация: 15.9.2005 Где: Brisbane Репутация: нет Всего: 40 |
А зачем? если связь оборвется, вы просто получите ошибку в recv() при приеме. Или сигнал SIGPIPE если будете писать в неисправный сокет. -------------------- Бонифаций. |
|||
|
||||
040375 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 6.4.2006 Репутация: 2 Всего: 2 |
Если Вы хотите писать многопоточный сервер, и писать будете под Линукс - то Вам лучше всего разобраться с вызовом select, именно с помощью него работает большинство серверов в линукс, т.к. у многопоточной идеи много минусов, рассказывать не буду про них - лучше найдите в инете ман, про select есть даже русский ман и разберитесь с ним. Весь смысл в том, что select "берёт на обслуживание" любое (по теории) кол-во сокетов не блокируя основной цикл программы и экономя ресурсы процессора при таймаутах. У этого вызова есть ещё библиотечная обработка - pselect - это более новая ф-я. Пример приводить не буду пока - их в инете предостаточно, могу позже про выслать по почте.
|
|||
|
||||
adonin |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 16.12.2005 Где: Новочеркасск Рост овская обл. Репутация: 1 Всего: 5 |
Покажите хотя бы один недостаток, чтобы утверждение голословным не было. Вообще говоря, существует только два способа обработки параллельных запросов: многопоточность и ассинхронный ввод/вывод. Остальные методы должны сводиться к одному из них. Итак, select сводится к одному из этих способов, следовательно, обладает его недостатками. Если я не прав, поправьте меня. --------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР) |
|||
|
||||
adonin |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 16.12.2005 Где: Новочеркасск Рост овская обл. Репутация: 1 Всего: 5 |
Нашёл статью:
Подходы к организации серверного приложения Итак, select - это разновидность ассинхронного ввода/вывода и ему присущи недостатки этого метода (см. статью)
для Linux это лучший вариант. Это сообщение отредактировал(а) adonin - 7.4.2006, 08:29 --------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР) |
|||
|
||||
Necias |
|
|||
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 7.4.2006 Репутация: нет Всего: 2 |
жабер сервер - опенсорс, под линух, очень прямо написанный, можно работу с сокетами оттуда взять. Если кому интересно - в маздае эта проблема решается порождением класса CSocket в новом потоке. Но сервера с такой "в лоб" реализованной многопоточностью на коммерческом уровне не делаются ибо макс число потоков даже на Крее будет весьма ограниченным. Техника плавающего (до опр числа потоков в каждом изних находится по 1у сокету, затем они заполняются по 2й и тд) распределения сокетов не сложна, но безопасна и эффективна и при реализации многопоточности не следует о ней забывать.
|
|||
|
||||
blur |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 9.11.2004 Репутация: 1 Всего: 1 |
А у меня вот такой вопрос: если к серверу будут подключаться десятки тысяч клиентов, то как в таком случае организовать их работу. Не в отдельный же поток каждого
![]() |
|||
|
||||
cozzzy |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 29.4.2006 Где: Харьков Репутация: нет Всего: нет |
Использовать ACE
![]() |
|||
|
||||
blur |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 9.11.2004 Репутация: 1 Всего: 1 |
||||
|
||||
cozzzy |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 29.4.2006 Где: Харьков Репутация: нет Всего: нет |
The ADAPTIVE Communication Environment (ACE) Фактически - лучшая сетевая библиотека, которой пользуются многие крупнейшие компании. Кроссплатформенная, гибкая, защищенная + достаточно легка в изучении и использовании |
|||
|
||||
Nuzur |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 4.7.2004 Репутация: нет Всего: 5 |
cozzzy, А можете в 2-х словах описать как им пользоваться?
А то я чего-то недопонял... Вещица интерестная особенно прочитав кто ею пользуеться... Есть ли какое-то опиание сего на русском? Это сообщение отредактировал(а) Nuzur - 20.6.2006, 16:05 -------------------- Never again... |
|||
|
||||
Nuzur |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 4.7.2004 Репутация: нет Всего: 5 |
Не все-таки не смог я АСЕ осилить, буду пользоваться стандартными средствами!
Это сообщение отредактировал(а) Nuzur - 21.6.2006, 17:02 -------------------- Never again... |
|||
|
||||
Nuzur |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 4.7.2004 Репутация: нет Всего: 5 |
adonin, Что-то я очень плохо понял ваш пример, тоесть до упора создаються потоки причем потом даже с "пустыми" сокетами. Всем все побарабану, подключился к нему кто-то или нет...
Можете пролить свет на происходящее? И код клиента который будет конектиться к такому серверу как бут выглядить? Это сообщение отредактировал(а) Nuzur - 22.6.2006, 09:46 -------------------- Never again... |
|||
|
||||
Goryachev |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 23.2.2005 Где: Израиль Репутация: нет Всего: нет |
||||
|
||||
Owen |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 5.7.2006 Где: Русь Репутация: нет Всего: нет |
Под 'nix'ом не писал, но почему не использовать такое явление, как порты завершения?( CreateIOCompletionPort( ) ) Это будет вполне логично, в случае если сервер расчитан на большое кол-во пользователей.
Создавать потоки на каждый сокет имеет смысл лишь в том случае, если ожидается сравнительно мелое количество пользователей. На мой взгляд около 20. Однако от многопотоковости отказываться не стоит. Просто распределить обработку данных на несколько потоков. Особенно продуктивно в многопроцессорных машинах. |
|||
|
||||
SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 1 Всего: 23 |
Могу вывесить свой курсач по Linux - это HTTP - сервер. Там несколько вариантов работы сервера и через fork, и через потоки, и через пул потоков.
Если надо пиши! |
|||
|
||||
phprus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 22.8.2006 Репутация: 1 Всего: 3 |
SenkraD
Если вам не трудно, то пожалуйста выложите. |
|||
|
||||
SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 1 Всего: 23 |
||||
|
||||
phprus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 22.8.2006 Репутация: 1 Всего: 3 |
SenkraD
Спасибо. |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |