С сокеты: Сокеты в C# и .NET – .NET и C# | Сокеты

Содержание

.NET и C# | Сокеты

96

C# и .NET — Сетевое программирование — Сокеты

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

Первоначально сокеты были разработаны для UNIX в Калифорнийском университете в Беркли. В UNIX обеспечивающий связь метод ввода-вывода следует алгоритму open/read/write/close. Прежде чем ресурс использовать, его нужно открыть, задав соответствующие разрешения и другие параметры. Как только ресурс открыт, из него можно считывать или в него записывать данные. После использования ресурса пользователь должен вызывать метод Close(), чтобы подать сигнал операционной системе о завершении его работы с этим ресурсом.

Когда в операционную систему UNIX были добавлены средства межпроцессного взаимодействия (Inter-Process Communication, IPC)

и сетевого обмена, был заимствован привычный шаблон ввода-вывода. Все ресурсы, открытые для связи, в UNIX и Windows идентифицируются дескрипторами. Эти дескрипторы, или описатели (handles), могут указывать на файл, память или какой-либо другой канал связи, а фактически указывают на внутреннюю структуру данных, используемую операционной системой. Сокет, будучи таким же ресурсом, тоже представляется дескриптором. Следовательно, для сокетов жизнь дескриптора можно разделить на три фазы: открыть (создать) сокет, получить из сокета или отправить сокету и в конце концов закрыть сокет.

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

Типы сокетов

Существуют два основных типа сокетов — потоковые сокеты и дейтаграммные.

Потоковые сокеты (stream socket)

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

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

Transmission Control Protocol (TCP). TCP обеспечивает поступление данных на другую сторону в нужной последовательности и без ошибок.

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

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

Потоки базируются на явных соединениях: сокет А запрашивает соединение с сокетом В, а сокет В либо со

Сокеты в Python для начинающих / Habr

Предисловие

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

Что это

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

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


Рассмотрим это на простом примере. Представим себе большой зал с множеством небольших окошек, за которыми стоят девушки. Есть и пустые окна, за которыми никого нет. Те самые окна — это порты. Там, где стоит девушка — это открытый порт, за которым стоит какое-то приложение, которое его прослушивает. То есть, если, вы подойдете к окошку с номером 9090, то вас поприветствуют и спросят, чем могут помочь. Так же и с сокетами. Создается приложение, которое прослушивает свой порт. Когда клиент устанавливает соединение с сервером на этом порту именно данное приложение будет ответственно за работу этим клиентом. Вы же не подойдете к одному окошку, а кричать вам будут из соседнего 🙂

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

Сервер

Сейчас создайте два файла — один для сервера, а другой для клиента.

В Python для работы с сокетами используется модуль socket:

import socket

Прежде всего нам необходимо создать сокет:

sock = socket.socket()

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

Теперь нам нужно определится с хостом и портом для нашего сервера. Насчет хоста — мы оставим строку пустой, чтобы наш сервер был доступен для всех интерфейсов. А порт возьмем любой от нуля до 65535. Следует отметить, что в большинстве операционных систем прослушивание портов с номерами 0 — 1023 требует особых привилегий. Я выбрал порт 9090. Теперь свяжем наш сокет с данными хостом и портом с помощью метода bind, которому передается кортеж, первый элемент (или нулевой, если считать от нуля) которого — хост, а второй — порт:

sock.bind(('', 9090))

Теперь у нас все готово, чтобы принимать соединения. С помощью метода listen мы запустим для данного сокета режим прослушивания. Метод принимает один аргумент — максимальное количество подключений в очереди. Напряжем нашу бурную фантазию и вспомним про зал с окошками. Так вот этот параметр определяет размер очереди. Если он установлен в единицу, а кто-то, явно лишний, пытается еще подстроится сзади, то его пошлют 🙂 Установим его в единицу:

sock.listen(1)

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

conn, addr = sock.accept()

Вот и все. Теперь мы установили с клиентом связь и можем с ним «общаться». Т.к. мы не можем точно знать, что и в каких объемах клиент нам пошлет, то мы будем получать данные от него небольшими порциями. Чтобы получить данные нужно воспользоваться методом recv, который в качестве аргумента принимает количество байт для чтения. Мы будем читать порциями по 1024 байт (или 1 кб):

