Что более переносимо в Perl, сокеты или именованные каналы (fifos)?

Я пишу код на Perl. Я хочу, чтобы он работал на Windows и Linux/UNIX/OSX. Пока он работает на *NIX и использует fifos.

Я рассматриваю возможность перехода на сокеты, чтобы избежать проблемы, связанной с тем, что POSIX::mkfifo() не работает в Windows, поэтому мне нужно написать отдельный код для использования Win32::Pipe.

Я чувствую двойственное отношение ко всему этому. Мне кажется, что оба исправления требуют примерно одинакового объема работы. Стоит ли переходить на сокеты?


person Eric Johnson    schedule 30.03.2011    source источник


Ответы (4)


Короткий ответ: IO::Socket::INET работает как в Windows, так и в *NIX.

Именованные каналы

  • Немного проще кодировать быстро. Вам не нужно писать код подключения.
  • Чуть быстрее. Сокеты имеют накладные расходы на TCP и настройку начального соединения.
  • Работает на всех платформах.
  • Работает даже при отсутствии сетевой карты. Некоторые ноутбуки отключают сетевую карту для экономии энергии, что может помешать работе даже локальных розеток.

Розетки

  • Работает на всех платформах. Однако некоторые ноутбуки отключают сетевую карту для экономии энергии, и даже локальные розетки не будут работать, если нет сетевого интерфейса.
  • Более переносимый в Perl. IO::Socket::INET работает как на *NIX, так и на Windows.
  • Позволяет вести отдельный разговор с каждым клиентом.
  • Брандмауэры не проблема. Порты больше 1024 должны работать.

Лично я решил перейти на сокеты. В моем приложении это не имеет большого значения. Но я думаю, что это делает код немного проще, дает мне гибкость для перехода к > 1 клиенту в будущем, и я все равно хочу изучить IO::Socket.

person Eric Johnson    schedule 31.03.2011

Отвечая на более общий вопрос (т. е. не специфичный для Perl):

Выполнение подобных вещей в Windows по сравнению с остальным миром почти всегда требует отдельного кода для Windows и всего остального. Почти все остальное имеет хорошие решения для таких вещей, как файловые сокеты unix или fifo или ... Затем в окнах вы должны вернуться к сокетам.

ИМХО, правильное решение - использовать правильное решение для окон, которые не являются сетевыми сокетами, потому что это открывает приложение для проблем с безопасностью. Так что во всем остальном «сделайте это правильно», но затем в Windows вместо этого вернитесь к чему-то вроде сетевых сокетов. Но убедитесь, что если вы выбираете маршрут через сетевой сокет, вы должны, по крайней мере, использовать только локальные сокеты (т. е. привязанные к 127.0.0.1).

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

person Wes Hardaker    schedule 30.03.2011

LWP::socket отлично работает в Windows и *NIX. Если вы выберете сокеты, а не fifos, то в конечном итоге вы сможете взаимодействовать с процессами Windows и *NIX. Может быть, вам это и не нужно сегодня, но кто знает.

person Francisco R    schedule 30.03.2011
comment
Спасибо за ваш ответ. К вашему сведению, я вижу примечание в POD, в котором говорится, что новый код не должен использовать этот модуль. Модуль IO::Socket::INET предоставляет стандартный интерфейс Perl для объектно-ориентированных интернет-сокетов. Даже LWP теперь полностью переписан для использования IO::Socket::INET. - person Eric Johnson; 30.03.2011
comment
Спасибо, что заметили. На самом деле я использую IO::Socket::INET в Linux, но никогда не тестировал его в Windows. Вот почему я не предложил это (хотя я думаю, что это должно сработать). - person Francisco R; 30.03.2011
comment
Я использовал IO::Socket::INET в Windows, и он работает. У меня не было никаких проблем с этим. - person Joel; 30.03.2011

IIRC, более поздние версии Perl имеют рабочую пару сокетов в Windows.

person salva    schedule 30.03.2011