Содержание

Как работает, что умеет и для чего нужна умная розетка Яндекс

Умная розетка — это отличный гаджет, который может превратить любой электрический прибор в умный. А розетка от Яндекса управляется через удобное приложения или голосовыми командами, которые обрабатываются голосовым помощником Алисой. Яндекс розетка вставляется в обычную розетку и не требует знаний электрики, как например для монтажа встроенных умных розеток. Ещё один плюс этого гаджета — это недорогая цена.

Как работает Яндекс розетка?

Умная Яндекс розетка является простым прибором, с помощью которого можно управлять питанием через мобильное приложение или с помощью голосовых команд. Так же можно задавать таймер включения и выключения. Или использовать ее в сценариях с другими приборами умного дома. С помощью этих функций можно придумать огромное количество способов ее использования. Давайте попробуем придумать различные сценарии.

Что умеет умная розетка от Яндекса?

  1. Подключив розетку к чайнику можно включать или выключать чайник дистанционно, через приложение или голосовой командой. Захотелось чайку? Просто скажите об этом Алисе и она включит чайник.
  2. Не помните выключить вы утюг или нет? Просто посмотрите в приложении и при необходимости выключите его. Благодаря этому вы спасете свое имущество от пожара.
  3. Собрались на дачу, а на улице холодно? Если включить в Яндекс розетку обогреватель на даче, то вы сможете удаленно обогреть дачу к своему приезду. Просто включите обогреватели удаленно через приложения.

И таких сценариев можно придумать бесконечно много. Если у вас есть идеи как можно использовать умную розетку от Яндекса пишите в комментарии. Мы обязательно прочитаем и самые интересные будут добавляться в эту статью.

Умная розетка Яндекс белая (YNDX-0007W) работает с Алисой

Общие характеристики

Работает в системе “умный дом”

есть

Протокол связи

Wi-Fi

Тип соединения устройств

беспроводное

Тип комплектации

прибор в сборе

Экосистема

Умный дом Яндекса

Номинальное напряжение

230 В

Макс. мощность

3680 Вт

Количество гнёзд (постов)

1 шт.

Номинальный ток

16 А

Заземляющий контакт

есть

Ширина устройства

55 мм

Высота устройства

55 мм

Глубина устройства

80 мм

Подключение к смартфону

есть

Материал

пластик

EAN

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

Что такое умная розетка? Как они работают и как их использовать?

Подробности
января 12, 2021
Просмотров: 2358

Итак, вы решили сделать решительный шаг и присоединиться к 21 веку, превратив свой дом в умный дом.

Но с чего начать, когда доступно столько гаджетов и устройств для умного дома? И как с ограниченным бюджетом воплотить в жизнь мечты об умном доме?

Ответ прост: умные розетки.

Что такое умная розетка? Умная розетка — это небольшой адаптер, который можно подключить к обычной розетке электросети и у которой есть Wi-Fi.

После подключения умной розеткой можно управлять удаленно через приложение, установленное на смартфоне. Любое устройство или прибор, подключенный к адаптеру интеллектуальной розетки, можно включить или выключить с помощью смартфона.

Умные розетки позволяют легко автоматизировать и контролировать мелкую бытовую технику и устройства в вашем доме. И поскольку они недорогие, они являются доступным вариантом для того, чтобы начать превращать свой дом в умный дом.

В этой статье мы рассмотрим, как работают умные розетки, их преимущества и как вы можете заставить умные розетки работать на вас.

Как работают умные розетки?

Умные розетки превращают обычные устройства в вашем доме в «умные». Они делают это, позволяя вам управлять подачей питания на устройство через приложение на вашем смартфоне.

Вы можете взять любую обычную электрическую розетку в доме и вставить в нее умную вилку. Физическая розетка в стене останется прежней, в то время как прибором или устройством, подключенным к интеллектуальной розетке, теперь можно управлять с помощью смартфона.

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

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

Затем загрузите приложение производителя на свой смартфон. Большинство приложений для умных подключений доступны в Apple App Store или Google Play.

Через приложение на смартфоне вы можете подключиться к умной розетке и получать информацию о ее использовании.

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

И вуаля! Теперь вы можете включать и выключать прибор с помощью смартфона.

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

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

Доступны умные розетки, которые можно подключить к Amazon Alexa или Google Assistant. С помощью этой опции вы можете управлять умной розеткой с помощью простых голосовых команд.

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

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

Вы можете купить их по отдельности или в упаковке по два и более. Некоторые интеллектуальные розетки также доступны в виде удлинителей для использования с несколькими устройствами.

Нужен ли умным розеткам Wi-Fi?

Чтобы ваша умная розетка работала, вам понадобится стабильное соединение Wi-Fi. Умная розетка должна быть подключена к вашему смартфону через соединение Wi-Fi, чтобы они могли общаться друг с другом.

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

Зачем использовать умные розетки?

В любое время, когда вы хотите сделать свои «глупые» приборы и устройства «умнее», вы можете подключить их к интеллектуальной розетке и наслаждаться легкостью управления ими с ладони на смартфоне.

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

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

Или как насчет того, чтобы осознать, что вы забыли выключить свет в гостиной, когда укутались на ночь под одеялом.

Вы можете оставить эти ситуации в прошлом, подключив эти приборы к интеллектуальной розетке.

Умные розетки позволяют автоматизировать бытовую технику и устройства в вашем доме, сделать их более эффективными и адаптированными к вашим личным предпочтениям.

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

Купить умные розетки на aliexpress

Идеи для умной розетки

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

Но если вам нужно еще несколько идей, чтобы ваши творческие соки текли, мы составили список идей, как можно использовать умные розетки.

  1. Хотите включить свет перед тем, как прийти с работы поздно вечером?

Умные розетки позволяют включать свет одним касанием смартфона, поэтому вам не придется заходить в темный дом.

  1. Хотите ограничить время, которое ваши дети проводят у телевизора и играют в видеоигры?

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

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

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

  1. Некоторые приложения для умных розеток имеют дополнительные функции, например, позволяют приглушить свет.

Вам не нужно вставать с дивана, чтобы выключить свет перед началом фильма, если вы начнете использовать умные розетки.

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

Вы даже можете изменять расписание в разные дни недели и часы дня.

  1. Вы можете настроить кофеварку так, чтобы приготовить первую чашку кофе еще до того, как встанете с постели.
  2. «Отключение света» в детских комнатах можно настроить на разное время в школьные дни и по выходным.
  3. Вы когда-нибудь выходили из дома и забывали, что щипцы для завивки или обогреватель все еще включены и нагреваются?

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

Умные розетки — это недорогой способ обновить вашу бытовую технику или устройства до умных. У них много преимуществ, включая повышение энергоэффективности и безопасности.

С помощью умных розеток вы можете использовать всю мощь технологий умного дома в любой части вашего дома.


Читайте также

 

 

 

 

Как работает IT-подразделение Rozetka: 560 сотрудников, высокие зарплаты, курсы и детский сад

21 Июня, 2021, 12:01

4561

Сооснователь Rozetka Владислав Чечеткин дал интервью изданию DOU. В частности рассказал о том, как из интернет-магазина Rozetka превратилась в продуктовую компанию, сколько айтишников сегодня работает, как их мотивируют.

AIN.UA выбрал самые интересные тезисы и цитаты.

IT-специалисты в Rozetka

  • В компании работает более 5200 сотрудников, из них 560 — ІТ-специалисты. 
  • Большая часть айтишников работает в штате Rozetka, небольшая часть — на аутсорсе.
  • В компании более 50 ІТ-команд, каждая из них отвечает за какую-то часть работы или за отдельный продукт.

«Если взять Rozetka, то технологически это не самый сложный бизнес, но даже у нас работают сотни людей в ІТ и есть потребность еще в сотне. Любой бизнес-процесс в компании связан с ІТ, точно так же происходит в других бизнесах. Поэтому пока спрос превышает предложение и айтишники очень востребованы», — заявил Владислав Чечеткин.

Как Rozetka стала IT-компанией

Первой версией Rozetka был простой интернет-магазин на базе PHP плюс SQL. Учет велся в Excel, потом был 1С, связка 1С с веб-сайтом — обмен заказами, какими-то характеристиками товаров. По мере роста компании IT-подрядчику было все сложнее удовлетворять потребности Rozetka — нужно было что-то менять, чтобы успевать за прогрессом.

В 2011 году Rozetka полностью перешла на новую платформу от OWOX. К сожалению, OWOX не смогла повторить многие функции из тех, которые были на старом веб-сайте — на этом компания сильно потеряла, но выбора не было. Какое-то время удавалось расти на этой платформе, но вскоре уперлись в очередную проблему. 

«Мы разрабатывали фичи, платили за них деньги, они появлялись на Rozetka и тут же, например, на сайте «Эльдорадо» или где-то еще. Потом оказалось, что эти компании все равно не могут сварить каши с OWOX, и потихоньку «отваливались», — рассказал Чечеткин.

Владу Флаксу, основателю OWOX, в Украине было уже неинтересно, он пытался развиваться в России и еще где-то, где рынки больше. В какой-то момент мы поняли, что OWOX — уже тормозящая сила для компании».

Тогда приняли решение переходить на свою разработку. Большая часть людей, которые занимались проектом, перешли из OWOX в Rozetka. С тех пор компания самостоятельно развивает свой продукт.

Как устроена IT-часть процессов Rozetka

Ни один процесс в Rozetka сейчас не обходится без ІТ: закупка товара, ценообразование, доставка, прием заказов, логистика, контакт-центр, возврат, сервисное обслуживание. Rozetka использует десятки ІТ-продуктов. Примерно 90% из них — собственной разработки. Но некоторые вещи до сих пор на аутсорсе.

Часто, покупая сторонний IT-продукт или сервис, штатные разработчики Rozetka затем практически полностью ее переделывают.

«Допустим, мы купили Terrasoft как CRM-систему и начали ее развивать. У нас есть поддержка Terrasoft, обновления и так далее. Затем из-за нашего видения бизнес-процессов, нашего масштаба, активности получается так, что система переписана, скажем, на 70%. Приходит время ее поддерживать от Terrasoft, нужно запустить обновления, но сделать это невозможно, потому что это уже совершенно другая система. Выходит, что дальше мы работаем с ней самостоятельно, сами ее развиваем», — пояснил Владислав.

В Rozetka регулярно смотрят на метрики, ежедневно запущено десятки А/В-тестов. Таким образом в компании принимают решение, что где нужно поменять или добавить, чтобы стать еще лучше.

Как мотивируют сотрудников

  • У сотрудников есть доступ к специальным ценам на Rozetka. На этих покупках компания не зарабатывает. Это значительная добавка к соцпакету. Этим пользуются многие сотрудники.
  • Rozetka перешла на удаленку на несколько недель раньше, чем начался локдаун. Сейчас часть сотрудников уже вернулась в офисы, однако Чечеткин допускает, что в будущем будут комбинированные варианты: несколько дней в офисе, несколько — дома.
  • У Rozetka есть два офиса: в Киеве и Днепре. Сейчас рассматривают возможность использования коворкингов или каких-то выделенных офисов в других городах. Первые в очереди — Винница, Харьков и Львов.
  • До локдауна у Rozetka был свой детский сад с нянями и воспитателями: люди, которые работают в субботу/воскресенье, могли приводить детей от 2 до 8 лет. Сейчас в связи с локдауном он не работает.
  • Для всей компании есть внутренний корпоративный курс, который прошли уже сотни людей. Компания также оплачивает различные курсы и программы по запросу сотрудников. До локдауна были курсы английского, занятия йогой. В ближайшее время для сотрудников компании Rozetka запускает IT-школу — в ней не IT-специалистов будут учить программированию.
  • По словам Чечеткина, зарплаты в Rozetka выше средних по IT-рынку. Есть системы грейдов, регулярных оценок, пересмотров зарплаты. Достойный уровень зарплат он назвал «гигиеной» в бизнесе.

Читайте также:

Умные розетки TP-Link HS110 и TP-Link HS100.

Что это, и как работают?

Ну вот, уже и розетки стали умными:) Сегодня расскажу вам об умных розетках от компании TP-Link. Компания TP-Link начала активно разрабатывать разные устройства для умного дома. Сначала облачные камеры, о настройке которой я уже писал здесь, дальше умные розетки, и уже видел информацию о лампочках, которыми наверное так же можно будет управлять с телефона. В любом случае, все это очень интересно и полезно.

Давайте сначала разберемся, что вообще такое умная розетка, для чего она нужна, и как работает.

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

Умная розетка подключается к вашей Wi-Fi сети. А к ней вы подключаете устройство, которым хотите управлять.

На мобильное устройство устанавливаем приложение Kasa, через которое будем управлять умными розетками. Дальше нужно просто настроить розетку, добавить ее в приложение. Как это сделать, я писал в инструкции по настройке TP-Link HS100, и TP-Link HS110.