while True:
    data = conn.recv(1024)
    if not data:
        break
    conn.send(data.upper())

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

Дальше в нашем примере для наглядности мы что-то сделаем с полученными данными и отправим их обратно клиенту. Например, с помощью метода upper у строк вернем клиенту строку в верхнем регистре.

Теперь можно и закрыть соединение:

conn.close()

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket

sock = socket.socket()
sock.bind(('', 9090))
sock.listen(1)
conn, addr = sock.accept()

print 'connected:', addr

while True:
    data = conn.recv(1024)
    if not data:
        break
    conn.send(data.upper())

conn.close()
Клиент

Думаю, что теперь будет легче. Да и само клиентское приложение проще — нам нужно создать сокет, подключиться к серверу послать ему данные, принять данные и закрыть соединение. Все это делается так:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket

sock = socket.socket()
sock.connect(('localhost', 9090))
sock.send('hello, world!')

data = sock.recv(1024)
sock.close()

print data

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

Сокет и его методы — CoderLessons.com

Сокеты являются конечными точками двунаправленного канала связи. Они могут связываться внутри процесса, между процессами на одной машине или между процессами на разных машинах. Аналогичным образом, сетевой сокет является одной конечной точкой в ​​потоке связи между двумя программами, работающими в компьютерной сети, такой как Интернет. Это чисто виртуальная вещь и не означает никакого оборудования. Сетевой сокет может быть идентифицирован по уникальной комбинации IP-адреса и номера порта. Сетевые сокеты могут быть реализованы на нескольких различных типах каналов, таких как TCP, UDP и так далее.

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

Домен

Домен – это семейство протоколов, которое используется в качестве транспортного механизма. Эти значения являются константами, такими как AF_INET, PF_INET, PF_UNIX, PF_X25 и т. Д.

Тип

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

протокол

Это может использоваться для идентификации варианта протокола в домене и типе. Его значение по умолчанию равно 0. Обычно оно не учитывается.

Hostname

Это работает как идентификатор сетевого интерфейса. Имя хоста может быть строкой, четырехточечным адресом или IPV6-адресом в двоеточии (и, возможно, точечной).

порт

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

Socket-модуль Python для сокет-программирования

Чтобы реализовать программирование сокетов в Python, нам нужно использовать модуль Socket. Ниже приведен простой синтаксис для создания Socket –

import socket
s = socket.socket (socket_family, socket_type, protocol = 0)

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

  • socket_family – это либо AF_UNIX, либо AF_INET, как объяснялось ранее.

  • socket_type – это либо SOCK_STREAM, либо SOCK_DGRAM.

  • протокол – обычно не указывается, по умолчанию 0.

socket_family – это либо AF_UNIX, либо AF_INET, как объяснялось ранее.

socket_type – это либо SOCK_STREAM, либо SOCK_DGRAM.

протокол – обычно не указывается, по умолчанию 0.

Методы сокетов

В этом разделе мы узнаем о различных методах сокетов. Три различных набора методов сокетов описаны ниже –

  • Методы сокета сервера
  • Методы клиентских сокетов
  • Общие методы сокетов

Методы сокета сервера

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

  • socket.bind () – Этот метод привязывает адрес (имя хоста, номер порта) к сокету.

  • socket.listen () – Этот метод в основном прослушивает соединения, сделанные с сокетом. Запускает TCP слушатель. Backlog является аргументом этого метода, который указывает максимальное количество подключений в очереди. Его минимальное значение равно 0, а максимальное – 5.

  • socket.accept () – это примет TCP-клиентское соединение. Пара (conn, address) является парой возвращаемого значения этого метода. Здесь conn – это новый объект сокета, используемый для отправки и получения данных о соединении, а адрес – это адрес, связанный с сокетом. Перед использованием этого метода необходимо использовать методы socket.bind () и socket.listen ().

socket.bind () – Этот метод привязывает адрес (имя хоста, номер порта) к сокету.

