LINUX.ORG.RU

Правильное использование сокетов

 , , , ,


0

1

Есть 2 процесса, в одном из которых хранится некий список структур с данными, а второй должен получать эти данные от первого и выводить в терминал. После раскуривания мануалов по работе с сокетами для реализации этого всего возникло несколько вопросов, ответ на которые хотелось бы услышать от живых людей.
Что есть более unix-way решением: формировать вывод на стороне первого процесса и передавать в сокет в виде строк, чтобы второму оставалось только прочитать из сокета и вывести то, что получил, либо же передавать сокетом структуры в бинарном виде, а на стороне второго процесса их обрабатывать и потом уже выводить? Либо же оба решения применимы и не будут в итоге торчать костылём? А также, возможно есть какие-то преимущества в датаграммном или потоковом сокетах для данной задачи, либо же оба одинаково эффективно можно использовать, при учёте, что вся передача будет на одном хосте?
Данные, если что, первый процесс должен пересылать после получения команды от второго. Вот.
Буду благодарен за советы касательно этого вопроса.

Всё зависит от задачи. В общем случае разницы нет, ибо текст/бинарь — это всего лишь представление данных. Но если посмотреть на философию UNIX, там рекомендуется использовать текст.


что вся передача будет на одном хосте?

Тогда кто мешает воспользоваться более эффективными механизмами типа шаренной памяти?

XMs ★★★★★ ()
Последнее исправление: XMs (всего исправлений: 1)
Ответ на: комментарий от XMs

Тогда кто мешает воспользоваться более эффективными механизмами типа шаренной памяти?

Зачем тогда по-твоему придумали unix-сокеты, пайпы и прочее?

anonymous ()
Ответ на: комментарий от XMs

Тогда кто мешает воспользоваться более эффективными механизмами типа шаренной памяти?

Если коротко, кривые руки :) Но если так, правильно ли я понимаю, что в данном случае, создав область с произвольным именем, я смогу обращаться к ней с любого процесса? Либо же это будет работать только между родительским-дочерним процессами? В случае заполнения выделенной области, геморно ли её «реалочить» на больший размер? И есть ли для этого что-то подобное мьютексам, либо же это тоже нужно будет реализовывать вручную при необходимости?

Reineke ()

Ну типа по-идее если 2 процесса на одной машине и собраны одним компилятором и с одними и теми же флагами компиляции, то можно слать целые структуры как байты.

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

По-идее для бинарной сериализации/десериализации структур должны быть готовые библиотеки. https://stackoverflow.com/questions/118945/best-c-c-network-library

Bad_ptr ★★★★ ()
Последнее исправление: Bad_ptr (всего исправлений: 3)
Ответ на: комментарий от anonymous

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

XMs ★★★★★ ()
Ответ на: комментарий от Reineke

я смогу обращаться к ней с любого процесса?

Да, если прав хватит.


геморно ли её «реалочить» на больший размер?

ftruncate().


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

А кто мешает расшарить в памяти этот самый мютекс или что-либо ещё, помимо, собственно, данных? Либо отслеживать события через select/poll/epoll/kqueue?

XMs ★★★★★ ()