После настройки, со своего мобильного телефона вы сможете управлять розеткой. Включать и отключать питание, настраивать таймер включения, или отключения, настраивать режим работы. А если у вас модель TP-Link HS110, то можно еще смотреть расход электроэнергии.

Важный момент! Вы можете управлять питанием устройства подключенного через эту розетку не только тогда, когда подключены к домашней Wi-Fi сети. Вы можете находится в любом месте, и даже в другой стране. Главное, чтобы у вас на мобильном устройстве был интернет. Все работает через облако.

Уже примерно две недели я пользуюсь розетками TP-Link HS100, и TP-Link HS110. Прикольные устройства, которым можно найти практичное применение. Хотя, мне так и не удалось это сделать. Возможностей на самом деле много. Можно включать систему отопления, например, за час до того, как вы придете домой. Включать утюг через эту розетку, и не боятся оставить его включенным. Так как вы в любой момент можете это проверить.

В приложении можно настроить время включения, или отключения питания. Так же там есть режим «нет дома». Когда розетка автоматически включает и отключает устройства. Например, светильник. Как будто вы дома.

Обзор TP-Link HS110 и TP-Link HS100

Устройства максимально простые и понятные. Поэтому, обзор будет коротким. Ну как обычно:)

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

Корпус устройства сделан из белого матового, и глянцевого пластика. Сборка очень хорошая. У кого есть устройства от TP-Link, меня поймут.

Устройства несомненно интересные, и у них есть будущее. Думаю, в ближайшее время эти розетки смогут взаимодействовать с другими устройствами для умного дома.

Если у вас есть устройство, которые нужно контролировать удаленно, то такая розетка это отличное решение. А если купить старшую модель TP-Link HS110, то можно еще и потребление электроэнергии контролировать. Может это и бесполезное занятие, зато интересное:)

А что вы думаете о таких устройствах? Если у вас уже есть эти розетки, то оставляйте свои отзывы в комментариях!

Умная розетка WiFi Smart Plug Apple HomeKit

  • Вы сможете контролировать освещение и электробытовые приборы (например, телевизор, кондиционер) в любом месте и в любое время.
  • Функции: Удаленное включение / выключение подключенного устройства. Поддержка проверки состояния устройства в режиме реального времени на приложении.
  • Работает с голосовым управлением Amazon, Google Assistant, голосовым управлением HomeKit, Siri
Характеристики:
Материал: АБС + поликарбонат, цвет – белый
Тип вилки: евровилка
Макс ток: 16А
Входное напряжение: 90-250 В переменного тока
Выходное напряжение: AC 90-250В
Размер: 50х49,1х83,5 мм
Размер упаковки: 104х86х52 мм
Вес упаковки: 173 г

Инструкция на русском языке – ЗДЕСЬ…

Отзыв покупателя:
Виталий О.

Достоинства
+ Работает с техникой Apple без проблем из коробки. Никаких хабов/переходников не нужно + Хорошая сборка. Не идеальный материал пластика, но он скорее хороший чем плохой. Опять же за такую то цену + Очень компактная розетка для своего класса устройств + Светодиод не очень яркий, не будет раздражать ночью. В тот же момент, его достаточно хорошо видно в темноте + Вилки очень легко и надежно вставляются в эту розетку + Розетка имеет кнопку включения/выключения и бороздку за счет чего кнопку можно очень легко и быстрой найти + Цена.

Недостатки
– Инструкция только на английском (но когда это кого останавливало) – В отличии от других розеток, здесь нужно сначала подключиться к Вай-Фаю который она раздает, вылезет окошко где нужно будет ввести пароль уже от ВАШЕГО вай-фая и уже потом идти в приложение “Дом” и добавлять аксессуар. Те мы как бы сообщаем розетке как подключиться к роутеру. Без этого аксессуар не обнаружится. Не очень очевидно, немного заморочено, но сделать это придется всего один первые раз. Кстати, после этого розетка “подхватилась” и настроилась айфоном очень быстро – При добавлении загорается “вы собираетесь подключить не сертифицированное устройство” речь идет о сертификации эппла. В принципе это ни на что не влияет, просто нам сообщают, что эппл не гарантирует корректность работы и вся ответственность на производителе – Код устройства находится в буклете-инструкции. Удобнее когда на самом устройстве на всякий случай.

Комментарий
Ничего кроме твердых пяти звезд эта розетка не заслуживает. Особенно за такую цену. Работает как надо, включит/выключить можно даже если вы в другом городе. Применений куча – например, я поставил на включение кондиционера и включаю его за 10 минут до прихода домой с жаркой улицы. Очень удобно. Наконец-то появилась розетка которая из коробки работает с HomeKit и стоит не заоблачных денег, можно по полной укомплектовать себе дом. Продавец, это отличный товар! Привози еще. Будем брать.

как работает и где используется? • Статьи Эпицентр

Эра удивительных технологий, «умных» домов и автоматизированного оборудования уже наступила. Благодаря этим достояниям человечества наша жизнь становится все более комфортной, удобной и безопасной, и совсем скоро без них будет трудно представить быт. Ярким примером интересных приспособлений будущего является смарт-розетка на базе Wi-Fi, подробнее о работе которой предлагаем узнать прямо сейчас.

«Умная» розетка – это многофункциональное устройство, которое позволяет управлять работой бытовой техники с любого места, где есть Интернет. Все, что нужно для того, чтобы розетка заработала – это подключить ее к электросети, соединиться по Wi-Fi с мобильным гаджетом на базе Android или iOS и осуществить необходимые настройки с помощью специализированного приложения.

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

«Умная розетка» – это еще и основа безопасной и экономной работы электрического оборудования, ведь она следит за микроклиматическими изменениями, мониторит уровень энергопотребления и позволяет в любой момент проверить, не забыл ли кто-то из домочадцев выключить утюг, электрическую плиту или другую технику. С ней можно запланировать автоматическое отключение бытовых приборов после определенного периода простоя и не беспокоиться о таких бытовых мелочах. Кроме того, устройство фиксирует резкие температурные перепады, что помогает предотвратить пожароопасные ситуации.

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

Общие сведения о сокетах | DigitalOcean

Введение

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

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

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

  • Потоковые сокеты , которые используют TCP в качестве основного транспортного протокола
  • Сокеты дейтаграмм , которые используют UDP в качестве основного транспортного протокола
  • Доменные сокеты Unix , которые используют локальные файлы для отправки и получения данных вместо сетевых интерфейсов и IP-пакетов.

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

Предварительные требования

Примеры в этом руководстве были проверены на сервере Ubuntu 20.04. Вы можете следовать этому руководству, используя большинство современных дистрибутивов Linux на локальном компьютере или удаленном сервере, если у вас установлена ​​эквивалентная версия каждого из необходимых инструментов для вашего дистрибутива.

Чтобы начать использовать Ubuntu 20.04, вам понадобится один сервер, который был настроен в соответствии с нашим руководством по начальной настройке сервера для Ubuntu 20.04.

Вы также можете использовать интерактивный терминал, встроенный в эту страницу, чтобы поэкспериментировать с примерами команд socat и nc , которые вы будете использовать в этом руководстве. Щелкните следующий Запустите интерактивный терминал! , чтобы начать работу.

Запустите интерактивный терминал!

Вам также понадобятся несколько других пакетов, чтобы исследовать сокеты в вашей системе.Убедитесь, что кеш пакетов вашей системы обновлен, используя команду apt update :

  

Затем установите необходимые пакеты с помощью этой команды:

  
  • sudo apt install iproute2 netcat-openbsd socat

Пакет iproute2 содержит утилиту ss , которую мы будем использовать для проверки сокетов. Мы будем использовать пакет netcat-openbsd для установки netcat. Обратите внимание, что netcat сокращается до nc , когда он вызывается из командной строки.Наконец, мы воспользуемся пакетом socat для создания примеров сокетов.

Что такое сокет Stream?

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

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

Типичное использование сокета потока на основе TCP – это веб-сервер, такой как Apache или Nginx, обрабатывающий HTTP-запросы на порту 80 или HTTPS на порту 443 .Для HTTP адрес сокета будет похож на 203.0.113.1:80 , а для HTTPS – на 203.0.113.1:443 .

Создание потоковых сокетов на основе TCP

В следующем примере вы воспользуетесь командой socat (сокращение от SOcket CAT ) для имитации веб-сервера, который прослушивает HTTP-запросы через порт 8080 (альтернативный HTTP-порт). Затем вы исследуете сокет с помощью команд ss и nc .

Сначала выполните следующие команды socat , чтобы создать два сокета на основе TCP, которые прослушивают соединения на порту 8080 , используя интерфейсы IPv4 и IPv6:

  
  • socat TCP4-СЛУШАТЬ: 8080, fork / dev / null &
  • socat TCP6-СЛУШАТЬ: 8080, ipv6only = 1, fork / dev / null &
  • Аргументы TCP4-LISTEN: 8080 и TCP6-LISTEN: 8080 – это тип протокола и номер порта для использования.Они сообщают socat создать сокеты TCP на порту 8080 на всех интерфейсах IPv4 и IPv6 и прослушивать каждый сокет на предмет входящих подключений. socat может прослушивать любой доступный порт в системе, поэтому любой порт от 0 до 65535 является допустимым параметром для опции сокета.
  • Опция fork используется для обеспечения того, чтобы socat продолжал работать после обработки соединения, в противном случае он завершился бы автоматически.
  • Путь / dev / null используется вместо адреса удаленного сокета. В этом случае он сообщает socat печатать любой входящий ввод в файл / dev / null , который автоматически отбрасывает его.
  • Флаг ipv6only = 1 используется для сокета IPv6, чтобы сообщить операционной системе, что сокет не настроен для отправки пакетов на сопоставленные IPv4-адреса. Без этого флага socat будет связываться как с адресами IPv4, так и с IPv6.
  • Символ и указывает оболочке выполнить команду в фоновом режиме.Этот флаг гарантирует, что socat продолжит работу, пока вы вызываете другие команды для проверки сокета.

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

  

Выход

[1] 434223 [2] 434224

Теперь, когда у вас есть два процесса socat , которые прослушивают TCP-порт 8080 в фоновом режиме, вы можете исследовать сокеты с помощью утилит ss и nc .

Исследование потоковых сокетов на основе TCP

Чтобы проверить сокеты TCP в современной системе Linux с помощью команды ss , запустите ее со следующими флагами, чтобы ограничить вывод:

  • Флаги -4 и -6 сообщают ss проверять только сокеты IPv4 или IPv6 соответственно. Если вы не укажете этот параметр, отобразятся оба набора сокетов.
  • Флаг t ограничивает вывод сокетами TCP. По умолчанию инструмент ss отображает все типы сокетов, используемых в системе Linux.
  • Флаг l ограничивает вывод слушающими сокетами. Без этого флага будут отображаться все TCP-соединения, в том числе SSH, клиенты, которые могут быть подключены к веб-серверу, или соединения, которые ваша система может иметь с другими серверами.
  • Флаг n обеспечивает отображение номеров портов вместо имен служб.

Сначала запустите команду ss -4 -tln , чтобы проверить сокеты на основе IPv4 TCP, которые прослушивают соединения в вашей системе:

  

Вы получите следующий результат:

  

Выход

State Recv-Q Send-Q Local Address: Port Peer Address: Port Process .. . СЛУШАТЬ 0 1 0.0.0.0:8080 0.0.0.0:* . . .

В вашем выводе могут быть другие строки с другими портами, в зависимости от того, какие службы запущены в вашей системе. Выделенная часть вывода 0.0.0.0:8080 указывает, что сокет IPv4 TCP прослушивает все доступные интерфейсы IPv4 на порту 8080 . Служба, которая прослушивает только определенный IPv4-адрес, будет отображать только этот IP-адрес в выделенном поле, например 203.0.113.1: 8080 .

Теперь снова запустите ту же команду ss , но с флагом -6 :

  

Вы получите следующий результат:

  

Выход

State Recv-Q Send-Q Local Address: Port Peer Address: Port Process . . . СЛУШАТЬ 0 5 [::]: 8080 [::]: * . . .

В вашем выводе могут быть другие строки с другими портами, в зависимости от того, какие службы запущены в вашей системе.Выделенная часть вывода [::]: 8080 указывает, что сокет IPv6 TCP прослушивает все доступные интерфейсы IPv6 на порту 8080 (на что указывают символы :: , которые являются нотацией IPv6 для адреса, составленного всех нулей). Служба, которая прослушивает только определенный IPv6-адрес, будет отображать только этот IP-адрес в выделенном поле, например [2604: a880: 400: d1 :: 3d3: 6001]: 8080 .

Подключение к потоковым сокетам на основе TCP

