2009-08-12 26 views
5

Nói một máy chủ đã tạo một đường ống có tên "myTestPipe". Có bao nhiêu khách hàng có thể kết nối với "myTestPipe"? Từ những gì tôi đã đọc trên Web, có vẻ như chỉ có một khách hàng có thể, nhưng muốn chắc chắn.Số lượng Khách hàng có thể kết nối với một Ống được Đặt tên

Nếu chỉ có một, thì tốt nhất nên sử dụng WaitForConnection chặn() thay vì phương thức Asunchronous BeginWaitForConnection() vì máy chủ sẽ đợi cho đến khi quá trình khách kết nối và sau đó thực hiện liên lạc ?! (không cần phải lo lắng về các khách hàng khác để kết nối)

Trả lời

9

Bạn có thể có nhiều hơn một khách hàng kết nối với cùng một đường ống có tên. Trên Windows, tôi tin rằng giới hạn hiện tại là 256 kết nối đồng thời với một đường ống có tên duy nhất, bao gồm cả kết nối của máy chủ.

(Thật không may, tôi không thể theo dõi các trang MSDN thích hợp để tham khảo, nhưng CPAN pipes reference này đề cập đến hạn chế này.)

+1

Cảm ơn bạn đã trả lời. Tôi có một câu hỏi mặc dù: Tôi đang triển khai một máy chủ nhận tệp nhị phân được gửi bởi NamedPipeClients thông qua một đường ống có tên. Giả sử rằng tôi có một ThreadedPipeClient đa luồng, nơi tôi có thể khởi tạo nhiều hơn một luồng để gửi các tập tin cùng một lúc. Làm cách nào để máy chủ phân biệt được máy khách nguồn thực sự đã gửi các byte này? Có lẽ câu hỏi của tôi nên là: khi có nhiều hơn một khách hàng đang viết dữ liệu vào đường ống, nó có bị chồng chéo với người khác theo cách mà bạn không thể nói ai đã gửi cái gì? hy vọng nó được giải thích tốt! cảm ơn một lần nữa – Derar

+1

Có thực sự là một vài tùy chọn khác nhau ở đây, bao gồm sử dụng chồng chéo I/O, đa luồng hoặc hoàn thành thường trình. MSDN có tài liệu tốt (bao gồm cả 3 tùy chọn) xử lý nhiều kết nối máy khách từ một máy chủ duy nhất tại đây: http://msdn.microsoft.com/en-us/library/aa365594%28VS.85%29.aspx –

+0

Điều quan trọng là ở trên, cần lưu ý rằng một cá thể máy chủ đơn lẻ có thể chỉ xử lý một máy khách duy nhất. Một ống dẫn __ được đặt tên có thể xử lý nhiều kết nối, nhưng mỗi kết nối đó vẫn cần được chờ đợi và được xử lý bởi một cá thể đường ống máy chủ riêng biệt. Khi một cá thể máy chủ đường ống đã kết nối, nó không thể được sử dụng cho các kết nối bổ sung cho đến khi kết nối hiện tại bị ngắt kết nối và đường ống máy chủ có thể đợi cho một kết nối khác. Câu trả lời ở trên là phù hợp với các sự kiện, nhưng không làm cho chúng rõ ràng, do sự nhầm lẫn giữa những gì là một ống được đặt tên và một đối tượng ống máy chủ. –

9

Bạn thực sự tạo ra một đường ống và chờ đợi một kết nối, và khi nó kết nối, tạo ra một thứ hai và chờ đợi.

Đối với mỗi ống bạn tạo và chờ kết nối, bạn nhận được tối đa một kết nối (tại một thời điểm - bạn có thể tái chế chúng nếu chúng là yêu cầu/phản hồi/kiểu đóng).

Do đó, mỗi kết nối là 1 đến 1, như ổ cắm hoặc luồng khác.

+0

Làm thế nào để bạn xử lý khi có quá nhiều khách hàng kết nối tình huống quá nhanh? Tôi đã làm cho spammer thực hiện 20 yêu cầu tới máy chủ sử dụng cách tiếp cận của bạn, nhưng sau 2-3 kết nối máy khách, phần còn lại của yêu cầu sẽ cố gắng kết nối với đường ống hiện có, nhưng vào thời điểm họ cố gửi yêu cầu, đường ống là đã đóng cửa. Có cách nào để giới hạn số lượng kết nối trên 'NamedPipeServerStream' không? – codenamezero

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