Розетка интернет проходная: RJ45 .5 UTP Legrand Mosaic ()

Розетка спутниковая (SAT), телевизионная (TV) проходная GSL000898 двойная, серии Glossa Schneider Electric, цвет шоколад

Каталог серии

Розетки GLOSSA Выключатели Glossa Светорегуляторы Glossa Терморегуляторы Glossa Рамки Glossa

Розетки USB GLOSSA Розетки телефонные и интернет Glossa Розетки для TV, спутника, радио Glossa Кнопки без фиксации Glossa

Показать весь каталог

Товар может иметь незначительные отличия от изображения, представленного на сайте, по цвету, форме, размеру или другим параметрам.

1042 Р Срок поставки: 1-2 недели

В корзину В корзине

Посмотреть все характеристики

Цвет:шоколад
Материал:пластмасса
Вид розетки:спутниковая (SAT), телевизионная (TV)
Тип розетки:проходная
Разъемы:двойная
Комплектация:механизм с накладкой без рамки
Монтаж:встроенный монтаж, с возможностью накладного монтажа

Обратите внимание:

Докомплектовать

Рамки

Рамка квадратная 1 пост шоколадного цвета

арт. GSL000801

Производ.:Schneider Electric
Серия: Glossa
Цвет:шоколад
Материал:пластмасса
Кол-во постов:1 пост

В корзину В корзине

Рамка прямоугольная 2 поста в шоколадном цвете

арт. GSL000802

Производ.:Schneider Electric
Серия: Glossa
Цвет:шоколад
Материал:пластмасса
Кол-во постов:2 поста

В корзину В корзине

Рамка прямоугольная 2 поста в шоколадном цвете

арт. GSL000806

Производ.:Schneider Electric
Серия: Glossa
Цвет:шоколад
Материал:пластмасса
Кол-во постов:2 поста

В корзину В корзине

Рамка прямоугольная 3 поста в шоколадном цвете

арт. GSL000803

Производ.:Schneider Electric
Серия: Glossa
Цвет:шоколад
Материал:пластмасса
Кол-во постов:3 поста

В корзину В корзине

Рамка прямоугольная 3 поста в шоколадном цвете

арт. GSL000807

Производ.:Schneider Electric
Серия: Glossa
Цвет:шоколад
Материал:пластмасса
Кол-во постов:3 поста

В корзину В корзине

Рамка прямоугольная 4 поста в шоколадном цвете

арт. GSL000808

Производ.:Schneider Electric
Серия: Glossa
Цвет:шоколад
Материал:пластмасса
Кол-во постов:4 поста

В корзину В корзине

Рамка прямоугольная 4 поста в шоколадном цвете

арт. GSL000804

Производ.:Schneider Electric
Серия: Glossa
Цвет:шоколад
Материал:пластмасса
Кол-во постов:4 поста

В корзину В корзине

Рамка прямоугольная 5 постов в шоколадном цвете

арт. GSL000805

Производ.:Schneider Electric
Серия: Glossa
Цвет:шоколад
Материал:пластмасса
Кол-во постов:5 постов

В корзину В корзине

Трудно с выбором?

Наши специалисты подберут для вас лучшие комплектации

Отправить заявку

Прикрепить файл

Нажимая кнопку «Отправить» Вы даете согласие на обработку ваших персональных данных.

Наверх

Проходная розетка для интернета в категории «Материалы для ремонта»

Розетка компьютерная Viko Karre RJ 45 белая

На складе в г. Кривой Рог

Доставка по Украине

146.50 грн

Купить

Розетка TV телевизионная Karlik LOGO 1LGTV-1 бежевая внутренняя конечная (гнездо для ТВ антенны)

На складе

Доставка по Украине

177.5 — 200 грн

от 2 продавцов

197.20 грн

177.50 грн

Купить

Розетка TV телевизионная Karlik LOGO LGTV-1 белая внутренняя конечная (гнездо для ТВ антенны)

На складе

Доставка по Украине

177.5 — 200 грн

от 2 продавцов

197.20 грн

177.50 грн

Купить