Итак, вы узнали, как создавать и перечислять сокеты TCP на интерфейсах IPv4 и IPv6.Теперь, когда у вас есть два сокета, ожидающих подключения, вы можете поэкспериментировать с подключением к сокетам с помощью утилиты netcat.

Использование netcat для тестирования TCP-соединений с локальными и удаленными сокетами – очень полезный метод устранения неполадок, который может помочь изолировать проблемы с подключением и межсетевым экраном между системами.

Чтобы подключиться к сокету IPv4 через локальный адрес обратной связи с помощью netcat, выполните следующую команду:

  
  • Флаг -4 указывает netcat на использование IPv4.
  • Флаг -v используется для вывода подробного вывода на ваш терминал.
  • Опция – z гарантирует, что netcat подключается только к сокету, без отправки каких-либо данных.
  • Локальный шлейфовый IP-адрес 127.0.0.1 используется, поскольку ваша система будет иметь свой собственный уникальный IP-адрес. Если вы знаете IP-адрес своей системы, вы также можете протестировать его. Например, если общедоступный или частный IP-адрес вашей системы – 203.0.113.1, вы можете использовать его вместо IP-адреса обратной петли.

Вы получите следующий результат:

  

Выход

Подключение к порту 127.0.0.1 (127.0.0.1) 8080 [tcp / http-alt] выполнено успешно!

Выделенная строка – это результат работы netcat. Это указывает на то, что netcat подключился к сокету TCP, который прослушивает loopback-адрес 127.0.0.1 IPv4 на порту 8080 . Вы можете игнорировать вторую строку, это от процесса socat, работающего в фоновом режиме в вашем терминале.

Теперь вы можете повторить тот же тест подключения, но с использованием IPv6.Выполните следующую команду netcat:

  

Вы должны получить следующий результат:

  

Выход

Подключение к :: 1 порту 8080 [tcp / http] выполнено успешно!

Выделенная строка – это результат работы netcat. Это указывает на то, что netcat подключился к сокету TCP, который прослушивает петлевой IPv6-адрес :: 1 на порту 8080 . Опять же, вы можете игнорировать вторую строку вывода.

Чтобы очистить сокеты, вам нужно запустить команду fg (передний план) для каждого процесса socat, который вы создали.Затем вы будете использовать CTRL + C , чтобы закрыть каждый socat. fg выведет процессы на передний план вашего терминала в порядке, обратном их запуску, поэтому, когда вы запустите его, второй экземпляр socat будет тем, с которым вы взаимодействуете первым.

Запустите fg , чтобы вывести второй экземпляр IPv6 socat на передний план вашего терминала. Затем запустите CTRL + C , чтобы закрыть его.

  

Вы получите следующий результат:

  

Выход

socat TCP6-LISTEN: 8080, ipv6only = 1, fork / dev / null

Нажмите CTRL + C , чтобы остановить процесс.

Теперь снова запустите fg , чтобы очистить первый сокет IPv4. У вас должен получиться следующий результат:

  

Выход

socat TCP4-LISTEN: 8080, fork / dev / null

Нажмите CTRL + C , чтобы остановить процесс.

Теперь вы создали, проверили и подключились к сокетам IPv4 и IPv6 в вашей системе. Эти методы и инструменты будут работать в локальных системах разработки или удаленных производственных серверах, поэтому попробуйте поэкспериментировать с каждым инструментом, чтобы лучше понять, как их можно использовать для тестирования и устранения неполадок сокетов TCP.

Что такое сокет дейтаграммы?

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

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

Сокеты

UDP обычно используются серверами системы доменных имен (DNS). По умолчанию DNS-серверы используют порт 53 для отправки и получения запросов на доменные имена. Пример адреса сокета UDP для DNS-сервера будет похож на 203.0.113.1:53 .

Примечание : Хотя протокол не включен в удобочитаемую версию адреса сокета, операционные системы различают адреса сокетов, включая протоколы TCP и UDP как часть адреса.Таким образом, адрес сокета, читаемый человеком, например 203.0.113.1:53 , может использовать любой протокол. Такие инструменты, как ss и более старая утилита netstat , используются для определения того, какой тип сокета используется.

Протокол сетевого времени (NTP) использует сокет UDP на порту 123 для синхронизации часов между компьютерами. Пример сокета UDP для протокола NTP: 203.0.113.1:123 .

Создание сокетов дейтаграмм

Как и в предыдущем примере сокета TCP, в этом разделе вы снова будете использовать socat для имитации сервера NTP, который прослушивает запросы на порту UDP 123 .Затем вы исследуете сокеты, которые вы создаете с помощью команд ss и nc .

Сначала выполните следующие команды socat , чтобы создать два сокета UDP, которые прослушивают соединения на порту 123, используя интерфейсы IPv4 и IPv6:

  
  • sudo socat UDP4-СЛУШАТЬ: 123, fork / dev / null &
  • sudo socat UDP6-СЛУШАТЬ: 123, ipv6only = 1, fork / dev / null &

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

  

Выход

[1] 465486 [2] 465487
  • Каждая команда имеет префикс sudo , потому что порты с 0 до 1024 зарезервированы в большинстве систем. sudo запускает команду с правами администратора, которая позволяет socat связываться с любым портом в зарезервированном диапазоне.
  • Аргументы UDP4-LISTEN: 123 и UDP6-LISTEN: 123 – это тип протокола и используемый порт.Они говорят socat создать сокеты на основе UDP на порту 123 как на интерфейсах IPv4, так и на интерфейсах IPv6, а также прослушивать входящие данные. Опять же, любой порт во всем диапазоне 0-65535 является допустимым параметром для сокетов UDP.
  • Аргументы вилки , ipv6only = 1 и / dev / null используются так же, как описано в предыдущем примере TCP.

Теперь, когда у вас есть два процесса socat , которые прослушивают порт UDP 123 , вы можете исследовать сокеты с помощью утилит ss и nc .

Проверка сокетов датаграмм

