создание сетей на .net / C#
-
03-07-2019 - |
Вопрос
Не мог бы кто-нибудь, пожалуйста, указать мне правильное направление, чтобы научиться создавать сети на C # / .net 3.5?Примеры кода и пояснения приветствуются.В основном я ищу, как создавать асинхронные / многопоточные серверные / клиентские модели.
Я довольно хорошо знаком с основами того, как добиться этого на C ++ с помощью WinSock, но, хотя все мои исследования, похоже, не могут охватить эту концепцию на C #.
Спасибо за любую помощь, которую вы можете оказать :)
Решение
Если WCF соответствует вашим потребностям, на него стоит обратить внимание. Нулевой существуют и другие альтернативные библиотеки более высокого уровня.В противном случае есть несколько различных способов работать ближе к уровню сокета, если это то, что вам нужно.
TcpClient/UdpClient
Они обеспечивают относительно тонкую оболочку вокруг нижележащих гнезд.По сути, это обеспечивает поток через сокет.Вы можете использовать асинхронные методы в сетевом потоке (BeginRead и т.д.).Мне это не нравится, так как оболочка не предоставляет так много, и это, как правило, немного более неудобно, чем прямое использование сокета.
Выбор сокета
Это обеспечивает классическую технику выбора для мультиплексирования ввода-вывода нескольких сокетов в один поток.Больше не рекомендуется.
Розетка в стиле APM
Модель асинхронного программирования (ОНА ЖЕ IAsyncResult, стиль начала / окончания) для сокетов является основным методом асинхронного использования сокетов.И есть несколько вариантов.По сути, вы вызываете асинхронный метод (например, BeginReceive) и выполняете одно из следующих действий:
- Опрос для завершения по возвращенному IAsyncResult (практически не используется).
- Используйте WaitHandle из IAsyncResult, чтобы дождаться завершения выполнения метода.
- Передайте методу BeginXXX метод обратного вызова, который будет выполнен после завершения работы метода.
Лучший способ - № 3, так как он обычно самый удобный.Если вы сомневаетесь, используйте этот метод.
Некоторые ссылки:
Высокопроизводительные сокеты .NET 3.5
.NET 3.5 представила новую модель для асинхронных сокетов, которая использует события.Он использует "упрощенную" асинхронную модель (например, Socket.SendAsync).Вместо обратного вызова вы подписываетесь на событие для завершения и вместо IAsyncResult получаете SocketAsyncEventArgs.Идея заключается в том, что вы можете повторно использовать SocketAsyncEventArgs и предварительно выделить память для ввода-вывода сокета.В высокопроизводительных сценариях это может быть намного эффективнее, чем использование стиля APM.Кроме того, если вы предварительно выделяете память, вы получаете стабильный объем памяти, сокращаете сбор мусора, дыры в памяти из-за закрепления и т.д.Обратите внимание, что беспокоиться об этом следует только в самых высокопроизводительных сценариях.
- Журнал MSDN:Подключитесь к платформе .NET Framework 3.5
- Информация MSDN с технологией предварительного выделения памяти
Краткие сведения
В большинстве случаев используйте метод обратного вызова в стиле APM, если только вы не предпочитаете стиль метода SocketAsyncEventArgs / Async.Если вы использовали CompletionPorts в WinSock, вы должны знать, что оба этих метода используют CompletionPorts под капотом.
Другие советы
В мире .NET 3.5 вам обязательно следует научиться Коммуникационный фонд Windows - .NET Framework для создания сетей.
Полезная ссылка:
Синхронные и асинхронные операции (в WCF)
Вы можете найти полезную информацию WCF в сообщениях о просмотре StackOverflow помеченный WCF тег
Это зависит от того, на чем вы хотите сосредоточиться.
Если вы хотите сосредоточиться на функциональности и оставить сантехнику фреймворку, то начните с Windows Communication Foundation.
Если вы хотите построить свой собственный водопровод, то используйте System.Net.Sockets.Socket
класс.