2011-01-02 16 views
8

Tôi vừa tình cờ gặp HTTP Server API của Microsoft. Trạng thái giới thiệu:Sử dụng HttpApi với Cổng Hoàn tất I/O

API máy chủ HTTP cho phép ứng dụng giao tiếp qua HTTP mà không cần sử dụng Microsoft Internet Information Server (IIS). Ứng dụng có thể đăng ký để nhận yêu cầu HTTP cho các URL cụ thể, nhận yêu cầu HTTP và gửi phản hồi HTTP. API máy chủ HTTP bao gồm hỗ trợ SSL để các ứng dụng có thể trao đổi dữ liệu qua các kết nối HTTP an toàn mà không cần IIS. Nó cũng được thiết kế để hoạt động với các cổng hoàn thành I/O.

Tìm điều này thật tuyệt, tôi đã xem xét danh sách các chức năng cho cả hai phiên bản API. Bây giờ, phần khác của tài liệu đề cập đến các cổng hoàn thành I/O là hàm HttpReceiveHttpRequest(). Tham số cuối cùng là một tùy chọn OVERLAPPED cấu trúc với các mô tả sau đây:

Đối với các cuộc gọi không đồng bộ, thiết lập pOverlapped để trỏ đến một cấu trúc OVERLAPPED; cho các cuộc gọi đồng bộ, đặt nó thành NULL. Một khối gọi đồng bộ cho đến khi một yêu cầu đến hàng đợi đã chỉ định và một số hoặc tất cả đã được truy xuất, trong khi cuộc gọi không đồng bộ ngay lập tức trả về ERROR_IO_PENDING và ứng dụng gọi điện sau đó sử dụng các cổng hoàn thành GetOverlappedResult()hoặc I/O để xác định thời điểm hoạt động hoàn thành. Để biết thêm thông tin về cách sử dụng cấu trúc OVERLAPPED để đồng bộ hóa, hãy xem Synchronization and Overlapped Input and Output.

Không có thông tin nào khác và tất cả các cấu trúc đều mờ đục và cố ý ẩn thông tin kết nối. Cũng cần lưu ý rằng đối tượng đầu vào và đồng bộ hóa và đầu vào được chồng chéo không đề cập đến API HTTP.

Có ai có ý tưởng về cách kết nối hàng đợi API HTTP với cổng hoàn thành I/O không?

+0

Bạn có bất kỳ lý do gì để tin rằng bạn sẽ không chỉ truyền tay cầm vào hàng đợi làm tham số đầu tiên cho CreateIoCompletionPort không? – Gabe

+2

Không. Tôi không có lý do để tin rằng đó là điều đúng để làm một trong hai. –

Trả lời

3

Sử dụng cổng hoàn IO là trivially đơn giản về mặt lý thuyết, nhưng trong thực tế abomnible: P

việc sử dụng "bình thường" là:

  1. Gọi CreateIOCompletionPort để tạo ra một IO cổng hoàn thành xử lý.
  2. Tạo một chuỗi chủ đề và nhận từng chuỗi để lặp lại, khi gọi tới GetOverlappedResult. GetOverlappedResult sẽ trả về khi một hoạt động chồng chéo kết hợp với cổng hoàn tất, với các cấu trúc cho biết xử lý và hoạt động nào đã được hoàn thành.
  3. Khi chương trình của bạn chạy và tạo các đối tượng mà nó muốn xử lý không đồng bộ, nó kết hợp từng HANDLE với xử lý IO CompletionPort bằng cách gọi lại CreateIOCompletionPort.

Bây giờ, mỗi lần ứng dụng phát hành một hoạt động không đồng bộ trên HANDLE (được đánh dấu bằng đi qua trong một struct chồng chéo) thông báo về các hoạt động đã hoàn thành sẽ được chỉ định bởi một trong những chủ đề thats chờ đợi vào GetOverlappedResult trở về.

Ý nghĩa rõ ràng là HANDLE được trả về bởi HttpCreateRequestQueue có thể được kết hợp với cổng IO Completion và các hoạt động không đồng bộ tiếp theo sẽ dẫn đến việc GetOverlappedResult trả về kết quả của thao tác.

+0

Có, tôi có một máy chủ dựa trên cổng hoàn thành I/O hiện tại. Tuy nhiên, tôi không chia sẻ ý tưởng chính xác rằng hàm ý là "rõ ràng". Tôi sẽ thử xem nó thế nào. –

Các vấn đề liên quan