Чтобы проверить сокеты UDP в современной системе Linux с помощью команды ss , запустите ее со следующими флагами -4 , -6 и uln`, чтобы ограничить вывод:

Флаг и ограничивает вывод UDP-сокетами.
Остальные флаги такие же, как и в предыдущем примере TCP.

Сначала запустите команду ss -4 -uln , чтобы проверить сокеты IPv4 UDP, которые прослушивают соединения в вашей системе:

  

Вы получите следующий результат:

  

Выход

State Recv-Q Send-Q Local Address: Port Peer Address: Port Process .. . UNCONN 0 0 0.0.0.0:123 0.0.0.0:* . . .

В вашем выводе могут быть другие строки с другими портами, в зависимости от того, какие службы запущены в вашей системе. Выделенная часть вывода 0.0.0.0:123 указывает, что сокет IPv4 UDP доступен на всех интерфейсах IPv4 на порте 123 . Служба, доступная только на определенном IPv4-адресе, будет отображать только этот IP-адрес в выделенном поле, например 203.0.113.1: 123 .

Теперь снова запустите ту же команду ss , но с флагом -6 :

  

Вы получите следующий результат:

  

Выход

State Recv-Q Send-Q Local Address: Port Peer Address: Port Process . . . UNCONN 0 0 [::]: 123 [::]: * . . .

В вашем выводе могут быть другие строки с другими портами, в зависимости от того, какие службы запущены в вашей системе.Выделенная часть вывода [::]: 123 указывает, что сокет IPv6 TCP доступен на всех интерфейсах IPv6 на порте 123 (на что указывают символы :: ). Служба, доступная только на определенном IPv6-адресе, будет отображать только этот IP-адрес в выделенном поле, например [2604: a880: 400: d1 :: 3d3: 6001]: 123 .

Тестирование сокетов датаграмм

Теперь, когда вы знакомы с тем, как создавать и перечислять сокеты UDP на интерфейсах IPv4 и IPv6, вы можете поэкспериментировать с подключением к ним.Как и с сокетами TCP, вы можете поэкспериментировать с сокетами UDP с помощью утилиты netcat.

Чтобы подключиться к примерному UDP-сокету на порту 123 , который вы создали в предыдущем разделе этого руководства, выполните следующую команду netcat:

  
  • NC -4 -u -vz 127.0.0.1 123
  • Флаг -4 указывает netcat на использование IPv4.
  • Параметр -u указывает netcat на использование UDP вместо TCP.
  • Флаг -v используется для вывода подробного вывода на ваш терминал.
  • Опция – z гарантирует, что netcat подключается только к сокету, без отправки каких-либо данных.
  • Локальный шлейфовый IP-адрес 127.0.0.1 используется, поскольку ваша система будет иметь свой собственный уникальный IP-адрес. Если вы знаете IP-адрес своей системы, вы также можете протестировать его. Например, если общедоступный или частный IP-адрес вашей системы – 203.0.113.1 , вы можете использовать его вместо IP-адреса обратной петли.

Вы получите следующий результат:

  

Выход

Подключение к 127.0.0.1 123 порт [udp / ntp] успешно завершен!

Выходные данные показывают, что netcat не получил ошибку от сокета UDP, прослушивающего петлю 127.0.0.1 IPv4-адрес на порту 123 . Отсутствие ответа об ошибке используется для вывода о том, что сокет по адресу 127.0.0.1:123 доступен. Это поведение отличается от TCP-сокетов, которым необходимо обмениваться пакетами, чтобы подтвердить, доступен ли сокет.

Примечание: Если сокет в этом примере был недоступен, удаленная система вернула бы сообщение ICMP типа 3 (пункт назначения недоступен) с кодом 3, указывающим, что порт недоступен на удаленном узле.

Вывод о доступности сокета на основании отсутствия ответа об ошибке предполагает, что нет никаких брандмауэров или проблем с подключением, которые блокируют трафик ICMP. Без отправки, получения и проверки данных приложения через сокет UDP нет гарантии, что удаленный порт UDP открыт и принимает пакеты.

Теперь вы можете повторить тот же тест подключения, но с использованием IPv6. Выполните следующую команду netcat:

  

Вы должны получить следующий результат:

  

Выход

Подключение к :: 1 123 порту [udp / ntp] выполнено успешно !!

Выходные данные показывают, что netcat не получил ошибку от сокета UDP, прослушивающего петлевой IPv6-адрес :: 1 на порту 123 .Опять же, это отсутствие ответа об ошибке используется для вывода о том, что сокет по адресу :: 1: 123 доступен.

Чтобы очистить сокеты, вам нужно запустить команду fg (передний план) для каждого процесса socat, который вы создали. Затем вы будете использовать CTRL + C , чтобы закрыть каждый socat.

Запустите fg , чтобы вывести второй экземпляр IPv6 socat на передний план вашего терминала. Затем запустите CTRL + C , чтобы закрыть его.

  

Вы получите следующий результат:

  

Выход

sudo socat UDP6-LISTEN: 123, ipv6only = 1, fork / dev / null

Нажмите CTRL + C , чтобы остановить процесс.

Теперь снова запустите fg , чтобы очистить первый сокет IPv4. У вас будет следующий результат:

  

Выход

sudo socat UDP4-LISTEN: 123, fork / dev / null

Нажмите CTRL + C , чтобы остановить процесс.

Вы создали, проверили и протестировали сокеты IPv4 и IPv6 UDP в своей системе. Попробуйте поэкспериментировать с каждым инструментом, чтобы лучше понять, как их можно использовать для тестирования и устранения неполадок сокетов UDP.

Что такое сокет домена Unix?

Программы, работающие на одном сервере, также могут взаимодействовать друг с другом с помощью доменных сокетов Unix (UDS).Доменные сокеты Unix могут быть потоковыми или дейтаграммными. При использовании сокетов домена обмен данными между программами осуществляется непосредственно в ядре операционной системы через файлы в файловой системе хоста. Чтобы отправлять или получать данные с помощью доменных сокетов, программы читают и записывают в свой общий файл сокета, полностью обходя сетевые сокеты и протоколы.

Доменные сокеты Unix широко используются системами баз данных, которые не нуждаются в подключении к сетевому интерфейсу. Например, MySQL в Ubuntu по умолчанию использует файл с именем / var / run / mysqld / mysql.носок для связи с местными клиентами. Клиенты читают и записывают в сокет, как и сам сервер MySQL.

PostgreSQL – это еще одна система баз данных, которая использует сокет для локальной, несетевой связи. Обычно по умолчанию используется /run/postgresql/.s.PGSQL.5432 в качестве файла сокета.

Создание сокетов домена Unix

В предыдущих разделах вы исследовали, как TCP используется с сокетами потока и как UDP используется с сокетами дейтаграмм.В этом разделе вы будете использовать socat для создания как потоковых, так и дейтаграммных доменных сокетов Unix без использования TCP или UDP для инкапсуляции данных для отправки по сети. Затем вы исследуете сокеты, которые вы создаете с помощью команд ss и nc . Наконец, вы узнаете о тестировании сокетов домена Unix с помощью netcat.

Для начала выполните следующие команды socat , чтобы создать два файла сокета:

  
  • socat unix-listen: / tmp / stream.носок, вилка / dev / null &
  • socat unix-recvfrom: /tmp/datagram.sock,fork / dev / null &
  • Первая команда дает команду socat создать сокет с использованием адресного типа unix-listen , который создаст потоковый UDS.
  • Вторая команда указывает unix-recvfrom в качестве типа сокета, который создаст UDS
  • на основе дейтаграмм.
  • Обе команды указывают имя файла после разделителя : . Имя файла – это адрес самого сокета.Для первого примера потока это /tmp/stream.sock , а для второго примера дейтаграммы – /tmp/datagram.sock . Обратите внимание, что имя сокета является произвольным, но помогает, если оно носит описательный характер при устранении неполадок.
  • Аргументы fork и / dev / null используются таким же образом, как описано в разделах примеров сокетов Stream и Datagram.

Теперь, когда вы создали два сокета UDS, вы можете проверить их с помощью утилит ss и nc .

Исследование сокетов домена Unix

Чтобы вывести список всех прослушивающих сокетов домена Unix, выполните команду ss -xln . Флаг x гарантирует, что отображаются только сокеты домена.

  

Вы получите следующий результат:

  

Выход

Состояние Netid Recv-Q Локальный адрес отправки-Q: Адрес узла порта: Процесс порта . . . u_str СЛУШАТЬ 0 5 /tmp/stream.sock 436470 * 0 u_dgr UNCONN 0 0 / tmp / датаграмма.носок 433843 * 0 . . .

Обратите внимание на выделенную u_str часть строки / tmp / stream / sock . Это поле указывает, что тип сокета является потоковым UDS. Вторая строка показывает, что тип – u_dgr , что означает, что тип сокета основан на дейтаграммах.

Поскольку доменные сокеты Unix представляют собой файлы, обычные права пользователей и групп Linux и средства управления доступом могут использоваться для ограничения того, кто может подключаться к сокету. Вы также можете использовать инструменты файловой системы, такие как ls , mv , chown и chmod , для проверки файлов UDS и управления ими.Такие инструменты, как SELinux, также можно использовать для маркировки файлов UDS с различными контекстами безопасности.

Чтобы проверить, является ли файл сокетом UDS, используйте утилиты ls , file или stat . Однако важно отметить, что ни один из этих инструментов не может определить, является ли UDS потоковым или основанным на дейтаграммах. Используйте инструмент ss для получения наиболее полной информации о сокете домена Unix.

Для проверки сокета в файловой системе утилита stat показывает наиболее важную информацию.Запустите его на сокетах, которые вы создали ранее:

  
  • stat /tmp/stream.sock /tmp/datagram.sock

Вы получите следующий результат:

  

Вывод

Файл: /tmp/stream.sock Размер: 0 Блоки: 1 Блок ввода-вывода: 131072 сокет Устройство: 48h / 72d Inode: 1742 Ссылки: 1 Доступ: (0755 / srwxr-xr-x) Uid: (0 / root) Gid: (0 / root) Доступ: 2021-03-01 18: 10: 25.025755168 +0000 Изменение: 2021-03-01 18:10:25.025755168 +0000 Смена: 2021-03-01 18: 22: 42.678231700 +0000 Рождение: - Файл: /tmp/datagram.sock Размер: 0 Блоки: 1 Блок ввода-вывода: 131072 сокет Устройство: 48h / 72d Inode: 1743 Ссылки: 1 Доступ: (0755 / srwxr-xr-x) Uid: (0 / root) Gid: (0 / root) Доступ: 2021-03-01 18: 10: 25.025755168 +0000 Изменить: 2021-03-01 18: 10: 25.025755168 +0000 Смена: 2021-03-01 18: 10: 25.025755168 +0000 Рождение: -

Обратите внимание, что для каждого файла типом является socket (выделено справа от вывода), а режим доступа имеет символ s , предшествующий разрешениям файла.

Утилита ls также укажет, является ли файл сокетом. Запустите ls -l , чтобы проверить файлы:

  
  • ls -l /tmp/stream.sock /tmp/datagram.sock

Вы получите следующий результат. Снова обратите внимание, что для сокетов файловый режим включает в себя символ s перед полями разрешения файла:

  

Вывод

srwxr-xr-x 1 root root 0 1 марта 18:10 /tmp/datagram.sock srwxr-xr-x 1 корень root 0 1 марта 18:10 / tmp / stream.носок

Теперь, когда вы создали доменные сокеты Unix и научились исследовать их с помощью ss и различных инструментов на основе файловой системы, следующим шагом будет тестирование сокетов с помощью такого инструмента, как netcat.

Тестирование сокетов домена Unix

Утилиту netcat можно использовать для подключения к сокетам домена Unix, а также к сокетам TCP и UDP, о которых вы уже узнали ранее в этом руководстве. Чтобы подключиться к примерным сокетам, которые вы создали, вам нужно будет указать дополнительный флаг -U при запуске команды netcat.Этот флаг сообщает netcat о необходимости подключения к UDS, а не к сетевому сокету на основе TCP или UDP.

Кроме того, если сокет основан на дейтаграммах, вы будете использовать флаг -u , чтобы указать netcat на использование дейтаграмм, как мы узнали в разделе «Датаграммный сокет» этого руководства.

Давайте начнем исследовать сокеты UDS с подключения к потоковому сокету с помощью следующей команды:

  
  • NC -U -z /tmp/stream.sock

-U сообщает netcat, что он подключается к сокету домена Unix.
Опция – z гарантирует, что netcat подключается только к сокету, без отправки каких-либо данных.
/tmp/stream.sock – это адрес сокета в файловой системе.

Вы не получите никаких выходных данных netcat при запуске команды. Однако, если сокет недоступен , netcat выдаст сообщение об ошибке, подобное следующему:

  

Выход

nc: unix connect failed: нет такого файла или каталога nc: /tmp/stream.sock: нет такого файла или каталога

Таким образом, отсутствие вывода netcat при тестировании потокового сокета UDS означает, что соединение было успешным.

Повторите процесс тестирования, на этот раз для UDS на основе дейтаграмм:

  
  • NC -uU -z /tmp/datagram.sock

Добавлен дополнительный флаг -u , чтобы сообщить netcat, что удаленный сокет является сокетом дейтаграммы. Опять же, вы не получите никаких выходных данных, если проверка прошла успешно.

Если по адресу нет сокета, вы получите сообщение об ошибке следующего вида:

  

Выход

nc: unix connect failed: нет такого файла или каталога NC: / tmp / датаграмма.sock: нет такого файла или каталога

Чтобы очистить сокеты, вам нужно запустить команду fg (передний план) для каждого процесса socat, который вы создали. Затем вы будете использовать CTRL + C , чтобы закрыть каждый socat.

Запустите fg , чтобы вывести основанный на дейтаграммах экземпляр socat на передний план вашего терминала:

  

Вы получите следующий результат:

  

Вывод

socat unix-recvfrom: / tmp / datagram.носок, вилка / dev / null

Запустите CTRL + C , чтобы закрыть его. Вы не получите никакого вывода.

Теперь снова запустите fg , чтобы очистить первый потоковый сокет UDS.

Снова вы должны получить следующий результат:

  

Выход

socat unix-listen: /tmp/stream.sock,fork / dev / null

Запустите CTRL + C , чтобы завершить процесс. Вы не получите никакого вывода.

Итак, вы создали, проверили и протестировали сокеты для датаграмм Unix в своей системе.Попробуйте поэкспериментировать с netcat и socat , чтобы лучше познакомиться с тем, как отправлять и получать данные через UDS, а также как тестировать и устранять неполадки сокетов домена Unix.

Заключение

В этом руководстве вы узнали, как разные типы сокетов используются в системе Linux. Вы узнали о потоковых сокетах, которые обычно используют TCP для сетевого взаимодействия. Вы также узнали о сокетах на основе дейтаграмм, которые используют UDP для отправки данных по сети.Наконец, вы узнали, как доменные сокеты Unix могут быть потоковыми или дейтаграммами на локальном сервере.

В каждом разделе вы использовали утилиту ss для сбора информации о сокетах в системе Linux. Вы узнали, как различные флаги, которые предоставляет инструмент ss , могут помочь вам ограничить его вывод определенными типами сокетов, когда вы исследуете сокеты в системе.

Наконец, вы использовали инструменты netcat и socat для создания и подключения к каждому из трех различных типов сокетов, обсуждаемых в этом руководстве.Утилита netcat широко используется для подключения к сокетам, но она также может создавать сокеты. Его документация ( man nc ) содержит множество примеров того, как его можно использовать в любом режиме. Утилита socat – это более продвинутый инструмент, который можно использовать для подключения ко многим различным типам сокетов, которые не рассматриваются в этом руководстве. Его документация ( man socat ) также содержит многочисленные примеры различных способов его использования.

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

Как работают веб-сокеты? – Кевин Сукочефф

WebSocket – это постоянное соединение между клиентом и сервером. WebSockets обеспечивает двунаправленный полнодуплексный канал связи. который работает через HTTP через одно соединение сокета TCP / IP.На своем core, протокол WebSocket облегчает передачу сообщений между клиентом и сервер. Эта статья представляет собой введение в WebSocket. протокол, в том числе проблемы, которые решают WebSockets, и обзор того, как WebSockets описываются на уровне протокола.

Почему именно WebSocket?

Идея WebSockets была основана на ограничениях HTTP-технологий. технологии. При использовании HTTP клиент запрашивает ресурс, а сервер отвечает запрошенными данными. HTTP – это строго однонаправленный протокол – любые данные, отправленные с сервера клиенту, должны быть первыми по запросу клиента.Долгое голосование традиционно действовало как обходной путь для этого ограничения. При длительном опросе клиент делает HTTP-запрос с длительным периодом ожидания, и сервер использует это время. тайм-аут для отправки данных клиенту. Длинный опрос работает, но есть недостаток – ресурсы на сервере связаны на всем протяжении длинный опрос, даже если нет данных для отправки.

WebSockets, с другой стороны, позволяют отправлять данные на основе сообщений, аналогично UDP, но с надежностью TCP.WebSocket использует HTTP как начальный транспортный механизм, но поддерживает соединение TCP после получен ответ HTTP, чтобы его можно было использовать для отправки сообщений между клиентом и сервером. WebSockets позволяют нам создавать “в реальном времени” приложения без использования длительного опроса.

Обзор протокола

Протокол состоит из открывающего рукопожатия, за которым следует базовое сообщение. кадрирование, наложенное на TCP.

RFC 6455 – Протокол WebSocket

WebSockets начинают свою жизнь как стандартный HTTP-запрос и ответ.Внутри этого цепочка ответов на запросы, клиент просит открыть соединение WebSocket, и сервер отвечает (если может). Если это первоначальное рукопожатие успешно, клиент и сервер согласились использовать существующий TCP / IP соединение, которое было установлено для HTTP-запроса как WebSocket связь. Теперь данные могут передаваться по этому соединению с использованием базового фреймового протокол сообщения. Как только обе стороны признают, что WebSocket соединение должно быть закрыто, TCP соединение разорвано.

Установление соединения WebSocket – Открытое рукопожатие WebSocket

WebSockets не используют схему http: // или https: // (потому что они не следовать протоколу HTTP).Скорее, URI WebSocket используют новую схему ws: (или wss: для безопасного WebSocket). Остальная часть URI – это то же, что и HTTP URI: хост, порт, путь и любые параметры запроса.

  "ws:" "//" хост [":" порт] путь ["?" запрос ]
"wss:" "//" хост [":" порт] путь ["?" запрос ]
  

Соединения WebSocket могут быть установлены только для URI, следующих за этим схема. То есть, если вы видите URI со схемой ws: // (или wss: // ), тогда и клиент, и сервер ДОЛЖНЫ следовать соединению WebSocket. протокол в соответствии со спецификацией WebSocket.

подключений WebSocket установлено при обновлении пары HTTP-запрос / ответ. Клиент, который поддерживает WebSockets и хочет установить соединение, отправит HTTP запрос, который включает несколько обязательных заголовков:

  • Подключение: Обновление
    • Заголовок Connection обычно определяет, сетевое соединение остается открытым после текущей транзакции отделка. Обычное значение для этого заголовка – keep-alive , чтобы убедитесь, что соединение является постоянным, чтобы разрешить последующие запросы на тот же сервер.Во время рукопожатия открытия WebSocket мы установили заголовок до Обновите , сигнализируя, что мы хотим сохранить соединение жив, и используйте его для запросов, отличных от HTTP.
  • Обновление: websocket
    • Заголовок Upgrade используется клиентами, чтобы попросить сервер переключиться к одному из перечисленных протоколов в порядке убывания предпочтения. Мы укажите здесь websocket , чтобы указать, что клиент хочет установить соединение WebSocket.
  • Sec-WebSocket-ключ: q4xkcO32u266gldTuKaSOw ==
    • Sec-WebSocket-Key – одноразовое случайное значение (одноразовый номер) генерируется клиентом.Значение представляет собой случайно выбранное 16-байтовое значение, имеющее был закодирован base64.
  • Sec-WebSocket-Версия: 13
    • Единственная допустимая версия протокола WebSocket – 13. Любая другая версия, указанная в этом заголовке, недействительна.

Вместе эти заголовки приведут к HTTP-запросу GET от клиент к URI ws: // , как в следующем примере:

  ПОЛУЧИТЬ ws: //example.com: 8181 / HTTP / 1.1
Хост: localhost: 8181
Подключение: Обновление
Прагма: без кеширования
Cache-Control: без кеширования
Обновление: websocket
Sec-WebSocket-Версия: 13
Sec-WebSocket-ключ: q4xkcO32u266gldTuKaSOw ==
  

Как только клиент отправляет начальный запрос на открытие соединения WebSocket, он ждет ответа от сервера.Ответ должен содержать код ответа HTTP 101 Switching Protocols . Ответ HTTP 101 Switching Protocols указывает, что сервер переключается на протокол, который клиент запрошен в заголовке запроса Upgrade . Кроме того, сервер должен включить заголовки HTTP, подтверждающие, что соединение было успешно улучшено:

  HTTP / 1.1 101 Протоколы коммутации
Обновление: websocket
Подключение: Обновление
Sec-WebSocket-Accept: fA9dggdnMPU79lJgAE3W4TRnyDM =
  
  • Подключение: Обновление
    • Подтверждает, что соединение было обновлено.
  • Обновление: websocket
    • Подтверждает, что соединение было обновлено.
  • Sec-WebSocket-Accept : fA9dggdnMPU79lJgAE3W4TRnyDM = `
    • Sec-WebSocket-Accept закодировано в base64, хешированное значение SHA-1. Ты сгенерировать это значение путем объединения клиентов Sec-WebSocket-Key nonce и статическое значение 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 определено в RFC 6455. Хотя Sec-WebSocket-Key и Sec-WebSocket-Accept кажутся сложными, они существуют, так что оба клиент и сервер могут знать, что их коллега поддерживает WebSockets.Поскольку WebSocket повторно использует HTTP-соединение, там являются потенциальными проблемами безопасности, если любая из сторон интерпретирует WebSocket данные как HTTP-запрос.

