Подтвердить что ты не робот

Какая разница между трубами и сокетами?

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

4b9b3361

Ответ 1

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

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

  • существуют только в пределах определенного хоста, и они относятся к буферизации между виртуальными файлами или подключению вывода/ввода процессов внутри этого хоста. Внутри труб нет понятий пакетов.
  • сокеты пакетируют связь с использованием IPv4 или IPv6; эта связь может выходить за пределы локального хоста. Обратите внимание, что разные конечные точки сокета могут совместно использовать один и тот же IP-адрес; однако для этого они должны прослушивать разные порты TCP/UDP.

Использование:

  • Использовать трубы:
    • когда вы хотите читать/записывать данные в виде файла на определенном сервере. Если вы используете C, вы read() и write() в трубе.
    • когда вы хотите подключить вывод одного процесса к вводу другого процесса... см. popen()
  • Используйте сокеты для отправки данных между различными конечными точками IPv4/IPv6. Очень часто это происходит между разными хостами, но сокеты могут использоваться внутри одного и того же хоста.

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

Ответ 2

Чтобы выполнить ответ, данный Майком, важно упомянуть о существовании сокетов домена UNIX, доступных в любой совместимой с POSIX операционной системе. Хотя они очень похожи на "обычные" интернет-сокеты с точки зрения семантики использования, они являются чисто локальными для машины (конечно, интернет-сокеты также работают локально) и, таким образом, почти ведут себя как труба. Почти потому, что UNIX-канал по определению является однонаправленным:

Трубы и FIFO (также известные как именованные каналы) обеспечивают однонаправленную межпроцессный канал связи. Труба имеет конец считывания и запись конец. Данные, записанные на конец записи трубы, могут быть считаны из прочитанного конец трубы. (выдержка из man page pipe (7))

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