Asynchronous multi-arah server-klien komunikasi yang lebih terbuka sama socket?

Saya memiliki klien-server aplikasi dimana client adalah Windows Mobile 6 perangkat, yang ditulis dalam C++ dan server pada Windows lengkap dan ditulis dalam C#.

Awalnya, aku hanya membutuhkannya untuk mengirim pesan dari klien ke server, dengan server hanya pernah mengirimkan kembali sebuah pengakuan bahwa ia menerima pesan. Sekarang, saya ingin memperbaruinya sehingga server dapat benar-benar mengirim pesan ke klien untuk meminta data. Karena saat ini saya telah mengatur agar klien hanya dalam modus menerima setelah itu mengirimkan data ke server, ini doesn't memungkinkan server untuk mengirim permintaan pada setiap waktu. Saya akan harus menunggu untuk data klien. Pikiran pertama saya akan membuat thread lain pada klien dengan memisahkan membuka socket, mendengarkan permintaan server...seperti server sudah memiliki sehubungan klien. Apakah ada cara, dalam thread yang sama dan menggunakan soket yang sama, untuk semua server untuk mengirim permintaan pada setiap waktu?

Anda dapat menggunakan sesuatu untuk efek WaitForMultipleObjects() dan lulus menerima buffer dan peristiwa yang mengatakan itu ada data yang akan dikirim?

Larutan

Ketika saya perlu untuk menulis sebuah aplikasi dengan model client-server di mana klien bisa meninggalkan dan masuk kapan pun mereka inginkan, (saya berasumsi bahwa's juga kasus untuk aplikasi anda saat anda menggunakan perangkat mobile) saya memastikan bahwa klien kirim online pesan ke server, yang menunjukkan mereka terhubung dan siap untuk melakukan apapun yang mereka perlu lakukan.

pada saat itu server bisa mengirim pesan kembali ke klien palung yang sama membuka koneksi.

Juga, tapi aku don't tahu apakah itu berlaku untuk anda, saya punya semacam detak jantung klien dikirim ke server, membiarkannya tahu itu masih online. Dengan cara itu server yang tahu ketika klien secara paksa terputus dari jaringan dan bisa menandai bahwa klien kembali sebagai offline.

Komentar (0)

Menggunakan komunikasi asynchronous adalah benar-benar mungkin dalam satu thread!

Ada sebuah pola desain dalam jaringan pengembangan perangkat lunak yang disebut reaktor pola (lihat buku ini). Beberapa terkenal jaringan perpustakaan menyediakan implementasi dari pola ini (lihat ACE).

Secara singkat, reaktor adalah sebuah objek, anda daftarkan semua soket anda dalam, dan anda menunggu sesuatu. Jika sesuatu terjadi (data baru tiba, koneksi dekat...) reaktor akan memberitahu anda. Dan tentu saja, anda dapat menggunakan hanya satu socket untuk mengirim dan menerima data secara asinkron.

Komentar (0)

I'm tidak jelas pada apakah atau tidak anda're yang ingin menambahkan bit asinkron ke server di C# atau klien dalam C++.

Jika anda're berbicara tentang melakukan hal ini di dalam C++, destop Windows platform dapat melakukan soket I/O asynchronous melalui API's yang menggunakan tumpang tindih I/O. Untuk soket, WSASend, WSARecv kedua memungkinkan async I/O (baca dokumentasi tentang mereka LPOVERLAPPED parameter, yang dapat anda mengisi dengan acara-acara yang bisa diatur saat I/O selesai).

Saya don't tahu jika Windows Mobile platform yang mendukung fungsi-fungsi ini, sehingga anda mungkin harus melakukan beberapa penggalian tambahan.

Komentar (0)

Check out asio. Ini adalah salib kompatibel c++ library untuk asyncronous IO. Saya tidak yakin apakah ini akan berguna untuk server ( saya belum pernah mencoba untuk menghubungkan standar c++ DLL untuk c# proyek) tetapi untuk klien itu akan berguna.

Kita menggunakannya dengan aplikasi kita, dan itu diselesaikan kebanyakan dari kita IO concurrency masalah.

Komentar (0)