После того, как клиент получит ответ сервера, соединение WebSocket открыть, чтобы начать передачу данных.

Протокол WebSocket

WebSocket – это протокол с фреймами , что означает, что фрагмент данных (сообщение) делится на несколько дискретных частей, размер которых закодировано в кадре.Кадр включает тип кадра, длину полезной нагрузки, и часть данных. Обзор кадра приведен в RFC. 6455 и воспроизведено здесь.

  0 1 2 3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ - + - + - + - + ------- + - + ------------- + ----------------- -------------- +
| F | R | R | R | код операции | M | Длина полезной нагрузки | Увеличенная длина полезной нагрузки |
| I | S | S | S | (4) | A | (7) | (16/64) |
| N | V | V | V | | S | | (если полезная нагрузка len == 126/127) |
| | 1 | 2 | 3 | | K | | |
+ - + - + - + - + ------- + - + ------------- + - - - - - - - - - - - - - - - +
| Увеличенная длина полезной нагрузки продолжается, если полезная нагрузка len == 127 |
+ - - - - - - - - - - - - - - - + ------------------------------- +
| | Маскирующий ключ, если МАСКА установлена ​​в 1 |
+ ------------------------------- + ----------------- -------------- +
| Маскирующий ключ (продолжение) | Данные полезной нагрузки |
+ -------------------------------- - - - - - - - - - - - - - - - +
: Данные полезной нагрузки продолжение...:
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Данные о полезной нагрузке, продолжение ... |
+ ------------------------------------------------- -------------- +
  

Я не буду здесь останавливаться на каждой части протокола кадров. Обратитесь к RFC 6455 для получения полной информации. Скорее, Я расскажу о самых важных моментах, чтобы мы могли понять протокола WebSocket.

Ребро-бита

Первый бит заголовка WebSocket – это бит Fin.Этот бит устанавливается, если этот фрейм – последние данные для завершения этого сообщения.

RSV1, RSV2, RSV3 биты

Эти биты зарезервированы для использования в будущем.

код операции

У каждого кадра есть код операции, который определяет, как интерпретировать данные полезной нагрузки.

Значение кода операции Описание
0x00 Этот кадр продолжает полезную нагрузку из предыдущего кадра.
0x01 Обозначает текстовый фрейм.Текстовые фреймы декодируются сервером в кодировке UTF-8.
0x02 Обозначает двоичный фрейм. Двоичные кадры доставляются сервером без изменений.
0x03-0x07 Зарезервировано для использования в будущем.
0x08 Обозначает, что клиент желает закрыть соединение.
0x09 Фрейм ping. Служит механизмом подтверждения связи, гарантирующим, что соединение все еще живо. Получатель должен ответить понгом.
0x0a Рама для понга. Служит механизмом подтверждения связи, гарантирующим, что соединение все еще живо. Получатель должен ответить фреймом ping.
0x0b-0x0f Зарезервировано для использования в будущем.
Маска

Установка этого бита в 1 включает маскирование . WebSockets требует, чтобы все полезная нагрузка запутывается с использованием случайного ключа (маски), выбранного клиентом. Ключ маскировки объединяется с данными полезной нагрузки с помощью операции XOR. перед отправкой данных в полезную нагрузку.Эта маскировка предотвращает появление кешей. неверная интерпретация фреймов WebSocket как кэшируемых данных. Почему мы должны предотвращать кеширование данных WebSocket? Безопасность.

При разработке протокола WebSocket было показано, что если скомпрометированный сервер развертывается, и клиенты подключаются к этому серверу, он можно иметь промежуточные прокси или кеш инфраструктуры ответы скомпрометированного сервера, чтобы будущие клиенты, запрашивающие data получают неверный ответ. Эта атака называется cache. отравление , и является результатом того факта, что мы не можем контролировать, как некорректно работающие прокси ведут себя в дикой природе.Это особенно проблематично при введении нового протокола, такого как WebSocket, который должен взаимодействовать с существующая инфраструктура интернета.

Длина полезной нагрузки

Поле длины полезной нагрузки и поле расширенной длины полезной нагрузки используются для кодировать общую длину данных полезной нагрузки для этого кадра. Если полезная нагрузка данные небольшие (менее 126 байт), длина кодируется в поле Payload len . По мере роста данных полезной нагрузки мы используем дополнительные поля для кодировать длину полезной нагрузки.

Маскирующий ключ

Как обсуждалось с битом MASK , все кадры, отправленные от клиента к серверы маскируются 32-битным значением, содержащимся в кадре. Это поле присутствует, если бит маски установлен в 1, и отсутствует, если бит маски бит маски установлен на 0.

Данные полезной нагрузки

Данные полезной нагрузки включают произвольные данные приложения и любые расширения данные, согласованные между клиентом и сервером. Расширения согласовываются во время первоначального рукопожатия и позволяют расширить протокол WebSocket для дополнительных целей.

Закрытие соединения WebSocket – рукопожатие закрытия WebSocket

Чтобы закрыть соединение WebSocket, отправляется закрывающий фрейм (код операции 0x08 ). Помимо кода операции, закрывающий кадр может содержать тело, которое указывает причину закрытия. Если какая-либо сторона соединения получает закрывающий кадр, он должен отправить закрывающий кадр в ответ, и больше никаких данных должны быть отправлены через соединение. После получения кадра закрытия обе стороны разрывают TCP-соединение.Сервер всегда инициирует закрытие TCP-соединения.

Дополнительные ссылки

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

См. Также
Описание сокетов

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

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

Сообщения разбиваются на байты, которые понимает компьютер, а затем разбиваются на пакеты, которые ОС (операционная система) отправляет маршрутизатору, дейтаграммы, которые маршрутизатор отправляет другому маршрутизатору, а затем полностью обратно на сообщения, которые получает ваш получатель.

Тем не менее, сегодня мы сосредоточимся на пересечении транспортного и прикладного уровней: сокетов .

Что такое розетка?

Когда мы создаем сетевое приложение, очень важно понимать, как процессы на разных хостах взаимодействуют друг с другом. Для каждой пары взаимодействующих процессов мы помечаем один из них как клиент, а другой как сервер. Обычно клиент инициирует обмен данными, а сервер ожидает контакта.В сети клиентом является веб-браузер, а сервером – веб-сервер, обслуживающий веб-страницу.

Любое сообщение, отправленное от одного процесса к другому, должно проходить через нижележащие уровни. Программный интерфейс между этими уровнями называется сокетом. Используя метафору, этот процесс аналогичен дому и розетке к его двери. Когда процесс отправляет сообщение другому процессу, он отправляет его через дверь, и он также должен войти в дверь другого процесса.

В конце концов, сокет – это интерфейс между прикладным уровнем и транспортным уровнем , также называемый API между нашим приложением и сетью.Как разработчики, мы контролируем все, что происходит до того, как сообщение будет отправлено через сокет, и все, что происходит после того, как сообщение получено из сокета. Единственное, что у нас есть над транспортным уровнем, это, возможно, выбор протокола (TCP, UDP…) или некоторых параметров.

Как решить другой процесс?

Как и в случае с домами, для передачи сообщения от одного процесса другому вам нужен адрес. В Интернете хост идентифицируется по IP-адресу , но этого недостаточно, поскольку на любом хосте может выполняться большое количество процессов.К конкретному процессу адресуется номер порта . Поэтому, когда один процесс хочет отправить сообщение другому процессу, ему нужны как IP-адрес хоста, так и номер порта.

Популярные приложения уже присвоили номера портов; почтовые процессы используют порт 25, веб-серверы используют порт 80 и т. д., поэтому для наших приложений важно убедиться, что мы их не настраиваем.

Как работает прослушивание сокета?

Чтобы понять, как работают все операции записи и чтения в и из сокетов, мы должны понимать рабочий процесс привязки сокетов.

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

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

Список литературы
  1. Компьютерные сети: подход сверху вниз, Куроз и Росс
  2. z / OS Communications Server: Руководство по сокетам IP CICS
  3. Учебное пособие по
  4. TCP от Шветы Синха 11/98
  5. Чтение и запись в сокет – docs.oracle.com

Функции Winsock – приложения Win32

