2010-10-07 41 views
5

Tôi đang phát triển một máy chủ socket sử dụng C# .NET. Tôi đang sử dụng mô hình async được cung cấp bởi lớp SocketAsyncEventArgs, vì nó phải là một máy chủ hiệu năng cao để hỗ trợ nhiều kết nối trong một khoảng thời gian ngắn. Tiếp theo, tôi muốn bảo đảm thông tin liên lạc giữa khách hàng và máy chủ và tôi nghĩ rằng tôi có thể sử dụng SSL.C#: SSL với SocketAsyncEventArgs?

Có cách nào để sử dụng SSL với mô hình SocketAsyncEventArgs không? Tôi biết .NET có lớp SslStream để bảo mật SSL, nhưng tôi cần sử dụng SocketAsyncEventArgs để có hiệu suất cao.

Có thể sử dụng SSL ở cấp cao hơn mà không triển khai SSL trong mã máy chủ không?

Xin cảm ơn trước.

+1

John bạn có nhận được thêm thông tin về điều này không? – Dreaddan

Trả lời

0

Bạn có thể thực hiện giao thức SSL/TLS của bên thứ ba, chẳng hạn như SecureBlackbox và sử dụng giao thức này với mọi phương tiện, bao gồm cả Ổ cắm .NET ở chế độ không đồng bộ. Thành phần máy chủ SSL của SecureBlackbox không có ổ cắm riêng của nó, thay vào đó nó kích hoạt các sự kiện, trong đó các trình xử lý của bạn, bạn viết mã liên quan đến socket của bạn. Bằng cách này, bạn cắm bất kỳ phương tiện giao thông nào, ngay cả khi không có ổ cắm.

0

Tôi nghĩ rằng tôi có thể đã tìm thấy một dự án cung cấp điều này.

https://sourceforge.net/projects/socketservers/

tôi vẫn đang chơi với nó và đang chạm vào một vấn đề tải chứng chỉ máy chủ, tuy nhiên, nhìn qua các mã nguồn có vẻ đầy hứa hẹn.

Một khía cạnh tôi không chắc chắn là nó p/gọi đến secur32.dll hơn là thực hiện C# thuần túy, vì vậy tôi không chắc tác động của bộ nhớ/hiệu suất đó là gì.

Chi tiết trên trang dự án của sourceforge rất thưa thớt như mục đích của dự án là gì.

5

Không chắc chắn nếu có ai quan tâm vì điều này quá cũ nhưng tôi cần làm chỉ trong tuần này và không thể tìm thấy bất kỳ thứ gì trên internet đáp ứng nhu cầu của tôi. Có lẽ có cái gì đó mới trong khung làm điều này mà tôi không thể tìm thấy ... Bất kể, tôi sẽ đăng mã nguồn nhưng vì tôi đã viết nó cho công ty của tôi và họ có xu hướng cau mày, tôi sẽ phác thảo cách tiếp cận tôi mất:

Vì SslStream lấy một luồng trong hàm tạo, nên tôi đã triển khai kiểu con Stream riêng của mình với một MemoryStream bên dưới để đọc và một cho ghi. Tôi cũng truyền TcpClient cho đối tượng này.

Tôi đã sử dụng TcpClient để bắt tay để thiết lập kết nối SSL. Sau khi xác thực máy chủ hoặc máy khách tùy thuộc vào cách tôi đang sử dụng nó, sau đó tôi sử dụng hai MemoryStream của mình để đọc/ghi SslStream.

Vì vậy, đối với Async viết, trước tiên tôi viết trọng tải của mình lên SslStream để điền vào MemoryStream của tôi để ghi dữ liệu được mã hóa. Với dữ liệu được mã hóa từ MemoryStream, tôi điền vào bộ đệm SocketAsyncEventArgs và gọi phương thức TcpClient SendAsync. Đối với lần đọc, nó hoàn toàn ngược lại.

Tôi không thể nói nó đặc biệt kích thích tôi để di chuyển dữ liệu như vậy nhưng miễn là bạn không để cho các đối tượng MemoryBuffer của bạn được phân bổ lại liên tục, nó không phải là vấn đề hiệu suất. Ít nhất theo cách này, tôi chỉ có thể sử dụng khung công tác và mã của riêng tôi mà không cần dựa vào phần mềm của bên thứ ba.