дизайн клиент-сервер - PullRequest
       9

дизайн клиент-сервер

0 голосов
/ 24 декабря 2009

Я хочу разработать довольно простую клиент-серверную программу.

одна программа читает XML (или любые данные) и отправляет их на сервер, который, в свою очередь, немного манипулирует им и в конечном итоге записывает его на диск.

Дело в том, что если у меня много xml-файлов на диске (на моей стороне клиента), я хочу открыть несколько соединений с сервером, а не делать одно за другим.

Мой первый вопрос: допустим, у меня есть один поток, который хранит все файлы-дескрипторы и ждет их нескольких объектов, поэтому он будет знать, когда один из них будет готов для чтения с диска. и для каждого файла у меня есть соответствующий сокет, который предполагает отправить этот конкретный файл на сервер. для сокета я могу использовать функцию выбора, чтобы узнать, какие сокеты готовы к отправке. но есть ли способ узнать, что и файл, и подходящий сокет готовы к отправке?

Во-вторых, есть ли более эффективный способ разработки клиента, потому что в моем текущем дизайне я использую только один поток, который на многопроцессорном компьютере недостаточно эффективен. (хотя я уверен, что это будет лучше, чем запуск нового потока для каждого сокетного соединения)

в-третьих, для сервера я прочитал о схеме реактора. это кажется уместным, но все же, как и мой второй вопрос, кажется недостаточно эффективным при использовании одного потока.

Может быть, я могу использовать что-то с портами завершения? Я думаю, они довольно эффективны, но никогда не использовали их, так что не знаю точно, как.

любые ответы и общие предложения будут великолепны.

1 Ответ

2 голосов
/ 24 декабря 2009

Взгляните на boost :: asio , он использует шаблон проактора (см. Документы), который в основном использует операции ожидания ОС (waitforsingle / множественный, select, epoll и т. Д.) Для создания очень эффективное использование единственного потока в системе, как вы планируете реализовать.

asio может читать / записывать файлы, а также сокеты. Вы можете назначить асинхронное чтение для файла, используя asio, он будет вызывать ваш обратный вызов по завершении, а затем вы отправите этот буфер чтения как асинхронную запись в сокет. Asio позаботится о доставке всех буферов асинхронной записи, когда сокет завершит каждую ожидающую операцию записи.

Каждая из этих операций выполняется асинхронно, поэтому поток действительно занят только для инициации чтения или записи, оставаясь без дела в остальное время.

...