принять Разрешает попытку входящего подключения к сокету.
AcceptEx Принимает новое соединение, возвращает локальный и удаленный адрес и получает первый блок данных, отправленный клиентским приложением.
переплет Связывает локальный адрес с сокетом.
розетка Закрывает существующую розетку.
подключение Устанавливает соединение с указанным сокетом.
ConnectEx Устанавливает соединение с указанным сокетом и, при необходимости, отправляет данные после установления соединения. Поддерживается только в сокетах, ориентированных на соединение.
ОтключитьEx Закрывает соединение с сокетом и позволяет повторно использовать дескриптор сокета.
Протоколы перечисления Извлекает информацию об указанном наборе сетевых протоколов, активных на локальном хосте.
freeaddrinfo Освобождает адресную информацию, которую функция getaddrinfo динамически выделяет в структурах addrinfo .
FreeAddrInfoEx Освобождает адресную информацию, которую функция GetAddrInfoEx динамически выделяет в структурах addrinfoex .
FreeAddrInfoW Освобождает адресную информацию, которую функция GetAddrInfoW динамически выделяет в структурах addrinfoW .
gai_strerror Помогает печатать сообщения об ошибках на основе ошибок EAI_ *, возвращаемых функцией getaddrinfo .
GetAcceptExSockaddrs Анализирует данные, полученные в результате вызова функции AcceptEx .
GetAddressByName Запрашивает пространство имен или набор пространств имен по умолчанию, чтобы получить информацию о сетевом адресе для указанной сетевой службы. Этот процесс известен как разрешение имени службы. Сетевая служба также может использовать эту функцию для получения информации о локальном адресе, которую она может использовать с функцией bind .
getaddrinfo Обеспечивает независимый от протокола перевод имени хоста ANSI в адрес.
GetAddrInfoEx Обеспечивает независимое от протокола разрешение имен с дополнительными параметрами для определения того, какие поставщики пространства имен должны обрабатывать запрос.
GetAddrInfoExCancel Отменяет асинхронную операцию, выполняемую функцией GetAddrInfoEx .
GetAddrInfoExOverlappedResult Получает код возврата для структуры OVERLAPPED , используемой асинхронной операцией для функции GetAddrInfoEx .
GetAddrInfoW Обеспечивает независимый от протокола перевод имени хоста Unicode в адрес.
gethostbyaddr Извлекает информацию о хосте, соответствующую сетевому адресу.
gethostbyname Извлекает информацию о хосте, соответствующую имени хоста, из базы данных хоста. Не рекомендуется: используйте вместо него getaddrinfo .
имя хоста Получает стандартное имя хоста для локального компьютера.
GetHostNameW Извлекает стандартное имя хоста для локального компьютера в виде строки Unicode.
getipv4sourcefilter Извлекает состояние фильтра многоадресной рассылки для сокета IPv4.
GetNameByType Извлекает имя сетевой службы для указанного типа службы.
getnameinfo Обеспечивает преобразование имени из адреса IPv4 или IPv6 в имя хоста ANSI и из номера порта в имя службы ANSI.
GetNameInfoW Обеспечивает преобразование имени из адреса IPv4 или IPv6 в имя хоста Unicode и из номера порта в имя службы Unicode.
getpeername Извлекает адрес однорангового узла, к которому подключен сокет.
getprotobyname Извлекает информацию о протоколе, соответствующую имени протокола.
getprotobynumber Получает информацию о протоколе, соответствующую номеру протокола.
getservbyname Извлекает служебную информацию, соответствующую имени службы и протоколу.
getservbyport Получает служебную информацию, соответствующую порту и протоколу.
GetService Извлекает информацию о сетевой службе в контексте набора пространств имен по умолчанию или указанного пространства имен.
getsockname Получает локальное имя сокета.
getsockopt Получает вариант сокета.
фильтр getource Извлекает состояние фильтра многоадресной рассылки для сокета IPv4 или IPv6.
GetTypeByName Извлекает GUID типа службы для сетевой службы, указанной по имени.
номер Преобразует двойной из хоста в сетевой порядок байтов TCP / IP (который является прямым порядком байтов).
htonf Преобразует с плавающей запятой из хоста в сетевой порядок байтов TCP / IP (который является прямым порядком байтов).
тон Преобразует u_long из хоста в сетевой порядок байтов TCP / IP (который является прямым порядком байтов).
htonll Преобразует беззнаковый __int64 из хоста в сетевой порядок байтов TCP / IP (который является прямым порядком байтов).
час Преобразует u_short из хоста в сетевой порядок байтов TCP / IP (который является прямым порядком байтов).
inet_addr Преобразует строку, содержащую адрес Интернет-протокола (Ipv4) с точками, в правильный адрес для структуры in_addr .
inet_ntoa Преобразует сетевой адрес (IPv4) в Интернет в строку в стандартном формате Интернета с точками.
InetNtop преобразует сетевой адрес IPv4 или IPv6 в Интернет в строку в стандартном формате Интернета. Версия этой функции ANSI – inet_ntop .
InetPton Преобразует сетевой адрес IPv4 или IPv6 в его стандартной текстовой форме представления в его числовую двоичную форму.Версия этой функции ANSI – inet_pton .
ioctlsocket Управляет режимом ввода-вывода сокета.
слушать Переводит сокет в состояние ожидания входящего соединения.
ntohd Преобразует беззнаковый __int64 из сетевого порядка TCP / IP в порядок байтов хоста (который является прямым порядком байтов на процессорах Intel) и возвращает double .
нтохф Преобразует беззнаковый __int32 из сетевого порядка TCP / IP в порядок байтов хоста (который является прямым порядком байтов на процессорах Intel) и возвращает с плавающей запятой .
нтоль Преобразует u_long из сетевого порядка TCP / IP в порядок байтов хоста (который на процессорах Intel является прямым порядком байтов).
НТОЛЛ Преобразует беззнаковый __int64 из сетевого порядка TCP / IP в порядок байтов хоста (который на процессорах Intel является прямым порядком байтов).
нтос Преобразует u_short из сетевого порядка байтов TCP / IP в порядок байтов хоста (который на процессорах Intel является прямым порядком байтов).
возврат Получает данные из подключенного или привязанного сокета.
возврат от Получает дейтаграмму и сохраняет адрес источника.
RIOC CloseCompletionQueue Закрывает существующую очередь завершения, используемую для уведомления о завершении ввода-вывода, путем отправки и получения запросов с зарегистрированными в Winsock расширениями ввода-вывода.
RIOCreateCompletionQueue Создает очередь завершения ввода-вывода определенного размера для использования с зарегистрированными в Winsock расширениями ввода-вывода.
RIOCreateRequestQueue Создает зарегистрированный дескриптор сокета ввода-вывода с использованием указанного сокета и очередей завершения ввода-вывода для использования с зарегистрированными расширениями ввода-вывода Winsock.
RIODequeueCompletion Удаляет записи из очереди завершения ввода-вывода для использования с зарегистрированными в Winsock расширениями ввода-вывода.
RIODeregisterBuffer Отменяет регистрацию зарегистрированного буфера, используемого с расширениями ввода-вывода, зарегистрированными Winsock.
RIONotify Регистрирует метод, используемый для поведения уведомления, с очередью завершения ввода-вывода для использования с зарегистрированными в Winsock расширениями ввода-вывода.
РИОПолучить Получает сетевые данные о подключенном зарегистрированном TCP-сокете ввода-вывода или связанном зарегистрированном UDP-сокете ввода-вывода для использования с зарегистрированными в Winsock расширениями ввода-вывода.
RIOReceiveEx Получает сетевые данные о подключенном зарегистрированном TCP-сокете ввода-вывода или связанном зарегистрированном UDP-сокете ввода-вывода с дополнительными опциями для использования с зарегистрированными в Winsock расширениями ввода-вывода.
RIORegisterBuffer Регистрирует RIO_BUFFERID , зарегистрированный дескриптор буфера, с указанным буфером для использования с зарегистрированными расширениями ввода-вывода Winsock.
RIOResizeCompletionQueue Изменяет размер очереди завершения ввода-вывода, увеличивая или уменьшая ее для использования с зарегистрированными в Winsock расширениями ввода-вывода.
RIOResizeRequestQueue Изменяет размер очереди запросов, увеличивая или уменьшая ее для использования с расширениями ввода-вывода, зарегистрированными Winsock.
RIOSend Отправляет сетевые данные в подключенный зарегистрированный TCP-сокет ввода-вывода или связанный зарегистрированный UDP-сокет ввода-вывода для использования с зарегистрированными в Winsock расширениями ввода-вывода.
RIOSendEx Отправляет сетевые данные на подключенный зарегистрированный TCP-сокет ввода-вывода или связанный зарегистрированный UDP-сокет ввода-вывода с дополнительными параметрами для использования с зарегистрированными в Winsock расширениями ввода-вывода.
выберите Определяет состояние одного или нескольких сокетов, при необходимости ожидая выполнения синхронного ввода-вывода.
отправить Отправляет данные на подключенный сокет.
отправить Отправляет данные в определенное место назначения.
SetAddrInfoEx Регистрирует имя хоста и службы вместе со связанными адресами с конкретным поставщиком пространства имен.
setipv4sourcefilter Устанавливает состояние фильтра многоадресной рассылки для сокета IPv4.
SetService Регистрирует или удаляет из реестра сетевую службу в одном или нескольких пространствах имен. Также можно добавить или удалить тип сетевой службы в одном или нескольких пространствах имен.
SetSocketMediaStreamingMode Указывает, должна ли сеть использоваться для передачи потокового мультимедиа, требующего качества обслуживания.
setsockopt Устанавливает опцию сокета.
набор исходных фильтров Устанавливает состояние фильтра многоадресной рассылки для сокета IPv4 или IPv6.
остановка Отключает отправку или получение через сокет.
розетка Создает сокет, привязанный к определенному поставщику услуг.
Файл передачи Передает данные файла через дескриптор подключенного сокета.
TransmitPackets Передает данные в памяти или данные файла через подключенный сокет.
WSAAccept Условно принимает соединение на основе возвращаемого значения функции условия, предоставляет спецификации потока обслуживания и разрешает передачу данных соединения.
WSAAddressToString Преобразует все компоненты структуры sockaddr в удобочитаемое строковое представление адреса.
WSAAsyncGetHostByAddr Асинхронно извлекает информацию о хосте, соответствующую адресу.
WSAAsyncGetHostByName Асинхронно получает информацию о хосте, соответствующую имени хоста.
WSAAsyncGetProtoByName Асинхронно извлекает информацию о протоколе, соответствующую имени протокола.
WSAAsyncGetProtoByNumber Асинхронно извлекает информацию о протоколе, соответствующую номеру протокола.
WSAAsyncGetServByName Асинхронно извлекает служебную информацию, соответствующую имени службы и порту.
WSAAsyncGetServByPort Асинхронно извлекает служебную информацию, соответствующую порту и протоколу.
WSAAsyncSelect Запрашивает уведомление Windows о сетевых событиях для сокета.
WSACancelAsyncRequest Отменяет незавершенную асинхронную операцию.
WSACleanup Прекращает использование Ws2_32.DLL.
WSACloseEvent Закрывает дескриптор открытого объекта события.
WSAConnect Устанавливает соединение с другим приложением сокета, обменивается данными соединения и определяет необходимое качество обслуживания на основе указанной структуры FLOWSPEC .
WSAConnectByList Устанавливает соединение с одной из множества возможных конечных точек, представленных набором адресов назначения (имен хостов и портов).
WSAConnectByName Устанавливает соединение с другим приложением сокета на указанном хосте и порту
WSACreateEvent Создает новый объект события.
WSADeleteSocketPeerTargetName Удаляет связь между одноранговым целевым именем и IP-адресом сокета.
WSADuplicateSocket Возвращает структуру, которую можно использовать для создания нового дескриптора сокета для общего сокета.
WSAEnumNameSpaceProviders Получает информацию о доступных пространствах имен.
WSAEnumNameSpaceProvidersEx Получает информацию о доступных пространствах имен.
WSAEnumNetworkEvents Обнаруживает возникновение сетевых событий для указанного сокета, очищает записи внутренних сетевых событий и сбрасывает объекты событий (необязательно).
Протоколы WSAEnum Получает информацию о доступных транспортных протоколах.
WSAEventSelect Задает объект события, который должен быть связан с указанным набором сетевых событий FD_XXX.
__WSAFDIsSet Указывает, включен ли сокет в набор дескрипторов сокета.
WSAGetFailConnectOnIcmpError Запрашивает состояние опции сокета TCP_FAIL_CONNECT_ON_ICMP_ERROR .
WSAGetIcmpErrorInfo Запрашивает адрес источника ошибки ICMP, полученной на сокете TCP во время установки соединения.
WSAGetIPUserMtu Извлекает определяемое пользователем значение MTU уровня IP для сокета.
WSAGetLastError Возвращает статус ошибки для последней неудачной операции.
WSAGetOverlappedResult Извлекает результаты перекрывающейся операции на указанном сокете.
WSAGetQOSByName Инициализирует структуру QOS на основе именованного шаблона или предоставляет буфер для получения перечисления доступных имен шаблонов.
WSAGetServiceClassInfo Извлекает информацию о классе (схему), относящуюся к указанному классу обслуживания, от указанного поставщика пространства имен.
WSAGetServiceClassNameByClassId Извлекает имя службы, связанной с указанным типом.
WSAGetUdpRecvMaxCoalescedSize Извлекает максимальный размер полученного объединенного сообщения для сокета UDP.
WSAGetUdpSendMessageSize Извлекает размер сообщения сегментации для сокета UDP.
WSAHtonl Преобразует u_long из байтового порядка хоста в сетевой порядок байтов.
WSAHtons Преобразует u_short из байтового порядка хоста в сетевой порядок байтов.
WSAImpersonateSocketPeer Используется для олицетворения участника безопасности, соответствующего одноранговому сокету, для выполнения авторизации на уровне приложения.
WSAInstallServiceClass Регистрирует схему класса обслуживания в пространстве имен.
WSAIoctl Управляет режимом розетки.
WSAJoinLeaf Присоединяет листовой узел к многоточечному сеансу, обменивается данными соединения и определяет необходимое качество обслуживания на основе указанных структур.
WSALookupServiceBegin Инициирует клиентский запрос, который ограничен информацией, содержащейся в структуре WSAQUERYSET .
WSALookupServiceEnd Освобождает дескриптор, использованный предыдущими вызовами WSALookupServiceBegin и WSALookupServiceNext .
WSALookupServiceNext Получить запрошенную служебную информацию.
WSANSPIoctl Разработчики для выполнения вызовов управления вводом-выводом в зарегистрированное пространство имен.
WSANtohl Преобразует u_long из сетевого порядка байтов в порядок байтов хоста.
WSANtohs Преобразует u_short из сетевого порядка байтов в порядок байтов хоста.
WSAPoll Определяет состояние одного или нескольких сокетов.
WSAProviderConfigChange Уведомляет приложение об изменении конфигурации поставщика.
WSAQuerySocketSecurity Запрашивает информацию о безопасности, применяемой к соединению через сокет.
WSARecv Получает данные из подключенного сокета.
WSARecvDisconnect Завершает прием на сокете и получает данные отключения, если сокет ориентирован на соединение.
WSARecvEx Получает данные из подключенного сокета.
WSARecvОт Получает дейтаграмму и сохраняет адрес источника.
LPFN_WSARECVMSG (WSARecvMsg) Получает данные и дополнительную управляющую информацию от подключенных и неподключенных розеток.
WSARemoveServiceClass Безвозвратно удаляет схему класса обслуживания из реестра.
WSAResetEvent Сбрасывает состояние указанного объекта события на несигнальное.
WSA Отказ от имени Прекращает олицетворение однорангового сокета.
WSAS Отправить Отправляет данные на подключенный сокет.
WSASendDisconnect Инициирует завершение соединения для сокета и отправляет данные об отключении.
WSASendMsg Отправляет данные и дополнительную управляющую информацию с подключенных и неподключенных розеток.
WSASendTo Отправляет данные в определенное место назначения, используя перекрывающийся ввод-вывод, где это применимо.
WSASetEvent Устанавливает состояние указанного объекта события как «сигнальное».
WSASetFailConnectOnIcmpError Устанавливает состояние опции сокета TCP_FAIL_CONNECT_ON_ICMP_ERROR .
WSASetIPUserMtu Устанавливает определяемое пользователем значение MTU уровня IP для сокета.
WSASetLastError Устанавливает код ошибки.
WSASetService Регистрирует или удаляет из реестра экземпляр службы в одном или нескольких пространствах имен.
WSASetSocketPeerTargetName Используется для указания конечного имени однорангового узла (SPN), которое соответствует одноранговому IP-адресу. Это целевое имя должно указываться клиентскими приложениями для безопасной идентификации однорангового узла, который должен быть аутентифицирован.
WSASetSocketSecurity Включает и применяет защиту для розетки.
WSASetUdpRecvMaxCoalescedSize Устанавливает максимальный размер объединенного сообщения, установленного для сокета UDP.
WSASetUdpSendMessageSize Устанавливает размер сообщения сегментации для сокета UDP.
WSASocket Создает сокет, который привязан к определенному поставщику транспортных услуг.
WSAStartup Инициирует использование WS2_32.DLL процессом.
WSAStringToAddress Преобразует числовую строку в структуру sockaddr .
WSAWaitForMultipleEvents Возвращает, когда один или все указанные объекты события находятся в сигнальном состоянии, или когда истекает интервал тайм-аута.

