Вопрос

Не мог бы кто-нибудь, пожалуйста, указать мне правильное направление, чтобы научиться создавать сети на C # / .net 3.5?Примеры кода и пояснения приветствуются.В основном я ищу, как создавать асинхронные / многопоточные серверные / клиентские модели.

Я довольно хорошо знаком с основами того, как добиться этого на C ++ с помощью WinSock, но, хотя все мои исследования, похоже, не могут охватить эту концепцию на C #.

Спасибо за любую помощь, которую вы можете оказать :)

Это было полезно?

Решение

Если WCF соответствует вашим потребностям, на него стоит обратить внимание. Нулевой существуют и другие альтернативные библиотеки более высокого уровня.В противном случае есть несколько различных способов работать ближе к уровню сокета, если это то, что вам нужно.

TcpClient/UdpClient

Они обеспечивают относительно тонкую оболочку вокруг нижележащих гнезд.По сути, это обеспечивает поток через сокет.Вы можете использовать асинхронные методы в сетевом потоке (BeginRead и т.д.).Мне это не нравится, так как оболочка не предоставляет так много, и это, как правило, немного более неудобно, чем прямое использование сокета.

Выбор сокета

Это обеспечивает классическую технику выбора для мультиплексирования ввода-вывода нескольких сокетов в один поток.Больше не рекомендуется.

Розетка в стиле APM

Модель асинхронного программирования (ОНА ЖЕ IAsyncResult, стиль начала / окончания) для сокетов является основным методом асинхронного использования сокетов.И есть несколько вариантов.По сути, вы вызываете асинхронный метод (например, BeginReceive) и выполняете одно из следующих действий:

  1. Опрос для завершения по возвращенному IAsyncResult (практически не используется).
  2. Используйте WaitHandle из IAsyncResult, чтобы дождаться завершения выполнения метода.
  3. Передайте методу BeginXXX метод обратного вызова, который будет выполнен после завершения работы метода.

Лучший способ - № 3, так как он обычно самый удобный.Если вы сомневаетесь, используйте этот метод.

Некоторые ссылки:

Высокопроизводительные сокеты .NET 3.5

.NET 3.5 представила новую модель для асинхронных сокетов, которая использует события.Он использует "упрощенную" асинхронную модель (например, Socket.SendAsync).Вместо обратного вызова вы подписываетесь на событие для завершения и вместо IAsyncResult получаете SocketAsyncEventArgs.Идея заключается в том, что вы можете повторно использовать SocketAsyncEventArgs и предварительно выделить память для ввода-вывода сокета.В высокопроизводительных сценариях это может быть намного эффективнее, чем использование стиля APM.Кроме того, если вы предварительно выделяете память, вы получаете стабильный объем памяти, сокращаете сбор мусора, дыры в памяти из-за закрепления и т.д.Обратите внимание, что беспокоиться об этом следует только в самых высокопроизводительных сценариях.

Краткие сведения

В большинстве случаев используйте метод обратного вызова в стиле APM, если только вы не предпочитаете стиль метода SocketAsyncEventArgs / Async.Если вы использовали CompletionPorts в WinSock, вы должны знать, что оба этих метода используют CompletionPorts под капотом.

Другие советы

В мире .NET 3.5 вам обязательно следует научиться Коммуникационный фонд Windows - .NET Framework для создания сетей.

Полезная ссылка:

Синхронные и асинхронные операции (в WCF)

Вы можете найти полезную информацию WCF в сообщениях о просмотре StackOverflow помеченный WCF тег

Это зависит от того, на чем вы хотите сосредоточиться.

Если вы хотите сосредоточиться на функциональности и оставить сантехнику фреймворку, то начните с Windows Communication Foundation.

Если вы хотите построить свой собственный водопровод, то используйте System.Net.Sockets.Socket класс.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top