Асинхронный мульти-направление клиент-сервер связь по той же открытому сокету?

голоса
20

У меня есть приложение клиент-сервер, где клиент находится на 6-устройства Windows Mobile, написанный на C ++, а сервер находится на полном Windows, и написанный на C #.

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

Вы можете использовать что - то аффект WaitForMultipleObjects()и передать его приемный буфер и событие , которое говорит ему есть данные , которые будут посланы?

Задан 04/08/2008 в 14:52
источник пользователем
На других языках...                            


4 ответов

голоса
7

Использование асинхронного взаимодействия является вполне возможно в одном потоке!

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

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

Ответил 17/08/2008 в 14:53
источник пользователем

голоса
7

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

в то время сервер может отправлять сообщения обратно клиенту корыта же открытое соединение.

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

Ответил 04/08/2008 в 15:30
источник пользователем

голоса
3

Проверьте ASIO . Это кросс совместим с ++ библиотека для IO асинхронный. Я не уверен , если это будет полезно для сервера (я никогда не пытался связать стандартный C ++ DLL в C # проекта) , но для клиента было бы полезно.

Мы используем его с нашим приложением, и решить большинство наших проблем параллелизма ввода-вывода.

Ответил 11/08/2008 в 11:00
источник пользователем

голоса
3

Я не ясно, действительно ли Вы желаете добавить асинхронные бит на сервер в C # или клиент в C ++.

Если вы говорите о выполнении этого в C ++, настольных платформ Windows, могут сделать гнездо ввода / вывода асинхронно с помощью интерфейса в этой использования перекрывающихся ввода / вывода. Для розеток, WSASend, WSARecv оба позволяют асинхронного ввода / вывода (читать документацию по своим параметрам LPOVERLAPPED, который вы можете заполнить с событиями, которые получают набор, когда я завершает / O).

Я не знаю, если Windows Mobile платформы поддерживают эти функции, так что вы, возможно, придется сделать некоторые дополнительные рыть.

Ответил 05/08/2008 в 06:30
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more