socket.listen () – Этот метод в основном прослушивает соединения, сделанные с сокетом. Запускает TCP слушатель. Backlog является аргументом этого метода, который указывает максимальное количество подключений в очереди. Его минимальное значение равно 0, а максимальное – 5.

socket.accept () – это примет TCP-клиентское соединение. Пара (conn, address) является парой возвращаемого значения этого метода. Здесь conn – это новый объект сокета, используемый для отправки и получения данных о соединении, а адрес – это адрес, связанный с сокетом. Перед использованием этого метода необходимо использовать методы socket.bind () и socket.listen ().

Методы клиентских сокетов

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

  • socket.connect (address) – это метод активного интимного подключения к серверу или, проще говоря, этот метод соединяет клиента с сервером. Адрес аргумента представляет адрес сервера.

socket.connect (address) – это метод активного интимного подключения к серверу или, проще говоря, этот метод соединяет клиента с сервером. Адрес аргумента представляет адрес сервера.

Общие методы сокетов

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

  • socket.recv (bufsize) – как следует из названия, этот метод получает TCP-сообщение от сокета. Аргумент bufsize обозначает размер буфера и определяет максимальный объем данных, который этот метод может получить за один раз.

  • socket.send (bytes) – этот метод используется для отправки данных в сокет, который подключен к удаленной машине. Байт аргумента даст количество байтов, отправленных сокету.

  • socket.recvfrom (data, address) – этот метод получает данные из сокета. Этот метод возвращает две пары (данные, адрес). Данные определяют полученные данные, а адрес – адрес сокета, отправляющего данные.

  • socket.sendto (data, address) – как следует из названия, этот метод используется для отправки данных из сокета. Этот метод возвращает две пары (данные, адрес). Данные определяют количество отправленных байтов, а адрес – адрес удаленного компьютера.

  • socket.close () – Этот метод закроет сокет.

  • socket.gethostname () – Этот метод возвращает имя хоста.

  • socket.sendall (data) – этот метод отправляет все данные в сокет, который подключен к удаленной машине. Он будет небрежно передавать данные до тех пор, пока не произойдет ошибка, и если это произойдет, то он использует метод socket.close (), чтобы закрыть сокет.

socket.recv (bufsize) – как следует из названия, этот метод получает TCP-сообщение от сокета. Аргумент bufsize обозначает размер буфера и определяет максимальный объем данных, который этот метод может получить за один раз.

socket.send (bytes) – этот метод используется для отправки данных в сокет, который подключен к удаленной машине. Байт аргумента даст количество байтов, отправленных сокету.

socket.recvfrom (data, address) – этот метод получает данные из сокета. Этот метод возвращает две пары (данные, адрес). Данные определяют полученные данные, а адрес – адрес сокета, отправляющего данные.

socket.sendto (data, address) – как следует из названия, этот метод используется для отправки данных из сокета. Этот метод возвращает две пары (данные, адрес). Данные определяют количество отправленных байтов, а адрес – адрес удаленного компьютера.

socket.close () – Этот метод закроет сокет.

socket.gethostname () – Этот метод возвращает имя хоста.

socket.sendall (data) – этот метод отправляет все данные в сокет, который подключен к удаленной машине. Он будет небрежно передавать данные до тех пор, пока не произойдет ошибка, и если это произойдет, то он использует метод socket.close (), чтобы закрыть сокет.

Программа для установления соединения между сервером и клиентом

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

Серверная программа

В этой программе сокетов на стороне сервера мы будем использовать метод socket.bind (), который привязывает его к определенному IP-адресу и порту, чтобы он мог прослушивать входящие запросы на этот IP-адрес и порт. Позже мы используем метод socket.listen (), который переводит сервер в режим прослушивания. Число, скажем 4, в качестве аргумента метода socket.listen () означает, что 4 соединения остаются в ожидании, если сервер занят, и если 5-й сокет пытается соединиться, то соединение отклоняется. Мы отправим сообщение клиенту с помощью метода socket.send () . В конце мы используем методы socket.accept () и socket.close () для инициирования и закрытия соединения соответственно. Ниже приведена программа на стороне сервера –