Розетка TV телевизионная Karlik MINI MGTV-1 белая внутренняя конечная (гнездо для ТВ антенны)

На складе

Доставка по Украине

204.8 — 240 грн

от 2 продавцов

227.60 грн

204.80 грн

Купить

Розетка TV телевизионная Karlik MINI 29MGTV-1 золотая внутренняя конечная (гнездо для ТВ антенны)

На складе

Доставка по Украине

240 — 254. 2 грн

от 2 продавцов

282.40 грн

254.20 грн

Купить

Розетка TV телевизионная Karlik MINI 12MGTV-1 черная матовая внутренняя конечная (гнездо для ТВ антенны)

На складе в г. Луцк

Доставка по Украине

282.40 грн

254.20 грн

Купить

Розетка для радио Auna Digi Plug FM черная

Доставка по Украине

2 200 грн

Купить

Розетка для телевизионного кабеля проходная ТВ OVIVO GRANO глянцевая белая

Доставка по Украине

105.78 грн

Купить

Проходная розетка для кабеля ТВ Ovivo Electric Mina для внутренней установки белая

Доставка по Украине

105.78 грн

Купить

Розетка для телевизионного кабеля ТВ проходная встраиваемая Horoz Electric TINA белая

Доставка по Украине

49.61 грн

Купить

Спутниковая розетка Ovivo Electric Grano 250V 16A IP20 для скрытой установки белая

Доставка по Украине

73.80 грн

Купить

Розетка накладная компьютерная интернет Viko Carmen

На складе в г. Кривой Рог

Доставка по Украине

112.47 грн

Купить

Удлинитель для офиса GTV на 3 розетки SCHUCKO с заземлением, USB, аудио, интернет выход алюминий

Под заказ

Доставка по Украине

1 658.80 грн

Купить

Накладка для розетки TV Merten D-Life MTN4123-6033 Сахара

На складе в г. Львов

Доставка по Украине

466.13 грн

Купить

Накладка для розетки TV Merten D-Life MTN4123-6034 Антрацит

На складе в г. Львов

Доставка по Украине

524.63 грн

Купить

Смотрите также

Накладка для розетки TV Merten D-Life MTN4123-6035 Белый лотос

На складе в г. Львов

Доставка по Украине

187.20 грн

Купить

Накладка для розетки TV Merten D-Life MTN4123-6036 Нержавеющая сталь

На складе в г. Львов

Доставка по Украине

524. 63 грн

Купить

Накладка для розетки TV Merten D-Life MTN4123-6050 Никель

На складе в г. Львов

Доставка по Украине

1 749.85 грн

Купить

Накладка Schneider Merten D-Life белый лотос для механизма интернет розетки RJ45 (MTN4521-6035)

Доставка по Украине

350 грн

Купить

Накладка Schneider Merten D-Life белый лотос для механизма интернет розетки двойная RJ45 (MTN4522-6035)

Доставка по Украине

380 грн

Купить

Накладка Schneider Merten D-Life сахара для механизма интернет розетки RJ45 (MTN4521-6033)

Доставка по Украине

408 грн

Купить

Накладка Schneider Merten D-Life сахара для механизма интернет розетки двойная RJ45 (MTN4522-6033)

Доставка по Украине

438 грн

Купить

Накладка Schneider Merten D-Life сахара для механизма 2-х модульной интернет розетки SE (MTN4574-6033)

Доставка по Украине

992 грн

Купить

Накладка для розетки TV Merten D-Life MTN4123-6051 Шампань

На складе в г. Львов

Доставка по Украине

1 749.85 грн

Купить

Накладка для розетки TV Merten D-Life MTN4123-6052 Мокко

На складе в г. Львов

Доставка по Украине

1 749.85 грн

Купить

Накладка Schneider Merten D-Life сахара для механизма 2-х модульной интернет розетки RJ45 (MTN4572-6033)

Доставка по Украине

1 050 грн

Купить

Накладка Schneider Merten D-Life сталь для механизма интернет розетки RJ45 (MTN4521-6036)

Доставка по Украине

466 грн

Купить

