Вопрос № 18654: Здравствуйте.
Хочу сделать клиентсерверные приложения с помощью WinSock в лок. сети (примерные харак-ки ПК в сети: проц. Pentium 1700, 256 ОЗУ, 20 Gb HDD; пропускная способность зависит от того, в какой подсети находится комп - 10 или 100 Мбитс...
Вопрос № 18654
Здравствуйте.
Хочу сделать клиентсерверные приложения с помощью WinSock в лок. сети (примерные харак-ки ПК в сети: проц. Pentium 1700, 256 ОЗУ, 20 Gb HDD; пропускная способность зависит от того, в какой подсети находится комп - 10 или 100 Мбитсек, но в большинстве случаев 10 Мбитсек)
Идея приложений:
- есть приложение сервер (1шт.) , который работает с клиентами, посылаетпринимает данные
- есть приложения клиенты (много шт. :) хотелось бы примерно около 100) , которые посылаютпринимают данные на сервер
А теперь мои вопросы:
1) Хочу сделать 1 процесс сервер, который ждет соединения, а после соединения с каким-либо клиентом и получения нового сокета сразу же передает его(сокет) другому процессу. Т.е. получается (как я читал в некоторых книгах :)) что-то типа сервера Unix, где на серверной стороне есть главный процесс сервер, который отвечает за подключение новых клиентов и множество процессов, которые отвечают за работу с клиентами (посылка/принятие данных). Так вот сам вопрос: что в данном случае лучше сделать на стороне сервера
- множество работающих независимых процессов или множество работающих потоков одного процесса (процесса который отвечает за connect)? Если сделать процессы - то хватит ли производительности сервера (ведь потоки занимают меньше ОЗУ и проц.)?
2) Какое максимальное количество клиентов лучше сделать в данном случае и с данными характеристиками сети (и для процессов и для потоков на стороне сервера)?
3) С помощью чего в данном случае лучше организовать взаимодействие TCP или UDP?
Заранее спасибо за ответы.
Отправлен: 23.03.2005, 13:24
Вопрос задал: andrey (статус: Посетитель)
Всего ответов отправлено: 1
Отвечает: Bob Johnson
Здравствуйте, andrey! Конечно создание потока занимает намного меньше ресурсов ОС, чем создание дополнительного процесса. Но запуск отдельного процесса для каждого соединения увеличит надежность системы, т.к. в ситуации, если в каком-либо процессе возникнет фатальная ошибка, остальные будут продолжать нормально работать. Поэтому для ответа на твой вопрос, ты должен определиться, насколько вероятно возникновение фатальной ошибки и как важна тебе конечная надежность системы. Имей в виду, что ты можешь применить
exception handling, который позволит отлавливать и обрабатывать ошибки. Таким образом, если при возникновении ошибки не будут повреждены данные, которые используют остальные потоки, они также смогут продолжить нормальную работу. Думаю, что в современных ОС windows дополнительный процесс не будет отнимать много оперативной памяти, т.к. многие страницы будут использоваться в share режиме, т.к. процессы идентичны. Что касается производительности процессора - то тут
большой разницы нет, все будет зависеть от того, насколько сильно каждый твой поток (или процесс - ведь процесс это такой же поток и тоже один по умолчанию) будет загружать процессор своей задачей. Т.е. я бы попробовал с потоками. Касательно протоколов - UDP протокол без гарантированной доставки, т.е. теоретически при большой загрузке сети UDP пакет может просто потеряться. TCP же гарантирует, что данные будут доставлены, либо ты получить код ошибки. К тому же, при передаче UDP пакетов есть ограничение
на максимальный объем транспортируемых данных. Количество клиентов будет целиком зависеть от того, сколько всевозможных ресурсов будет съедать каждая серверная часть твоей программы.
* EMan2.0: ---===*** Debug mode ***===---
Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 27.03.2005, 00:20