import socket
def Main():
   host = socket.gethostname()
   port = 12345
   serversocket = socket.socket()
   serversocket.bind((host,port))
   serversocket.listen(1)
   print('socket is listening')
   
   while True:
      conn,addr = serversocket.accept()
      print("Got connection from %s" % str(addr))
      msg = 'Connecting Established'+ "\r\n"
      conn.send(msg.encode('ascii'))
      conn.close()
if __name__ == '__main__':
   Main()

Клиентская программа

В клиентской программе сокетов нам нужно создать объект сокета. Затем мы подключимся к порту, на котором работает наш сервер – 12345 в нашем примере. После этого мы установим соединение с помощью метода socket.connect () . Затем с помощью метода socket.recv () клиент получит сообщение от сервера. Наконец, метод socket.close () закроет клиент.

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostname()
port = 12345

s.connect((host, port))
msg = s.recv(1024)

s.close()
print (msg.decode('ascii'))

Теперь, после запуска серверной программы, мы получим следующий вывод на терминал –

socket is listening
Got connection from ('192.168.43.75', 49904)

И после запуска клиентской программы мы получим следующий вывод на другом терминале –

Connection Established

Обработка исключений сетевых сокетов

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

import socket
host = "192.168.43.75"
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
   s.bind((host,port))
   s.settimeout(3)
   data, addr = s.recvfrom(1024)
   print ("recevied from ",addr)
   print ("obtained ", data)
   s.close()
except socket.timeout :
   print ("No connection between client and server")
   s.close()

Выход

Вышеуказанная программа генерирует следующий вывод –

No connection between client and server

В приведенном выше сценарии сначала мы создали объект сокета. Затем последовало предоставление IP-адреса хоста и номера порта, на котором работает наш сервер – 12345 в нашем примере. Позже используется блок try, и внутри него с помощью метода socket.bind () мы попытаемся связать IP-адрес и порт. Мы используем метод socket.settimeout () для установки времени ожидания клиента, в нашем примере мы устанавливаем 3 секунды. Используется блок исключений, который будет печатать сообщение, если не будет установлено соединение между сервером и клиентом.

Сетевые сокеты, Socket API и клиент-серверная модель

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

 

 

Клиентское приложение всегда работает на локальной машине, подключенной к сети

Интерфейс между приложением и хост-машиной (Network-Application Interface) определяет как приложение может использовать сеть.

 

Сетевые сокеты

 

 

Сетевые сокеты и клиент серверная модель

Приложение клиента (посылает например URL в случае с вебом или запрос к MySQL) на определенный сетевой адрес и порт. В примере это localhost и порт 3306 — сервер в свою отвечает приложению. К приложению при этом могут обращаться множество клиентов, запросы и использованием сокета приходят на один и тот же адрес и обрабатываются одним пакетом. Таким образом работает клиент-серверая модель взаимодействия.

 

Чтобы написать приложение, которое могло бы обслуживать множество клиентов (последовательно и параллельно) нужно сокет API

Socket API — интерфейс используемый всеми интернет приложениями.

 

Socket API при соединении 2-х приложений может работать с потоками и с датаграммами :
  • потоки — отправка потока байтов с гарантированной доставкой
  • датаграммы — отдельные сообщения без грантии доставки

 

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

 

Один сокет не может использовать два приложения одновременно или два экземпляра одного приложения.

 

Вызовы в Socket API

Socket API
SOCKET — вызов создает структуру

BIND — связывает локальный адрес с сокетом

LISTEN — заявляет о готовности установить соединение

ACCEPT — принимает входящее соединение

CONNECT — пробует установить соединение

SEND — отправляет данные в рамках соединения

RECEIVE — принимает информацию в рамках соединения

CLOSE — прерывает соединение

 

Ответы Mail.ru: Что такое сокеты?

Это гнездо для процессора: Socket 775 — это сокет для процессоров Intel Socket AM2 — сокет для процессоров AMD

Точки адрес-порт, участвующие в соединении (не обязательно сетевом)

