что такое сокет интернет
Сокеты¶
Сокеты (англ. socket — разъём) — название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения.
Принципы сокетов¶
Каждый процесс может создать слушающий сокет (серверный сокет) и привязать его к какому-нибудь порту операционной системы (в UNIX непривилегированные процессы не могут использовать порты меньше 1024). Слушающий процесс обычно находится в цикле ожидания, то есть просыпается при появлении нового соединения. При этом сохраняется возможность проверить наличие соединений на данный момент, установить тайм-аут для операции и т.д.
Каждый сокет имеет свой адрес. ОС семейства UNIX могут поддерживать много типов адресов, но обязательными являются INET-адрес и UNIX-адрес. Если привязать сокет к UNIX-адресу, то будет создан специальный файл (файл сокета) по заданному пути, через который смогут сообщаться любые локальные процессы путём чтения/записи из него (см. Доменный сокет Unix). Сокеты типа INET доступны из сети и требуют выделения номера порта.
Обычно клиент явно подсоединяется к слушателю, после чего любое чтение или запись через его файловый дескриптор будут передавать данные между ним и сервером.
Основные функции¶
Общие | |
Socket | Создать новый сокет и вернуть файловый дескриптор |
Send | Отправить данные по сети |
Receive | Получить данные из сети |
Close | Закрыть соединение |
Серверные | |
Bind | Связать сокет с IP-адресом и портом |
Listen | Объявить о желании принимать соединения. Слушает порт и ждет когда будет установлено соединение |
Accept | Принять запрос на установку соединения |
Клиентские | |
Connect | Установить соединение |
socket()¶
Создаёт конечную точку соединения и возвращает файловый дескриптор. Принимает три аргумента:
domain указывающий семейство протоколов создаваемого сокета
type
protocol
Протоколы обозначаются символьными константами с префиксом IPPROTO_* (например, IPPROTO_TCP или IPPROTO_UDP). Допускается значение protocol=0 (протокол не указан), в этом случае используется значение по умолчанию для данного вида соединений.
Функция возвращает −1 в случае ошибки. Иначе, она возвращает целое число, представляющее присвоенный дескриптор.
Связывает сокет с конкретным адресом. Когда сокет создается при помощи socket(), он ассоциируется с некоторым семейством адресов, но не с конкретным адресом. До того как сокет сможет принять входящие соединения, он должен быть связан с адресом. bind() принимает три аргумента:
Возвращает 0 при успехе и −1 при возникновении ошибки.
Автоматическое получение имени хоста.
listen()¶
Подготавливает привязываемый сокет к принятию входящих соединений. Данная функция применима только к типам сокетов SOCK_STREAM и SOCK_SEQPACKET. Принимает два аргумента:
После принятия соединения оно выводится из очереди. В случае успеха возвращается 0, в случае возникновения ошибки возвращается −1.
accept()¶
Используется для принятия запроса на установление соединения от удаленного хоста. Принимает следующие аргументы:
Функция возвращает дескриптор сокета, связанный с принятым соединением, или −1 в случае возникновения ошибки.
connect()¶
Устанавливает соединение с сервером.
Некоторые типы сокетов работают без установления соединения, это в основном касается UDP-сокетов. Для них соединение приобретает особое значение: цель по умолчанию для посылки и получения данных присваивается переданному адресу, позволяя использовать такие функции как send() и recv() на сокетах без установления соединения.
Загруженный сервер может отвергнуть попытку соединения, поэтому в некоторых видах программ необходимо предусмотреть повторные попытки соединения.
Возвращает целое число, представляющее код ошибки: 0 означает успешное выполнение, а −1 свидетельствует об ошибке.
Передача данных¶
Для передачи данных можно пользоваться стандартными функциями чтения/записи файлов read и write, но есть специальные функции для передачи данных через сокеты:
Нужно обратить внимание, что при использовании протокола TCP (сокеты типа SOCK_STREAM) есть вероятность получить меньше данных, чем было передано, так как ещё не все данные были переданы, поэтому нужно либо дождаться, когда функция recv возвратит 0 байт, либо выставить флаг MSG_WAITALL для функции recv, что заставит её дождаться окончания передачи. Для остальных типов сокетов флаг MSG_WAITALL ничего не меняет (например, в UDP весь пакет = целое сообщение).
Сокеты в Python для начинающих
Предисловие
В далеком для меня 2010 году я писал статью для начинающих про сокеты в Python. Сейчас этот блог канул в небытие, но статья мне показалась довольно полезной. Статью нашел на флешке в либровском документе, так что это не кросспост, не копипаст — в интернете ее нигде нет.
Что это
Для начала нужно разобраться что такое вообще сокеты и зачем они нам нужны. Как говорит вики, сокет — это программный интерфейс для обеспечения информационного обмена между процессами. Но гораздо важнее не зазубрить определение, а понять суть. Поэтому я тут постараюсь рассказать все как можно подробнее и проще.
Существуют клиентские и серверные сокеты. Вполне легко догадаться что к чему. Серверный сокет прослушивает определенный порт, а клиентский подключается к серверу. После того, как было установлено соединение начинается обмен данными.
Рассмотрим это на простом примере. Представим себе большой зал с множеством небольших окошек, за которыми стоят девушки. Есть и пустые окна, за которыми никого нет. Те самые окна — это порты. Там, где стоит девушка — это открытый порт, за которым стоит какое-то приложение, которое его прослушивает. То есть, если, вы подойдете к окошку с номером 9090, то вас поприветствуют и спросят, чем могут помочь. Так же и с сокетами. Создается приложение, которое прослушивает свой порт. Когда клиент устанавливает соединение с сервером на этом порту именно данное приложение будет ответственно за работу этим клиентом. Вы же не подойдете к одному окошку, а кричать вам будут из соседнего 🙂
После успешной установки соединения сервер и клиент начинают обмениваться информацией. Например, сервер посылает приветствие и предложение ввести какую-либо команду. Клиент в свою очередь вводит команду, сервер ее анализирует, выполняет необходимые операции и отдает клиенту результат.
Сервер
Сейчас создайте два файла — один для сервера, а другой для клиента.
В Python для работы с сокетами используется модуль socket:
Прежде всего нам необходимо создать сокет:
Здесь ничего особенного нет и данная часть является общей и для клиентских и для серверных сокетов. Дальше мы будем писать код для сервера. Это вполне логично — зачем нам писать клиентское приложение, если некуда подключаться 🙂
Теперь нам нужно определиться с хостом и портом для нашего сервера. Насчет хоста — мы оставим строку пустой, чтобы наш сервер был доступен для всех интерфейсов. А порт возьмем любой от нуля до 65535. Следует отметить, что в большинстве операционных систем прослушивание портов с номерами 0 — 1023 требует особых привилегий. Я выбрал порт 9090. Теперь свяжем наш сокет с данными хостом и портом с помощью метода bind, которому передается кортеж, первый элемент (или нулевой, если считать от нуля) которого — хост, а второй — порт:
Теперь у нас все готово, чтобы принимать соединения. С помощью метода listen мы запустим для данного сокета режим прослушивания. Метод принимает один аргумент — максимальное количество подключений в очереди. Напряжем нашу бурную фантазию и вспомним про зал с окошками. Так вот этот параметр определяет размер очереди. Если он установлен в единицу, а кто-то, явно лишний, пытается еще подстроится сзади, то его пошлют 🙂 Установим его в единицу:
Ну вот, наконец-то, мы можем принять подключение с помощью метода accept, который возвращает кортеж с двумя элементами: новый сокет и адрес клиента. Именно этот сокет и будет использоваться для приема и посылке клиенту данных.
Вот и все. Теперь мы установили с клиентом связь и можем с ним «общаться». Т.к. мы не можем точно знать, что и в каких объемах клиент нам пошлет, то мы будем получать данные от него небольшими порциями. Чтобы получить данные нужно воспользоваться методом recv, который в качестве аргумента принимает количество байт для чтения. Мы будем читать порциями по 1024 байт (или 1 кб):
Как мы и говорили для общения с клиентом мы используем сокет, который получили в результате выполнения метода accept. Мы в бесконечном цикле принимаем 1024 байт данных с помощью метода recv. Если данных больше нет, то этот метод ничего не возвращает. Таким образом мы можем получать от клиента любое количество данных.
Дальше в нашем примере для наглядности мы что-то сделаем с полученными данными и отправим их обратно клиенту. Например, с помощью метода upper у строк вернем клиенту строку в верхнем регистре.
Теперь можно и закрыть соединение:
Собственно сервер готов. Он принимает соединение, принимает от клиента данные, возвращает их в виде строки в верхнем регистре и закрывает соединение. Все просто 🙂 В итоге у вас должно было получиться следующее:
Клиент
Думаю, что теперь будет легче. Да и само клиентское приложение проще — нам нужно создать сокет, подключиться к серверу послать ему данные, принять данные и закрыть соединение. Все это делается так:
Думаю, что все понятно, т.к. все уже разбиралось ранее. Единственное новое здесь — это метод connect, с помощью которого мы подключаемся к серверу. Дальше мы читаем 1024 байт данных и закрываем сокет.
Разница между веб-сокетами и Socket.IO
Доброго времени суток, друзья!
Веб-сокеты и Socket.IO, вероятно, являются двумя наиболее распространенными средствами коммуникации в режиме реального времени (далее — живое общение). Но чем они отличаются?
При построении приложения для живого общения наступает момент, когда необходимо выбрать средство для обмена данными между клиентом и сервером. Веб-сокеты и Socket.IO являются самыми популярными средствами живого общения в современном вебе. Какое из них выбрать? В чем разница между этими технологиями? Давайте выясним.
Веб-сокеты
Говоря о веб-сокетах, мы имеем ввиду протокол веб-коммуникации, представляющий полнодуплексный канал коммуникации поверх простого TCP-соединения. Проще говоря, эта технология позволяет установить связь между клиентом и сервером с минимальными затратами, позволяя создавать приложения, использующие все преимущества живого общения.
Например, представьте, что вы создаете чат: вам необходимо получать и отправлять данные как можно быстрее, верно? С этим прекрасно справляются веб-сокеты! Вы можете открыть TCP-соединение и держать его открытым сколько потребуется.
Веб-сокеты появились в 2010 году в Google Chrome 4, первый RFC (6455) опубликован в 2011.
Веб-сокеты используются в следующих случаях:
Socket.IO
Socket.IO — библиотека JavaScript, основанная (написанная поверх) на веб-сокетах… и других технологиях. Она использует веб-сокеты, когда они доступны, или такие технологии, как Flash Socket, AJAX Long Polling, AJAX Multipart Stream, когда веб-сокеты недоступны. Легкой аналогией может служить сравнение Fetch API и Axios.
Разница между веб-сокетами и Socket.IO
Главными преимуществами Socket.IO является следующее:
Во-первых, веб-сокеты поддерживаются всеми современными браузерами. Поэтому вы редко нуждаетесь в поддержке других технологий, предоставляемой Socket.IO.
Если говорить о сетевом трафике, то веб-сокеты отправляют всего два запроса:
В npm существует пакет «websocket-vs-socket.io», который позволяет сравнить сетевой трафик этих технологий:
Сетевой трафик веб-сокетов:
Сетевой трафик Socket.IO:
Пишем код
Простой сервер на веб-сокетах
В нашей программе на Node.js мы создадим сервер, работающий на порту 3001. При каждом подключении клиента мы будем присваивать ему уникальный ID. При отправке сообщения клиентом мы будем уведомлять его об успехе: [ ]:
Отлично! Но что если мы хотим рассылать сообщение каждому подключенному клиенту? Веб-сокеты не поддерживают рассылку по умолчанию. Это можно реализовать следующим образом:
Легко и просто! Как видите, WebSocket.Server хранит записи о каждом подключенном клиенте, поэтому мы можем сделать итерацию и отправить сообщение каждому. Вы можете протестировать код на компьютере (MacOS) или в браузере (Chrome).
Простой сервер на Socket.IO
Это было не сложно. Может ли Socket.IO сделать это еще проще? Как нам написать такой же сервер на Socket.IO?
Код получился почти наполовину короче! Как видите, метод «broadcast» не отправляет уведомление отправителю, поэтому мы вынуждены делать это вручную.
Существует проблема: код нельзя протестировать на обычном клиенте веб-сокетов. Это связано с тем, что, как отмечалось ранее, Socket.IO использует не чистые веб-сокеты, а множество технологий для поддержки всех возможных клиентов. Так как же нам проверить его работоспособность?
Необходимо использовать специальный клиент. В приведенном примере мы загружаем его из CDN. Этот клиент позволяет нам провести быстрые (грязные) тесты в браузере.
уПЛЕФЩ
пУОПЧЩ УПЛЕФПЧ
рТПУФТБОУФЧП ЙНЕО ПРТЕДЕМСЕФ, ЛБЛ ЪБРЙУБОЩ БДТЕУБ УПЛЕФБ ( socket addresses ). бДТЕУ УПЛЕФБ ЙДЕОФЙЖЙГЙТХЕФ ПДЙО ЛПОЕГ РПДЛМАЮЕОЙС УПЛЕФБ. оБРТЙНЕТ, БДТЕУБ УПЛЕФБ Ч МПЛБМШОПН РТПУФТБОУФЧЕ ЙНЕО СЧМСАФУС ПВЩЮОЩНЙ ЙНЕОБНЙ ЖБКМПЧ. ч РТПУФТБОУФЧЕ ЙНЕО йОФЕТОЕФ БДТЕУ УПЛЕФБ УПУФПЙФ ЙЪ йОФЕТОЕФ БДТЕУБ ( IP БДТЕУ) ЗМБЧОПЗП ЛПНРШАФЕТБ, РТЙУПЕДЙОЕООПЗП Л УЕФЙ Й ОПНЕТБ РПТФБ, ЛПФПТЩК ЙДЕОФЙЖЙГЙТХЕФ УПЛЕФ УТЕДЙ НОПЦЕУФЧБ УПЛЕФПЧ ОБ ФПН ЦЕ ЗМБЧОПН ЛПНРШАФЕТЕ.
уЙУФЕНОЩЕ ЧЩЪПЧЩ
уПЛЕФЩ РТЕДУФБЧМСАФУС ДЕУЛТЙРФПТБНЙ ЖБКМПЧ.
уПЪДБОЙЕ Й ХОЙЮФПЦЕОЙЕ УПЛЕФПЧ
у РПНПЭША ЖХОЛГЙК socket Й close УПЪДБАФУС Й ХОЙЮФПЦБАФУС УПЛЕФЩ. рТЙ УПЪДБОЙЙ УПЛЕФБ, ОЕПВИПДЙНП ПРТЕДЕМЙФШ ФТЙ РБТБНЕФТБ УПЛЕФБ: РТПУФТБОУФЧП ЙНЕО, УФЙМШ ЧЪБЙНПДЕКУФЧЙС Й РТПФПЛПМ.
дМС ХЛБЪБОЙС РТПУФТБОУФЧБ ЙНЕО ЙУРПМШЪХАФУС ЛПОУФБОФЩ, ОБЮЙОБАЭЙЕУС У PF_ (УПЛТБЭЕОЙЕ «УЕНЕКУФЧП РТПФПЛПМБ»). оБРТЙНЕТ, PF_LOCAL ЙМЙ PF_UNIX ПРТЕДЕМСАФ МПЛБМШОПЕ РТПУФТБОУФЧП ЙНЕО, Й PF_INET ПРТЕДЕМСЕФ йОФЕТОЕФ РТПУФТБОУФЧП ЙНЕО.
чЩЪПЧ connect
пФРТБЧЛБ ДБООЩИ
уЕТЧЕТЩ
чЩЪПЧ accept УПЪДБЕФ ОПЧЩК УПЛЕФ ДМС ЧЪБЙНПДЕКУФЧЙС У ЛМЙЕОФПН Й ЧПЪЧТБЭБЕФ УППФЧЕФУФЧХАЭЙК ДЕУЛТЙРФПТ ЖБКМБ. пТЙЗЙОБМШОЩК УПЛЕФ УЕТЧЕТБ РТПДПМЦБЕФ РТЙОЙНБФШ ОПЧЩЕ ЛМЙЕОФУЛЙЕ УПЕДЙОЕОЙС.
мПЛБМШОЩЕ УПЛЕФЩ
оБРТЙНЕТ, ПВТБФЙФЕ ЧОЙНБОЙЕ ОБ ОБЮБМШОХА s:
чЩЪПЧ unlink ХДБМСЕФ МПЛБМШОЩК УПЛЕФ, РТЙ ЪБЧЕТЫЕОЙЙ ТБВПФЩ У ОЙН.
рТЙНЕТ ЙУРПМШЪПЧБОЙС МПЛБМШОЩИ УПЛЕФПЧ
лМЙЕОФ-РТПЗТБННБ, РТЕДУФБЧМЕООБС Ч МЙУФЙОЗЕ 5.11, УПЕДЙОСЕФУС У МПЛБМШОЩН УПЛЕФПН Й РПУЩМБЕФ УППВЭЕОЙС. рХФШ Л УПЛЕФХ Й УППВЭЕОЙС РЕТЕДБtФУС ЮЕТЕЪ ЛПНБОДОХА УФТПЛХ.
рЕТЕД РЕТЕДБЮЕК УППВЭЕОЙС, РПУЩМБЕФУС ТБЪНЕТ УППВЭЕОЙС Ч ВБКФБИ Ч ЛБЮЕУФЧЕ РЕТЕНЕООПК length. уЕТЧЕТ УПИТБОСЕФ ТБЪНЕТ УППВЭЕОЙС, ДМС ЧЩДЕМЕОЙС РБНСФЙ РПД УППВЭЕОЙЕ. юФПВЩ ЧЩРПМОЙФШ ЬФПФ РТЙНЕТ, ОЕПВИПДЙНП ЪБРХУФЙФШ УЕТЧЕТ-РТПЗТБННХ Ч ПДОПН ПЛОЕ, ПРТЕДЕМЙФШ РХФШ Л УПЛЕФХ.
ч ДТХЗПН ПЛОЕ ЪБРХУФЙФШ ЛМЙЕОФ-РТПЗТБННХ ОЕУЛПМШЛП ТБЪ, ПРЕТЕДЕМСС ПДЙО Й ФПФ ЦЕ РХФШ УПЛЕФБ Й РПУЩМБС ЛМЙЕОФХ УППВЭЕОЙЕ:
уЕТЧЕТ-РТПЗТБННБ РПМХЮБЕФ Й РЕЮБФБЕФ ЬФЙ УППВЭЕОЙС. дМС ЪБЛТЩФЙС УПЕДЙОЕОЙС, ЛМЙЕОФ РПУЩМБЕФ УППВЭЕОЙЕ «quit»:
Internet-Domain УПЛЕФЩ
CПЛЕФЩ UNIX-domain ЙУРПМШЪПЧБФШУС ФПМШЛП ДМС ЧЪБЙНПДЕКУФЧЙС ДЧХИ РТПГЕУУПЧ ФПМШЛП ОБ ПДОПН ЛПНРШАФЕТЕ. уПЛЕФЩ Internet, ЙУРПМШЪХАФУС ДМС УПЕДЙОЕОЙС ОЕУЛПМШЛЙИ РТПГЕУУПЧ ОБ ТБЪМЙЮОЩИ НБЫЙОБИ, РПДЛМАЮЕООЩИ Л УЕФЙ.
лПНБОДБ gethostbyname РТЕПВТБЪПЧЩЧБЕФ ХДПВПЮЙФБЕНЩЕ ЙНЕОБ ИПУФБ, ЮЙУМБ УП УФБОДБТФОПК ФПЮЕЮОПК ОПФБГЙЕК (ФЙРБ 10.0.0.1) ЙМЙ DNS ЙНЕОБ (ФБЛЙЕ ЛБЛ www.codesourcery.com) Ч 32-ТБЪТСДОЩЕ IP БДТЕУБ. ч ЛБЮЕУФЧЕ ТЕЪХМШФБФБ ЧПЪЧТБЭБЕФУС ХЛБЪБФЕМШ ОБ УФТХЛФХТХ struct hostent ; Ч РПМЕ h_addr ИТБОЙФУС IP БДТЕУ ЗМБЧОПЗП ЛПНРШАФЕТБ.
мЙУФЙОЗ 5.12 ЙММАУФТЙТХЕФ ЙУРПМШЪПЧБОЙЕ Internet-domain УПЛЕФПЧ. рТПЗТБННБ РПМХЮБЕФ ДПНБЫОАА УФТБОЙГХ ПФ Web УЕТЧЕТБ, ЙНС ИПУФБ ЛПФПТПЗП ПРТЕДЕМЕОП Ч ЛПНБОДОПК УФТПЛЕ.
дМС ПФПВТБЦЕОЙС УФТБОЙГЩ www.codesourcery.com, ОЕПВИПДЙНП ЪБДБФШ УМЕДХАЭХЕ ЛПНБОДХ
рБТЩ УПЛЕФПЧ
Сокеты в ОС Linux
В данной статье будет рассмотрено понятие сокета в операционной системе Linux: основные структуры данных, как они работают и можно ли управлять состоянием сокета с помощью приложения. В качестве практики будут рассмотрены инструменты netcat и socat.
Что такое сокет?
Как видно по исходным кодам, все структуры достаточно объемны. Работа с ними возможна при использовании языка программирования или специальных оберток и написания приложения. Для эффективного управления этими структурами нужно знать, какие типы операций над сокетами существуют и когда их применять. Для сокетов существует набор стандартных действий:
Если о структурах, которые описаны выше, заботится ядро операционной системы, то в случае команд по управлению соединением ответственность берет на себя приложение, которое хочет пересылать данные по сети. Попробуем использовать знания о сокетах для работы с приложениями netcat и socat.
netcat
Оригинальная утилита появилась 25 лет назад, больше не поддерживается. На cегодняшний день существуют порты, которые поддерживаются различными дистрибутивами: Debian, Ubuntu, FreeBSD, MacOS. В операционной системе утилиту можно вызвать с помощью команды nc, nc.traditional или ncat в зависимости от ОС. Утилита позволяет «из коробки» работать с сокетами, которые используют в качестве транспорта TCP и UDP протоколы. Примеры сценариев использования, которые, по мнению автора, наиболее интересны:
перенаправление входящих/исходящих запросов;
трансляция данных на экран в шестнадцатеричном формате.
Опробуем операции в действии. Задача будет состоять в том, что необходимо отправить TCP данные через netcat в UDP соединение. Для лабораторной будет использоваться следующая топология сети:
В итоге получаем возможность читать данные от машины Source:
В машине Destination:
Пример с трансляцией данных в шестнадцатеричном формате можно провести так же, но заменить команду на Destination или добавить еще один пайп на Repeater:
В результате будет создан файл, в котором можно будет обнаружить передаваемые данные в шестнадцатеричном формате:
Как видно из тестового сценария использования, netcat не дает контролировать практически ничего, кроме направления данных. Нет ни разграничения доступа к ресурсам, которые пересылаются, ни возможности без дополнительных ухищрений работать с двумя сокетами, ни возможности контролировать действия сокета. Протестируем socat.
socat
Инструмент, который до сих пор поддерживается и имеет весьма обширный функционал по склейке каналов для взаимодействия. Разработчиками инструмент именуется как netcat++. Ниже приведем небольшой список того что можно перенаправить через socat:
Для повседневного использования достаточно опций, но если понадобится когда-то работать напрямую с серийным портом или виртуальным терминалом, то socat тоже умеет это делать. Полный перечень опций можно вызвать с помощью команды:
Помимо редиректов socat также можно использовать как универсальный сервер для расшаривания ресурсов, через него можно как через chroot ограничивать привилегии и доступ к директориям системы.
Чтобы комфортно пользоваться этим инструментом, нужно запомнить шаблон командной строки, который ожидает socat:
socat additionalOptions addr1 addr2
Попробуем провести трансляцию данных из сокета в сокет. Будем использовать для этого 1 машину. Перед началом эксперимента стоит отметить, что особенностью socat является то, что для его корректной работы нужно обязательно писать 2 адреса. Причем адрес не обязательно должен быть адресом, это может быть и приложение, и стандартный вывод на экран.
Например, чтобы использовать socat как netcat в качестве TCP сервера, можно запустить вот такую команду:
socat TCP-LISTEN:4545, STDOUT
Для коннекта можно использовать netcat:
При таком использовании, socat дает возможность пересылать сообщения в обе стороны, но если добавить флаг «-u», то общение будет только от клиента к серверу. Все серверные сообшения пересылаться не будут:
Настроим более тонко наш сервер, добавив новые опции через запятую после используемого действия:
socat TCP-LISTEN:4545,reuseaddr,keepalive,fork STDOUT
Дополнительные параметры распространяются на те действия, которые socat может выполнять по отношению к адресу. Полный список опций можно найти здесь в разделе «SOCKET option group».
Таким образом socat дает практически полный контроль над состоянием сокетов и расшариваемых ресурсов.
Статья написана в преддверии старта курса Network engineer. Basic. Всех, кто желает подробнее узнать о курсе и карьерных перспективах, приглашаем записаться на день открытых дверей, который пройдет уже 4 февраля.