сокетов · Создание веб-приложения с помощью Golang

Некоторые разработчики сетевых приложений говорят, что все нижние уровни приложений связаны с программированием сокетов.Это может быть верно не для всех случаев, но многие современные веб-приложения действительно используют сокеты в своих интересах. Вы когда-нибудь задумывались, как браузеры взаимодействуют с веб-серверами, когда вы просматриваете Интернет? Или как MSN объединяет вас и ваших друзей в чате, передавая каждое сообщение в режиме реального времени? Многие подобные службы используют сокеты для передачи данных. Как видите, сегодня сокеты занимают важное место в сетевом программировании, и в этом разделе мы узнаем об использовании сокетов в Go.

Что такое розетка?

Сокеты происходят из Unix, и, учитывая базовую философию Unix «все является файлом», всем можно управлять с помощью «открыть -> написать / прочитать -> закрыть». Сокеты – одно из воплощений этой философии. У сокетов есть вызов функции для открытия сокета, как если бы вы открывали файл. Это возвращает дескриптор сокета int, который затем может использоваться для таких операций, как создание соединений, передача данных и т. Д.

Обычно используются два типа сокетов: потоковые сокеты (SOCK_STREAM) и сокеты дейтаграмм (SOCK_DGRAM).Потоковые сокеты ориентированы на соединение, как TCP, в то время как сокеты датаграмм не устанавливают соединения, как UDP.

Розетка связи

Прежде чем мы поймем, как сокеты взаимодействуют друг с другом, нам нужно выяснить, как сделать так, чтобы каждый сокет был уникальным, иначе об установлении надежного канала связи уже не может быть и речи. Мы можем дать каждому процессу уникальный PID, который служит нашей цели локально, но не может работать по сети.К счастью, TCP / IP помогает нам решить эту проблему. IP-адреса сетевого уровня уникальны в сети хостов, а «протокол + порт» также уникален для хост-приложений. Итак, мы можем использовать эти принципы для создания уникальных сокетов.

Рисунок 8.1 Уровни сетевого протокола

Все приложения, основанные на TCP / IP, так или иначе используют API сокетов в своем коде. 32 устройства могут однозначно подключаться к Интернету.Из-за быстрого развития Интернета в последние годы IP-адреса уже заканчиваются.

Формат адреса: 127.0.0.1 , 172.122.121.111 .

IPv6

IPv6 – это следующая версия или следующее поколение Интернета. Он разрабатывается для решения многих проблем, присущих IPv4. Устройства, использующие IPv6, имеют адрес длиной 128 бит, поэтому нам никогда не придется беспокоиться о нехватке уникальных адресов. Для сравнения: с IPv6 у вас может быть более 1000 IP-адресов на каждый квадратный метр земли.Другие проблемы, такие как одноранговое соединение, качество обслуживания (QoS), безопасность, множественная широковещательная передача и т. Д., Также будут улучшены.

Формат адреса: 2002: c0e8: 82e7: 0: 0: 0: c0e8: 82e7 .

типов IP в Go

Пакет net на Go предоставляет множество типов, функций и методов для сетевого программирования. Определение IP следующее:

  тип IP [] байт
  

Функция ParseIP (s string) IP предназначена для преобразования формата IPv4 или IPv6 в IP:

  пакет основной
Импортировать (
    "сеть"
    "Операционные системы"
    "fmt"
)
func main () {
    если len (os.Args)! = 2 {
        fmt.Fprintf (os.Stderr, "Использование:% s ip-addr \ n", os.Args [0])
        os.Exit (1)
    }
    name: = os.Args [1]
    адрес: = net.ParseIP (имя)
    if addr == nil {
        fmt.Println ("Неверный адрес")
    } еще {
        fmt.Println ("Адрес есть", addr.String ())
    }
    os.Exit (0)
}
  

Возвращает соответствующий формат IP для данного IP-адреса.

TCP сокет

Что мы можем сделать, если знаем, как посетить веб-службу через сетевой порт? Как клиент, мы можем отправить запрос на назначенный сетевой порт и получить от него ответ; в качестве сервера нам необходимо привязать службу к назначенному сетевому порту, дождаться запросов клиентов и предоставить ответ.

В пакете net Go есть тип под названием TCPConn , который облегчает такое взаимодействие клиентов и серверов. Этот тип имеет две основные функции:

  func (c * TCPConn) Запись (b [] байт) (n int, err os.Error)
func (c * TCPConn) Чтение (b [] байт) (n int, err os.Error)
  

TCPConn может использоваться клиентом или сервером для чтения и записи данных.

Нам также нужен TCPAddr для представления информации об адресе TCP:

  type TCPAddr struct {
    IP IP
    Порт int
}
  

Мы используем функцию ResolveTCPAddr , чтобы получить TCPAddr в Go:

  func ResolveTCPAddr (net, addr string) (* TCPAddr, os.Ошибка)
  
  • Аргументы net могут быть одним из «tcp4», «tcp6» или «tcp», каждый из которых означает только IPv4, только IPv6 и либо IPv4, либо IPv6 соответственно.
  • addr может быть доменным именем или IP-адресом, например www.google.com:80 или 127.0.0.1:22.

TCP-клиент

Клиенты

Go используют функцию DialTCP в пакете net для создания TCP-соединения, которое возвращает объект TCPConn ; после того, как соединение установлено, сервер имеет тот же тип объекта соединения, что и текущее соединение, и клиент и сервер могут начать обмен данными друг с другом.Обычно клиенты отправляют запросы к серверам через TCPConn и получают информацию из ответа сервера; серверы читают и анализируют клиентские запросы, а затем возвращают обратную связь. Это соединение будет оставаться действительным до тех пор, пока его не закроет клиент или сервер. Функция для создания подключения следующая:

  func DialTCP (net string, laddr, raddr * TCPAddr) (c * TCPConn, err os.Error)
  
  • Аргументы net могут быть одним из «tcp4», «tcp6» или «tcp», каждый из которых означает только IPv4, только IPv6 и либо IPv4, либо IPv6 соответственно.
  • Laddr представляет собой локальный адрес, в большинстве случаев устанавливается значение nil .
  • raddr представляет удаленный адрес.

Давайте напишем простой пример для имитации клиента, запрашивающего соединение с сервером на основе HTTP-запроса. Нам нужен простой заголовок HTTP-запроса:

  "HEAD / HTTP / 1.0 \ r \ n \ r \ n"
  

Формат информации ответа сервера может выглядеть следующим образом:

  HTTP / 1.0200 ОК
ETag: "-9985996"
Последнее изменение: чт, 25 марта 2010 г., 17:51:10 GMT
Длина содержимого: 18074
Подключение: закрыть
Дата: сб, 28 августа 2010 г., 00:43:48 GMT
Сервер: lighttpd / 1.4.23
  

Код клиента:

  пакет основной

Импортировать (
    "fmt"
    "io / ioutil"
    "сеть"
    "Операционные системы"
)

func main () {
    if len (os.Args)! = 2 {
        fmt.Fprintf (os.Stderr, "Использование:% s хост: порт", os.Args [0])
        os.Exit (1)
    }
    service: = os.Args [1]
    tcpAddr, err: = net.ResolveTCPAddr ("tcp4", служба)
    checkError (ошибка)
    conn, err: = net.DialTCP ("tcp", ноль, tcpAddr)
    checkError (ошибка)
    _, err = conn.Write ([] byte ("HEAD / HTTP / 1.0 \ r \ n \ r \ n"))
    checkError (ошибка)
    результат, err: = ioutil.ReadAll (conn)
    checkError (ошибка)
    fmt.Println (строка (результат))
    os.Exit (0)
}
func checkError (ошибка ошибки) {
    if err! = nil {
        fmt.Fprintf (os.Stderr, «Неустранимая ошибка:% s», err.Error ())
        os.Exit (1)
    }
}
  

В приведенном выше примере мы используем ввод пользователя в качестве аргумента service для net.ResolveTCPAddr , чтобы получить tcpAddr .Передав tcpAddr функции DialTCP , мы создаем TCP-соединение, conn . Затем мы можем использовать conn для отправки информации запроса на сервер. Наконец, мы используем ioutil.ReadAll для чтения всего содержимого из conn , которое содержит ответ сервера.

TCP сервер

Теперь у нас есть TCP-клиент. Мы также можем использовать пакет net для написания TCP-сервера. На стороне сервера нам нужно привязать нашу службу к определенному неактивному порту и прослушивать любые входящие клиентские запросы.

  func ListenTCP (строка сети, laddr * TCPAddr) (l * TCPListener, err os.Error)
func (l * TCPListener) Accept () (c Conn, err os.Error)
  

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

.
  пакет основной

Импортировать (
    "fmt"
    "сеть"
    "Операционные системы"
    "время"
)

func main () {
    service: = ": 7777"
    tcpAddr, err: = net.ResolveTCPAddr ("tcp4", служба)
    checkError (ошибка)
    слушатель, err: = net.ListenTCP ("tcp", tcpAddr)
    checkError (ошибка)
    за {
        conn, err: = listener.Accept ()
        if err! = nil {
            Продолжать
        }
        дневное время: = время.Теперь (). Строка ()
        conn.Write ([] byte (daytime)) // не заботится о возвращаемом значении
        conn.Close () // мы закончили с этим клиентом
    }
}
func checkError (ошибка ошибки) {
    if err! = nil {
        fmt.Fprintf (os.Stderr, «Неустранимая ошибка:% s», err.Error ())
        os.Exit (1)
    }
}
  

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

Однако приведенный выше код все еще недостаточно хорош. Мы не использовали горутины, которые позволили бы нам принимать одновременные запросы.Давайте сделаем это сейчас:

  пакет основной

Импортировать (
    "fmt"
    "сеть"
    "Операционные системы"
    "время"
)

func main () {
    service: = ": 1200"
    tcpAddr, err: = net.ResolveTCPAddr ("tcp4", служба)
    checkError (ошибка)
    слушатель, err: = net.ListenTCP ("tcp", tcpAddr)
    checkError (ошибка)
    за {
        conn, err: = listener.Accept ()
        if err! = nil {
            Продолжать
        }
        перейти handleClient (conn)
    }
}