Если смотреть по сути, сокет — это модель одного конца сетевого соединения, со всеми присущими ему свойствами, и, естественно — возможностью получать и передавать данные. По содержанию — это прикладной программный интерфейс, входящий в состав многих ОС. В семействе Windows — начиная с версии 3.11, и носит название WinSock. Прототипы функций WinSock API находятся в файле winsock.pas. В Delphi есть полноценная инкапсуляция клиентского и серверного сокетов, представленная компонентами TClientSocket и TServerSocket, находящимися на закладке Internet. <br><br>Сокеты не обязательно базируются на протоколе TCP/IP, они могут также базироваться на IPX/SPX, etc. <br><br>Также Вам следует ознакомиться со списком зарезервированных номеров портов. <br><br>Механизм взаимодействия сокетов таков. С одной из двух сторон запускается серверный сокет, который сразу после запуска находится в режиме прослушивания (listening), точнее — ожидания запросов от клиентов. После получения запроса от клиента устанавливается связь, и создается новый экземпляр серверного сокета. <br><br>Так как работа с сокетами, это, по сути — операции ввода/вывода, которые бывают синхронными или асинхронными, то и тип работы сокета обладает бывает синхронным или асинхронным. Компоненты TClientSock и TServerSock поддерживают оба режима работы. <br><br>Когда говорят СОКЕТ то часто не представляют, что это такое. Можно говорить об моделях, об реализациях и так далее. о есть одно простое толкование, применимое для протокола IP. Как известно для взаимодействия между машинами по протоколу IP используются адреса и порты. <br><br>Первое на текущий момент представляют из себя 32-x битный адрес, наиболее часто его представляют в символьной форме mmm.nnn.ppp.qqq (адрес разбитый на четыре октета по одному байту в октете и разделеный точками) . <br><br>Второе — это номер порта в диапазоне от нуля до 65535 <br><br>Так вот эта пара и есть сокет (гнездо в в котором расположены адрес и порт). <br><br>В процессе обмена как правило используются два сокета — сокет отправителя и сокет получателя. <br><br>апример при обращении к моему серверу на HTTP порт сокет будет выглядеть так: 194.106.118.30:80, а ответ будет поступать на mmm.nnn.ppp.qqq:xxx <br><br>

сокет в переводе с англ. — розетка

это такие специальные слоты (гнёзда) для процессоров (обозвали покруче вот и вся фишка) (e каждого сокета своя частота FSB)<br>у pentium3 был сокет …ээээ….триста какойто там….<br>у pentium 4 был сокет сначала 478 (FSB 533Mhz и 800 Mhz)<br>у AMD был сокет тож 300 какой — то там (FSB 233 Mhz 333Mhz) (он же сокет А skt-a)<br>щас у пеньков сокет LGA-775 (FSB 800 и 1000 Mhz)<br>а у АМД щас сокеты 754 (FSB 400Mhz), 939(FSB 433 и 400 Mhz), а новый обозвали АМ-2 (FSB аж 800 Mhz)

Сокет (программный интерфейс) — это… Что такое Сокет (программный интерфейс)?

У этого термина существуют и другие значения, см. Сокет.

Со́кеты (англ. socket — углубление, гнездо, разъём) — название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения.

Следует различать клиентские и серверные сокеты. Клиентские сокеты грубо можно сравнить с оконечными аппаратами телефонной сети, а серверные — с коммутаторами. Клиентское приложение (например, браузер) использует только клиентские сокеты, а серверное (например, веб-сервер, которому браузер посылает запросы) — как клиентские, так и серверные сокеты.

Интерфейс сокетов впервые появился в BSD Unix. Программный интерфейс сокетов описан в стандарте POSIX.1 и в той или иной мере поддерживается всеми современными операционными системами.

Принципы сокетов

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

Каждый сокет имеет свой адрес. ОС семейства UNIX могут поддерживать много типов адресов, но обязательными являются INET-адрес и UNIX-адрес. Если привязать сокет к UNIX-адресу, то будет создан специальный файл (файл сокета) по заданному пути, через который смогут сообщаться любые локальные процессы путём чтения/записи из него (см. Доменный сокет Unix). Сокеты типа INET доступны из сети и требуют выделения номера порта.

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

См. также

Leave a comment