Асинхронная многоадресная связь сервер-клиент по одному и тому же открытому сокету? - PullRequest
21 голосов
/ 04 августа 2008

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

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

Можете ли вы использовать что-то с эффектом WaitForMultipleObjects() и передать ему буфер приема и событие, сообщающее, что есть данные для отправки?

Ответы [ 4 ]

7 голосов
/ 17 августа 2008

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

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

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

7 голосов
/ 04 августа 2008

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

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

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

3 голосов
/ 11 августа 2008

Выезд asio . Это кросс-совместимая библиотека c ++ для асинхронного ввода-вывода. Я не уверен, будет ли это полезно для сервера (я никогда не пытался связать стандартную DLL c ++ с проектом c #), но для клиента это было бы полезно.

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

3 голосов
/ 05 августа 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...