func handleClient (conn net.Conn) {
    отложить соединение. Close ()
    дневное время: = время.Сейчас (). Строка ()
    conn.Write ([] byte (daytime)) // не заботится о возвращаемом значении
    // мы закончили с этим клиентом
}
func checkError (ошибка ошибки) {
    if err! = nil {
        fmt.Fprintf (os.Stderr, «Неустранимая ошибка:% s», err.Error ())
        os.Exit (1)
    }
}
  

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

Некоторые из вас могут подумать следующее: этот сервер не делает ничего значимого. Что, если бы нам нужно было отправить несколько запросов для разных форматов времени через одно соединение? Как бы мы это сделали?

  пакет основной

Импортировать (
    "fmt"
    "сеть"
    "Операционные системы"
    "время"
    "strconv"
)

func main () {
    service: = ": 1200"
    tcpAddr, err: = net.ResolveTCPAddr ("tcp4", служба)
    checkError (ошибка)
    слушатель, err: = net.ListenTCP ("tcp", tcpAddr)
    checkError (ошибка)
    за {
        conn, err: = слушатель.Принимать()
        if err! = nil {
            Продолжать
        }
        перейти handleClient (conn)
    }
}

func handleClient (conn net.Conn) {
    conn.SetReadDeadline (time.Now (). Add (2 * time.Minute)) // устанавливаем таймаут в 2 минуты
    request: = make ([] byte, 128) // устанавливаем максимальную длину запроса 128B для предотвращения атак на основе флуда
    defer conn.Close () // закрываем соединение перед выходом
    за {
        read_len, err: = conn.Read (запрос)

        if err! = nil {
            fmt.Println (ошибка)
            ломать
        }

        if read_len == 0 {
            break // соединение уже закрыто клиентом
        } else if string (request [: read_len]) == "отметка времени" {
            дневное время: = strconv.FormatInt (время.Теперь (). Unix (), 10)
            conn.Write ([] байт (дневное время))
        } еще {
            дневное время: = время.Теперь (). Строка ()
            conn.Write ([] байт (дневное время))
        }
    }
}

func checkError (ошибка ошибки) {
    if err! = nil {
        fmt.Fprintf (os.Stderr, «Неустранимая ошибка:% s», err.Error ())
        os.Exit (1)
    }
}
  

В этом примере мы используем conn.Read () для постоянного чтения клиентских запросов. Мы не можем закрыть соединение, потому что клиенты могут отправить более одного запроса.Из-за тайм-аута, который мы установили с помощью conn.SetReadDeadline () , соединение автоматически закрывается по истечении отведенного нам периода времени. Когда истечет время истечения срока, наша программа прерывает цикл на . Обратите внимание, что запрос необходимо создать с ограничением максимального размера, чтобы предотвратить атаки лавинной рассылки.

Управление TCP-соединениями

Управление функциями TCP:

  func DialTimeout (net, addr string, timeout time.Duration) (Conn, error) (Соединение, ошибка)
  

Установка тайм-аута соединений.Они подходят для использования как на клиентах, так и на серверах:

  func (c * TCPConn) SetReadDeadline (t time.Time) ошибка
func (c * TCPConn) SetWriteDeadline (t time.Time) ошибка
  

Установка таймаута записи / чтения одного соединения:

  func (c * TCPConn) SetKeepAlive (keepalive bool) os.Error
  

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

Для получения более подробной информации просто посмотрите официальную документацию на пакет Go net .

UDP сокеты

Единственное различие между сокетом UDP и сокетом TCP - это метод обработки нескольких запросов на стороне сервера. Это происходит из-за того, что UDP не имеет такой функции, как Accept . Все остальные функции имеют аналоги UDP и ; просто замените TCP на UDP в функциях, упомянутых выше.

  func ResolveUDPAddr (net, addr string) (* UDPAddr, os.Error)
func DialUDP (net string, laddr, raddr * UDPAddr) (c * UDPConn, err os.Error)
func ListenUDP (строка сети, laddr * UDPAddr) (c * UDPConn, err os.Error)
func (c * UDPConn) ReadFromUDP (b [] byte) (n int, addr * UDPAddr, err os.Error
func (c * UDPConn) WriteToUDP (b [] byte, addr * UDPAddr) (n int, err os.Error)
  

Пример кода клиента UDP:

  пакет основной

Импортировать (
    "fmt"
    "сеть"
    "Операционные системы"
)

func main () {
    если len (os.Args)! = 2 {
        fmt.Fprintf (os.Stderr, "Использование:% s хост: порт", os.Args [0])
        os.Exit (1)
    }
    service: = os.Args [1]
    udpAddr, err: = net.ResolveUDPAddr ("udp4", сервис)
    checkError (ошибка)
    conn, err: = net.DialUDP ("udp", nil, udpAddr)
    checkError (ошибка)
    _, err = conn.Write ([] byte ("что угодно"))
    checkError (ошибка)
    var buf [512] байт
    n, err: = conn.Read (buf [0:])
    checkError (ошибка)
    fmt.Println (строка (buf [0: n]))
    os.Exit (0)
}
func checkError (ошибка ошибки) {
    if err! = nil {
        fmt.Fprintf (os.Stderr, «Неустранимая ошибка», err.Error ())
        os.Exit (1)
    }
}
  

Пример кода UDP-сервера:

  пакет основной

Импортировать (
    "fmt"
    "сеть"
    "Операционные системы"
    "время"
)

func main () {
    service: = ": 1200"
    udpAddr, err: = net.ResolveUDPAddr ("udp4", сервис)
    checkError (ошибка)
    conn, err: = net.ListenUDP ("udp", udpAddr)
    checkError (ошибка)
    за {
        handleClient (соединение)
    }
}
func handleClient (conn * net.UDPConn) {
    var buf [512] байт
    _, адрес, ошибка: = соед.ReadFromUDP (buf [0:])
    if err! = nil {
        возвращение
    }
    дневное время: = время.Теперь (). Строка ()
    conn.WriteToUDP ([] байт (дневное время), адрес)
}
func checkError (ошибка ошибки) {
    if err! = nil {
        fmt.Fprintf (os.Stderr, «Неустранимая ошибка», err.Error ())
        os.Exit (1)
    }
}
  

Сводка

Описывая и кодируя некоторые простые программы, использующие сокеты TCP и UDP, мы видим, что Go обеспечивает отличную поддержку программирования сокетов, и что они забавны и просты в использовании.Go также предоставляет множество функций для создания высокопроизводительных приложений для сокетов.

Ссылки

Игра с сокетами и процессами в Эликсире

Недавно я работал над приложением-демоном. В этом нет веб-материала. Он служил как приемник данных о местонахождении транспортных средств в реальном времени. Все эти данные были помещены на нормальный порт TCP. Хотя я делал такие вещи раньше, прошло некоторое время, и я раньше не делал этого с Эликсиром.

Фактическая механика порта была простой и вполне стандартной:

  1. Слушайте порт.
  2. Принимать входящие соединения.
  3. Получить данные.
  4. Передайте это.

Так все делали с тех пор, как мы придумали TCP. Но поскольку мы сидя на вершине BEAM VM, нам не нужно беспокоиться о том, что что-то из этого находится в один и тот же процесс или наступление друг другу на пятки. Мы можем:

  1. Создать процесс для прослушивания порта.
  2. Создать процесс для приема входящих подключений.
  3. Получить данные и передать их процессу для буферизации.
  4. Передать это другому процессу.

Поскольку каждый бит находится в своем собственном процессе, ничто не блокирует что-либо еще, даже если мы используем синхронные функции.

Для доступа к необработанным сокетам TCP мы будем использовать gen_tcp. Это модуль на Erlang, потому что потребность в этой функциональности существует давно. Ты сможешь сказать, что вы делаете это в Эликсире, потому что вы получите доступ к функциям непосредственно на атом. Первое, что нам нужно сделать, это listen / 2 на сокете.Это довольно просто:

  defmodule Приемник делать
  требуется регистратор

  def start (порт) делать
    создать fn ->
      case: gen_tcp.listen (порт, [: двоичный, активный: false, reuseaddr: true]) сделать
        {: ок, сокет} ->
          Logger.info («Подключено»)
          accept_connection (socket) # <--- Мы разберемся с этим дальше.
        {: ошибка, причина} ->
          Logger.error ("Не удалось прослушать: # {причина}")
      конец
    конец
  конец
конец
  

Здесь active: false означает, что нам нужно опросить : gen_tcp для получения данных.Если бы мы использовали true , нам нужно будет принимать входящие данные в виде сообщений Elixir в нашем почтовом ящике. Приятно иметь, но на самом деле нам это не нужно, и это превращает рабочий процесс в немного сложнее для того, что мы пытаемся достичь здесь. Итак, мы пойдем с активным : ложным и опросом для новых данных.

Мы не хотим, чтобы вызов : gen_tcp.listen / 2 блокировал все. Предотвращать что, мы оборачиваем все тело функции внутри spawn / 1 , чтобы она запускалась в другой процесс.Наличие блока listen / 2 - это именно то, что мы хотим, но мы не хочу, чтобы он ничего не запустил.

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

Функция accept_connection нуждается в некоторой реализации. Принятие connection дает нам наш читаемый источник данных.Давайте заполним эту функцию сейчас.

  def accept_connection (сокет) сделать
  {: ok, client} =: gen_tcp.accept (сокет)
  создать fn ->
    {: ok, buffer_pid} = Buffer.create () # <--- это следующий
    Process.flag (: trap_exit, истина)
    serve (client, buffer_pid) # <--- а потом мы рассмотрим это
  конец
  loop_accept (сокет)
конец
  

: gen_tcp.accept / 1 ожидает подключения. Когда это произойдет, мы запускаем новый процесс, который создает Buffer для его использования и запускает прямо при прослушивании данных в выполняет функцию .Мы напишем эту функцию ниже.

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

Внутри этого порождения мы создаем Buffer для каждого подключения к сокету и монитора. этот процесс. В Erlang (как и в Elixir) процессы очень легкие.Вы должны уметь их легко создавать, а против создавать их легко.

С этой целью есть два основных способа «позаботиться» о создаваемом вами процессе:

  1. порождение , которое запускает процесс и совершенно не заботится о его статусе
  2. spawn_link , который запускает процесс, «связанный» с этим. В ссылка означает, что если один выйдет из строя, то и другой. Это полезно для создания Уверенное состояние не торчит, не устаревает и не занимает память.

То, что они не делают, по умолчанию - это отслеживание жизненного цикла. К счастью, у нас есть доступные инструменты.

  1. Мы можем Process.monitor / 1 любой старый процесс, который мы хотим, пока мы знаю пид. Если этот процесс завершится, мы получим сообщение : DOWN . Это работает лучше всего с порожденными процессами ред.
  2. Мы можем перехватить выходы с помощью Process.flag (: trap_exit, true) , как мы в приведенном выше коде. Это работает только с процессами spawn_link ed.Когда дочерний процесс умирает, родительский процесс получит сообщение : EXIT .

Как видите, это второй вариант, который мы используем, когда порождает наш слушатель Процесс. Мы узнаем, произойдет ли сбой в процессе Buffer .

Мы прослушиваем и принимаем соединения нашим сокетом. Мы ловим сбои подпроцессов, и мы запустили буфер Buffer для хранения данных, пока мы получить это. Итак, теперь нам действительно нужно его получить.С тех пор как мы начали слушать порт с активным : false нам нужно запросить данные. Мы будем использовать : gen_tcp.recv / 2 для этого.

  def serve (socket, buffer_pid) делать
    case: gen_tcp.recv (сокет, 0) сделать
      {: ок, данные} ->
        buffer_pid = might_recreate_buffer (buffer_pid) # <- следующий
        Buffer.receive (идентификатор_буфера, данные)
        serve (сокет, buffer_pid)
      {: ошибка, причина} ->
        Logger.info ("Завершение сокета: # {проверить причину}")
    конец
  конец
  

Мы вечно ждем поступления данных.Когда это произойдет, мы убедимся, что Buffer все еще работает (или запустить новый), а затем передать ему данные. потом мы будем ждать. Такое ожидание возможно только потому, что мы это делаем в отдельном Процессе.

Но последняя часть головоломки - выяснить, работает ли процесс Buffer Все еще работает. original_pid, _reason} -> {: ok, new_buffer_pid} = буфер.Создайте() new_buffer_pid после 10 -> original_pid конец конец

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

Maybe_recreate_buffer / 1 обеспечивает прозрачную работу для serve / 2 функция. Без Buffer мы не сможем передать данные по конвейеру функциям, которые реальная работа над информацией.Итак, с этим, хотя буфер уходит, он немедленно воссоздается.

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

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

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