сеть в .net / C # - PullRequest
       19

сеть в .net / C #

3 голосов
/ 17 октября 2008

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

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

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

Ответы [ 3 ]

17 голосов
/ 17 октября 2008

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

TcpClient / UdpClient

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

Гнездо - Выбрать

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

Разъем - APM Style

Модель асинхронного программирования (AKA IAsyncResult, Begin / End Style) для сокетов является основным методом асинхронного использования сокетов. И есть несколько вариантов. По сути, вы вызываете асинхронный метод (например, 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 под капотом.

3 голосов
/ 17 октября 2008

В мире .NET 3.5 вы обязательно должны изучить Windows Communication Foundation - .NET Framework для работы в сети.

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

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

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

1 голос
/ 17 октября 2008

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

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

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

...