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

У меня есть клиент-серверное приложение, где клиент на устройстве с Windows мобиле 6, написанный на C и сервер на ОС Windows и написана на языке C#.
Изначально, я только нуждался в нем, чтобы отправлять сообщения от клиента к серверу, при этом сервер только отправляет обратно подтверждение, что он получил сообщение. Теперь я хотел бы обновить его так, что сервер на самом деле можете отправить сообщение клиенту запрашивать данные. В настоящее время у меня его настроить так, что клиент только в режиме приема, после того, он отправляет данные на сервер, этого не позволяет серверу отправлять запрос в любое время. Мне придется ждать данных клиента. Моей первой мыслью было создать другой поток на клиенте с отдельной открытой гнездо, прослушивает запросы на сервер...так как на сервере уже есть в отношении клиента. Есть ли способ, в том же потоке и, используя тот же сокет, чтобы все серверу отправлять запросы в любое время?
Вы можете использовать что-то эффект 
```
WaitForMultipleObjects()
```
 и передать его в буфере приема и событие, которое говорит, что она там будет отправлены данные?

У меня есть клиент-серверное приложение, где клиент на устройстве с Windows мобиле 6, написанный на C и сервер на ОС Windows и написана на языке C#.
Изначально, я только нуждался в нем, чтобы отправлять сообщения от клиента к серверу, при этом сервер только отправляет обратно подтверждение, что он получил сообщение. Теперь я хотел бы обновить его так, что сервер на самом деле можете отправить сообщение клиенту запрашивать данные. В настоящее время у меня его настроить так, что клиент только в режиме приема, после того, он отправляет данные на сервер, этого не позволяет серверу отправлять запрос в любое время. Мне придется ждать данных клиента. Моей первой мыслью было создать другой поток на клиенте с отдельной открытой гнездо, прослушивает запросы на сервер...так как на сервере уже есть в отношении клиента. Есть ли способ, в том же потоке и, используя тот же сокет, чтобы все серверу отправлять запросы в любое время?
Вы можете использовать что-то эффект 
```
WaitForMultipleObjects()
```
 и передать его в буфере приема и событие, которое говорит, что она там будет отправлены данные?

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

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

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

Проверить асио. Это крест библиотеки совместим c для asyncronous ИО. Я не уверен, если это будет полезно для сервера ( я никогда не пытался связать стандарта C DLL в проект C#), но для клиента это было бы полезно. Мы используем его с нашим приложением, и он решается большинство наших ИО проблемы параллелизма.