Накладка Schneider Merten D-Life сталь для механизма интернет розетки двойная RJ45 (MTN4522-6036)

Доставка по Украине

496 грн

Купить

Накладка Schneider Merten D-Life сталь для механизма 2-х модульной интернет розетки (MTN4574-6036)

Доставка по Украине

1 050 грн

Купить

Что такое интернет-сокет? (с изображением)

`;

Интернет

Факт проверен

С. А. Киль

Интернет-сокет — это термин, используемый для обозначения точки подключения, которую любая компьютерная программа может использовать для передачи данных через Интернет. Они не являются физической конструкцией, как электрическая розетка, а представляют собой концепцию компьютерного программного обеспечения. С таким сокетом любые необходимые данные могут перемещаться туда и обратно от программы, работающей на одном компьютере, к программе, работающей на другом; во многих случаях это к и от клиента и сервера. Этот термин также используется для обозначения интерфейса прикладного программирования (API), который программисты могут использовать для создания таких сетевых приложений, способных отправлять и получать данные через Интернет.

Сокеты

работают на верхних уровнях стека интернет-протокола (IP), известных как транспортный уровень, где данные передаются от приложения в сеть через операционную систему. Когда приложение на компьютере хочет отправлять и получать данные через сетевое соединение, оно просит операционную систему открыть интернет-сокет. Сокет настраивается и состоит из информации о протоколе, такой как протокол пользовательских дейтаграмм (UDP) или протокол управления передачей (TCP), а также адресов отправки и получения обоих компьютеров и номера IP-порта для соединения. Также возможно создание интернет-сокета, который обходит операционную систему и отправляет необработанные пакеты, не позволяя операционной системе компьютера сначала обработать дополнительную информацию о сокете.

Как обычно используется на интернет-сервере, серверное программное обеспечение запускается и открывает прослушивающий сокет. Когда сервер получает запрос на данные, он создает уникальный сокет для запрашивающего клиента, который затем использует для передачи любых запрошенных данных. Эти типы соединений также называются сеансом, поскольку сокет закрывается сервером после завершения работы клиента. Таким образом, сервер может создавать любое количество одновременных сокетов с другими клиентами, каждый со своим уникальным идентификатором, и доставлять данные, уникальные для каждого клиента.

Таким образом, существует три основных типа интернет-сокетов. Одним из таких типов является сокет дейтаграммы. Это быстрое соединение через сокет, не требующее дополнительной связи для установления выделенного соединения перед отправкой пакетов данных. По этой причине их часто называют сокетами без установления соединения, и в качестве транспортного протокола они используют UDP. Это что-то вроде метода «выстрелил и забыл», в котором нет проверки последовательности пакетов или исправления ошибок.

Однако сокеты, ориентированные на соединение, называемые потоковыми сокетами, проходят несколько дополнительных шагов для установления канала связи между клиентом и сервером. Они используют TCP или другой протокол, известный как протокол передачи с управлением потоком (SCTP), для транспорта. Этот тип интернет-сокета более надежен и имеет средства для обработки таких ошибок, как отсутствие пакетов.

Еще один уникальный тип интернет-сокета используется в основном для маршрутизации компьютерной сети. Этот тип сокета пропускает транспортный уровень стека IP, вместо этого передавая пакет из сети прямо в приложение с неповрежденной информацией о сокете. Такие необработанные сокеты позволяют намного быстрее доставлять пакеты в приложение, поскольку операционная система компьютера не может сначала обработать пакеты. Протокол контрольных сообщений Интернета (ICMP) использует такие необработанные сокеты, когда один компьютер просто хочет «пинговать» другой.

Вам также может понравиться

Рекомендуется

КАК ПОКАЗАНО НА:

Программирование сетевых сокетов — документация Idris 1.3.3

API сокетов POSIX поддерживает связь между процессами через сеть. Сокет представляет собой конечную точку сетевого соединения и может быть в одном из нескольких состояний:

  • Готов , исходное состояние
  • Bound , что означает, что он был привязан к адресу, готовому для входящих соединения
  • Прослушивание
    , что означает прослушивание входящих соединений
  • Open , что означает готовность к отправке и приему данных;
  • Закрыт , что означает, что он больше не активен.

На следующей диаграмме показано, как операции, предоставляемые API, изменяют состояние, где Готов — начальное состояние:

Если соединение Open , то мы также можем отправить сообщение на другой конец соединения и recv сообщений от него.

Пакет contrib содержит модуль Network.Socket , который предоставляет примитивы для создания сокетов и отправки и получения Сообщения. Он включает следующие функции:

 bind : (sock : Socket) -> (addr : Maybe SocketAddress) -> (port : Port) -> IO Int
connect : (sock : Socket) -> (addr : SocketAddress) -> (port : Port) ->
IO ResultCode слушать: (носок: сокет) -> IO Int accept: (sock: Socket) -> IO (либо SocketError (Socket, SocketAddress)) send : (sock : Socket) -> (msg : String) -> IO (либо код результата SocketError) recv : (sock : Socket) -> (len : ByteLength) -> IO (либо SocketError (String, ResultCode)) закрыть: сокет -> ввод-вывод ()

Эти функции охватывают переходы состояний на диаграмме выше, но никто из них не объясняет, как операции влияют на состояние! Это прекрасно можно, например, попытаться отправить сообщение на сокет, который еще не готов, или попытаться получить сообщение после закрытия сокета.

Используя ST , мы можем предоставить лучший API, который точно объясняет, как каждая операция влияет на состояние соединения. В этом разделе мы определить API сокетов, а затем использовать его для реализации «эхо-сервера», который отвечает на запросы от клиента, возвращая одно отправленное сообщение клиентом.

Определение интерфейса

Sockets

Вместо использования IO для низкоуровневого программирования сокетов мы реализуем интерфейс с использованием ST , который точно описывает, как каждая операция влияет на состояние сокетов и описывает, когда сокеты создаются и удалено. Мы начнем с создания типа для описания абстрактного состояния. сокета:

 data SocketState = Ready | Связанный | Прослушивание | Открыть | Закрыто
 

Затем мы начнем определять интерфейс, начиная с Носок тип для представления сокетов, параметризованных их текущим состоянием:

 interface Sockets (m : Type -> Type), где
  Носок: SocketState -> Тип
 

Сокеты создаем методом socket . SocketType

определен библиотекой сокетов и описывает, является ли сокет TCP, UDP, или какая-то другая форма. Мы будем использовать для этого Stream , что указывает на TCP-сокет.

 сокет: SocketType -> ST m (либо () Var) [addIfRight (Sock Ready)]
 

Помните, что addIfRight добавляет ресурс, если результат операции имеет вид Right val . По соглашению в этом интерфейсе мы будем использовать Либо для операций, которые могут потерпеть неудачу, независимо от того, могут ли они выполняться любую дополнительную информацию об ошибке, чтобы мы могли последовательно используйте addIfRight и некоторые другие функции уровня типа.

Чтобы определить сервер, после того, как мы создали сокет, нам нужно связать его в порт. Мы можем сделать это с помощью bind метод:

 bind : (sock: Var) -> (addr: возможно, SocketAddress) -> (port: Port) ->
       ST m (либо () ()) [sock ::: Sock Ready :-> (Sock Closed `или` Sock Bound)]
 

Привязка сокета может завершиться ошибкой, например, если сокет уже существует привязан к данному порту, поэтому он снова возвращает значение типа или . Действие здесь использует функцию уровня типа или и говорит, что:

  • 0040 Носок закрыт состояние
  • Если bind завершается успешно, сокет переходит в состояние Sock Bound , как показано на схеме выше

или реализуется следующим образом:

 или : a -> a -> либо b c -> a
или x y = либо (const x) (const y)
 

Таким образом, тип bind может быть эквивалентно записан как:

 bind : (sock : Var) -> (addr : Maybe SocketAddress) -> (port : Port) ->
       STrans m (Или () ()) [носок ::: Носок готов]
                    (либо [sock ::: Sock Closed] [sock ::: Sock Bound])
 

Однако использование или гораздо более лаконично, чем это, и попытки отражать диаграмму переходов состояний как можно более прямо, оставаясь при этом улавливание возможности неудачи.

После того, как мы привязали сокет к порту, мы можем начать прослушивание подключений от клиентов:

 слушать : (sock : Var) ->
         ST m (Either () ()) [sock ::: Sock Bound :-> (Sock Closed `или` Sock Listening)]
 

Сокет в состоянии Listening готов принимать соединения от индивидуальные клиенты:

 принять : (носок : Var) ->
         ST m (Либо () Var)
              [sock ::: Sock Listening, addIfRight (Sock Open)]
 

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

Нам также нужны методы для отправки и получения данных на сокете:

 send : (sock : Var) -> String ->
       ST m (Или () ()) [sock ::: Sock Open :-> (Sock Closed `или` Sock Open)]
recv : (носок : Var) ->
       ST m (либо () строка) [sock ::: Sock Open :-> (Sock Closed `или` Sock Open)]
 

Как только мы закончим общение с другой машиной через сокет, мы хочу закрыть соединение и удалить сокет:

 close : (sock : Var) ->
        {auto prf : CloseOK st} -> ST m () [sock ::: Sock st :-> Sock Closed]
удалить : (носок : Var) ->
         ST m () [Удалить носок (Sock Closed)]
 

У нас есть предикат CloseOK , используемый close в неявном доказательстве аргумент, который описывает, когда можно закрыть сокет:

 data CloseOK : SocketState -> Type where
     ЗакрытьОткрыть : ЗакрытьОК Открыть
     CloseListening : CloseOK Прослушивание
 

То есть мы можем закрыть сокет который Открыть , разговаривая с другой машиной, что приводит к прекращению связи. Мы также можем закрыть сокет, который is Прослушивание для входящих подключений, что приводит к остановке сервера прием запросов.

В этом разделе мы реализуем сервер, но для полноты картины мы можем также хочу, чтобы клиент подключался к серверу на другом компьютере. Мы можем это с connect :

 connect: (sock: Var) -> SocketAddress -> Port ->
          ST m (Или () ()) [sock ::: Sock Ready :-> (Sock Closed `или` Sock Open)]
 

Для справки, вот полный интерфейс:

 Интерфейс Сокеты (m : Тип -> Тип), где
  Носок: SocketState -> Тип
  socket : SocketType -> ST m (Ither () Var) [addIfRight (Sock Ready)]
  bind: (sock: Var) -> (addr: возможно, SocketAddress) -> (port: Port) ->
         ST m (либо () ()) [sock ::: Sock Ready :-> (Sock Closed `или` Sock Bound)]
  слушать : (носок : Вар) ->
           ST m (Either () ()) [sock ::: Sock Bound :-> (Sock Closed `или` Sock Listening)]
  принять : (носок : Var) ->
           ST m (Either () Var) [sock ::: Sock Listening, addIfRight (Sock Open)]
  connect: (sock: Var) -> SocketAddress -> Port ->
            ST m (Или () ()) [sock ::: Sock Ready :-> (Sock Closed `или` Sock Open)]
  close : (sock : Var) -> {auto prf : CloseOK st} ->
          ST m() [носок ::: Носок st :-> Носок Закрыт]
  remove : (sock : Var) -> ST m () [Удалить носок (Sock Closed)]
  отправить: (носок: Var) -> строка ->
         ST m (Или () ()) [sock ::: Sock Open :-> (Sock Closed `или` Sock Open)]
  recv : (носок : Var) ->
         ST m (либо () строка) [sock ::: Sock Open :-> (Sock Closed `или` Sock Open)]
 

Вскоре мы увидим, как это реализовать; в основном методы могут быть реализованы в IO , напрямую используя API необработанных сокетов. Хотя сначала посмотрим как использовать API для реализации «эхо-сервера».

Внедрение «эхо-сервера» с

сокетами

На верхнем уровне наш эхо-сервер начинается и заканчивается без доступных ресурсов, и использует интерфейсы ConsoleIO и Sockets :

 startServer : (ConsoleIO m, Sockets m) => ST m () []
 

Первое, что нам нужно сделать, это создать сокет для привязки к порту и прослушивание входящих соединений с использованием сокета . Это может потерпеть неудачу, поэтому нам нужно иметь дело со случаем, когда он возвращает Right sock , где sock — это новая переменная сокета, или где она возвращает Left err :

 startServer : (ConsoleIO m, Sockets m) => ST m () []
стартовый сервер =
  do Right sock <- socket Stream
           | Левая ошибка => чистая ()
     ?что теперь
 

Рекомендуется реализовать эту функцию интерактивно, шаг за шагом. шаг, используя отверстия, чтобы увидеть, в каком состоянии находится вся система после каждого шаг. Здесь мы видим, что после успешного вызова сокета мы сокет доступен в состоянии Ready :

 sock : Var
  m : Тип -> Тип
  ограничение: ConsoleIO m
  ограничение1 : Сокеты m
--------------------------------------
whatNow : STrans m () [sock ::: Sock Ready] (\result1 => [])
 

Далее нам нужно привязать сокет к порту и начать слушать связи. Опять же, каждый из них может выйти из строя. Если да, мы удалим розетка. Сбой всегда приводит к тому, что сокет находится в состоянии Closed , поэтому все, что мы можем сделать, это удалить it:

 startServer : (ConsoleIO m, Sockets m) => ST m () []
стартовый сервер =
  do Right sock <- socket Stream | Левая ошибка => чистая ()
     Правильно ок <- привязать носок Ничего 9442 | Левая ошибка => удалить носок
     Правильно ок <- слушать носок | Левая ошибка => удалить носок
     ?runServer
 

Наконец, у нас есть сокет, который прослушивает входящие соединения:

 ok : ()
  носок : Вар
  хорошо1 : ()
  m : Тип -> Тип
  ограничение: ConsoleIO m
  ограничение1 : Сокеты m
--------------------------------------
runServer: STrans m () [sock ::: Sock Listening]
                   (\результат1 => [])
 

Мы реализуем это в отдельной функции. Тип runServer сообщает нам, каким должен быть тип echoServer (отмечая, что нам нужно дать m аргумент для Sock явно):

 echoServer : (ConsoleIO m, Sockets m) => (sock : Var) ->
             ST m () [удалить носок (Sock {m} Listening)]
 

Мы можем завершить определение startServer следующим образом:

 startServer : (ConsoleIO m, Sockets m) => ST m () []
стартовый сервер =
  do Right sock <- socket Stream | Левая ошибка => чистая ()
     Правильно ок <- привязать носок Ничего 9442 | Левая ошибка => удалить носок
     Правильно ок <- слушать носок | Левая ошибка => удалить носок
     носок эхосервера
 

В echoServer мы продолжим принимать запросы и отвечать на них пока что-то не выйдет из строя, после чего мы закроем сокеты и возвращаться. Начнем с попытки принять входящее соединение:

 echoServer : (ConsoleIO m, Sockets m) => (sock : Var) ->
             ST m () [удалить носок (Sock {m} Listening)]
носок эхо-сервера =
  делать правильно новый <- принять носок | Левая ошибка => закрыть носок; снять носок
     ?что теперь
 

Если принять не удается, нам нужно закрыть Прослушивание сокета и удалите его перед возвратом, потому что тип echoServer требует это.

Как всегда, постепенное внедрение echoServer означает, что мы можем проверить состояние, в котором мы находимся, когда мы развиваемся. Если принять успешно, мы имеем существующий sock , который все еще прослушивает соединения, и новый сокет, который открыт для связи:

 новый : Var
  носок : Вар
  m : Тип -> Тип
  ограничение: ConsoleIO m
  ограничение1 : Сокеты m
--------------------------------------
whatNow: STrans m () [sock ::: Sock Listening, новый ::: Sock Open]
                      (\результат1 => [])
 

Для завершения echoServer мы получим сообщение на новый socket и повторить его обратно. Когда мы закончим, мы закроем новый сокет , и вернуться к началу echoServer для обработки следующего подключение:

 echoServer: (ConsoleIO m, Sockets m) => (sock: Var) ->
             ST m () [удалить носок (Sock {m} Listening)]
носок эхо-сервера =
  делать правильно новый <- принять носок | Левая ошибка => закрыть носок; снять носок
     Правильный msg <- recv новый | Левая ошибка => закрыть носок; снять носок; удалить новый
     Правильно ок <- отправить новый ("Вы сказали " ++ msg)
           | Левая ошибка => удалить новый; закрыть носок; снять носок
     закрыть новый; удалить новый; носок эхосервера
 

Реализация

Sockets

Чтобы реализовать Sockets в IO , мы начнем с указания конкретного типа для носка . Мы можем использовать API необработанных сокетов (реализованный в Network.Socket ) для этого и используйте Socket , хранящийся в состоянии , нет независимо от того, в каком абстрактном состоянии находится сокет:

 реализация Sockets IO, где
  Sock _ = сокет состояния
 

Большинство методов можно реализовать с помощью API сырых сокетов. напрямую, возвращая Левый или Правый в зависимости от ситуации. Например, мы можем реализовать socket , bind и listen следующим образом:

 socket ty = do Right sock <- lift $ Socket.socket AF_INET ty 0
                    | Левая ошибка => чистая (левая ())
               lbl <- новый носок
               чистый (правильный фунт)
bind sock addr port = do ok <- lift $ bind !(read sock) addr port
                         если нормально /= 0
                            затем чистый (левый ())
                            иначе чисто (Правильно ())
listen sock = do ok <- lift $ listen !(read sock)
                 если нормально /= 0
                    затем чистый (левый ())
                    иначе чисто (Правильно ())
 

Есть небольшая трудность с принять , однако, потому что когда мы используйте новый , чтобы создать новый ресурс для открытого соединения, он появляется в начале списка ресурсов, а не в конце. Мы можем увидеть это по написание неполного определения, используя , возвращая , чтобы увидеть, что ресурсы должны быть, если мы вернем Right lbl :

 accept sock = do Right (conn, addr) <- lift $ accept !(read sock)
                       | Левая ошибка => чистая (левая ())
                 фунт <- новый конн
                 возвращение (правый фунт) ?fixResources
 

Удобно new добавить ресурс в начало список, потому что, как правило, это делает автоматическое построение доказательства с авто -неявно проще для Идриса. С другой стороны, когда мы используем вызов , чтобы сделать меньший набор ресурсов, обновление с ставит заново созданные ресурсы в конце списка, потому что в целом это уменьшает объем повторного заказа ресурсов.

Если мы посмотрим на тип fixResources , мы видим, что нам нужно сделать, чтобы закончить accept :

 _bindApp0 : Socket
  соединение : сокет
  адрес : SocketAddress
  носок : Вар
  фунт : вар
--------------------------------------
fixResources: STrans IO () [lbl ::: State Socket, sock ::: State Socket]
                      (\value => [sock ::: State Socket, lbl ::: State Socket])
 

Текущий список ресурсов заказан lbl , sock , и они нам нужны быть в порядке носок , фунтов . Чтобы помочь в этой ситуации, Control.ST предоставляет примитив toEnd , который перемещает ресурс в конец списка. Таким образом, мы можем завершить accept следующим образом:

 accept sock = do Right (conn, addr) <- lift $ accept !(читать sock)
                       | Левая ошибка => чистая (левая ())
                 фунт <- новый конн
                 возврат (справа фунт) (до конца фунт)
 

Для полной реализации Розетки , взгляните на образцов/ST/Net/Network.idr в дистрибутиве Idris. Вы также можете найдите там полный эхо-сервер, EchoServer.idr . Есть также сетевой протокол более высокого уровня, RandServer.idr , с использованием иерархии конечные автоматы для реализации высокоуровневого сетевого протокола связи с точки зрения API сокетов нижнего уровня. Это также использует многопоточность, чтобы обрабатывать входящие запросы асинхронно. Вы можете найти более подробную информацию о многопоточности и сервере случайных чисел в черновом документе Конечные автоматы на всем пути вниз Эдвин Брэди.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *