2008-08-04 15 views
20

Tôi có một ứng dụng khách-máy chủ mà khách hàng đang sử dụng thiết bị Windows Mobile 6, được viết bằng C++ và máy chủ có đầy đủ Windows và được viết bằng C#.Giao tiếp máy chủ-khách hàng đa hướng không đồng bộ trên cùng một ổ cắm mở?

Ban đầu, tôi chỉ cần nó để gửi thư từ máy khách đến máy chủ, với máy chủ chỉ gửi lại xác nhận rằng nó đã nhận được thư. Bây giờ, tôi muốn cập nhật nó để máy chủ thực sự có thể gửi tin nhắn cho khách hàng để yêu cầu dữ liệu. Vì tôi hiện đã thiết lập nó nên máy khách chỉ ở chế độ nhận sau khi nó gửi dữ liệu đến máy chủ, điều này không cho phép máy chủ gửi yêu cầu bất cứ lúc nào. Tôi sẽ phải đợi dữ liệu khách hàng. Suy nghĩ đầu tiên của tôi là tạo một luồng khác trên máy khách với một ổ cắm mở riêng biệt, lắng nghe các yêu cầu máy chủ ... giống như máy chủ đã có đối với máy khách. Có cách nào, trong cùng một luồng và sử dụng cùng một socket, cho tất cả các máy chủ gửi yêu cầu bất cứ lúc nào?

Bạn có thể sử dụng thứ gì đó để ảnh hưởng của WaitForMultipleObjects() và chuyển cho nó bộ đệm nhận và sự kiện cho biết dữ liệu được gửi không?

Trả lời

7

Khi tôi cần viết ứng dụng với mô hình máy khách-khách hàng nơi khách hàng có thể rời và nhập bất cứ khi nào họ muốn, (tôi cho rằng đó cũng là trường hợp của ứng dụng khi bạn sử dụng thiết bị di động). gửi thông báo trực tuyến tới máy chủ, cho biết họ đã kết nối và sẵn sàng làm bất cứ điều gì họ cần.

tại thời điểm đó máy chủ có thể gửi tin nhắn trở lại máng ứng dụng cùng một kết nối mở.

Ngoài ra, nhưng tôi không biết liệu điều đó có áp dụng được cho bạn hay không, tôi đã có một số loại nhịp tim khách hàng được gửi tới máy chủ, cho biết rằng máy chủ đó vẫn trực tuyến. Bằng cách đó, máy chủ biết khi nào một máy khách bị buộc phải ngắt kết nối khỏi mạng và nó có thể đánh dấu máy khách đó là ngoại tuyến.

3

Tôi không rõ liệu bạn có muốn thêm các bit không đồng bộ vào máy chủ trong C# hoặc máy khách trong C++ hay không.

Nếu bạn đang nói về việc này trong C++, nền tảng Windows trên máy tính để bàn có thể làm socket I/O không đồng bộ thông qua API sử dụng chồng chéo I/O. Đối với các socket, WSASend, WSARecv đều cho phép I/O không đồng bộ (đọc tài liệu về các tham số LPOVERLAPPED của chúng, mà bạn có thể điền với các sự kiện được thiết lập khi I/O hoàn thành).

Tôi không biết liệu nền tảng Windows Mobile có hỗ trợ các chức năng này hay không, vì vậy bạn có thể phải thực hiện thêm một số thao tác đào.

3

Khám phá asio. Nó là một thư viện C++ tương thích chéo cho IO không đồng bộ. Tôi không chắc chắn nếu điều này sẽ hữu ích cho máy chủ (Tôi chưa bao giờ cố gắng liên kết một tiêu chuẩn c + + DLL cho một dự án C#) nhưng đối với khách hàng nó sẽ hữu ích.

Chúng tôi sử dụng nó với ứng dụng của mình và giải quyết hầu hết các sự cố đồng thời IO của chúng tôi.

7

Sử dụng giao tiếp không đồng bộ là hoàn toàn có thể trong chuỗi đơn!

Có một mẫu thiết kế chung trong phát triển phần mềm mạng được gọi là mẫu lò phản ứng (look at this book). Một số thư viện mạng nổi tiếng cung cấp việc triển khai mẫu này (look at ACE).

Tóm lại, lò phản ứng là một đối tượng, bạn đăng ký tất cả các ổ cắm của bạn bên trong, và bạn chờ đợi một cái gì đó.Nếu có điều gì đó xảy ra (dữ liệu mới đến, kết nối gần ...) lò phản ứng sẽ thông báo cho bạn. Và tất nhiên, bạn chỉ có thể sử dụng một ổ cắm để gửi và nhận dữ liệu một cách không đồng bộ.