在 Perl、套接字或命名管道 (fifos) 中啥更便携?

Posted

技术标签:

【中文标题】在 Perl、套接字或命名管道 (fifos) 中啥更便携?【英文标题】:Whats more portable in Perl, sockets or named pipes (fifos)?在 Perl、套接字或命名管道 (fifos) 中什么更便携? 【发布时间】:2011-03-30 11:28:18 【问题描述】:

我正在编写一些 Perl 代码。我希望它在 Windows 和 Linux/UNIX/OSX 上运行。到目前为止,它适用于 *NIX 并使用 fifos。

我正在考虑切换到套接字以避免 POSIX::mkfifo() 在 Windows 上不起作用的问题,所以我需要编写一些单独的代码来使用 Win32::Pipe。

我对整件事感到矛盾。在我看来,这两个修复都需要大约相同数量的工作。切换到插座是个好主意吗?

【问题讨论】:

【参考方案1】:

简短回答: IO::Socket::INET 可以在 Windows 和 *NIX 上运行。

命名管道

更容易快速编码。您不需要编写连接代码。 稍微快一点。套接字具有 TCP 和建立初始连接的开销。 适用于所有平台。 即使网卡不存在也能正常工作。一些笔记本电脑会关闭网卡以节省电量,这甚至会阻止本地插​​座工作。

套接字

适用于所有平台。但是,有些笔记本电脑会为了省电而关闭网卡,如果没有网络接口,甚至本地插座也无法工作。 在 Perl 中更便携。 IO::Socket::INET 可在 *NIX 和 Windows 上运行。 允许您与每个客户进行单独的对话。 防火墙不是问题。超过 1024 的端口应该可以工作。

就个人而言,我决定改用插座。在我的应用程序中,这并不重要。但我认为它使代码更简单一些,让我将来可以灵活地移动到 > 1 个客户端,而且我还是想学习 IO::Socket。

【讨论】:

【参考方案2】:

更笼统地回答(即,它不是 perl 特定的):

在 windows 和世界其他地方做这种事情几乎总是需要单独的 windows 和其他东西的代码。几乎所有其他东西都有很好的解决方案,比如 unix 文件套接字或 fifo 或......然后在 Windows 上你必须回退到套接字。

恕我直言,正确的做法是在不是网络套接字的窗口上使用正确的解决方案,因为这会使应用程序面临安全问题。因此,在其他一切“正确执行”但在 Windows 上,改为使用网络套接字之类的东西。 但是,请确保如果您采用网络套接字路由,您至少应该只使用本地套接字(即绑定到 127.0.0.1)。

对于 perl,我很想在 CPAN 中寻找一个已经使其通用的类。但是……如果什么都不存在,我不会感到惊讶。

【讨论】:

【参考方案3】:

LWP::socket 在 Windows 和 *NIX 中运行良好。如果您选择通过 fifos 的套接字,那么您最终将能够与 Windows 和 *NIX 进程通信。也许你今天不需要它,但谁知道呢。

【讨论】:

感谢您的回复。仅供参考,我在 POD 中看到一条注释,上面写着“新代码不应使用此模块。IO::Socket::INET 模块为 OO Internet 套接字提供标准 Perl 接口。现在甚至 LWP 也被重写为使用 IO::Socket ::INET 贯穿始终。” 感谢您的关注。事实上,我确实在 linux 上使用 IO::Socket::INET,但从未在 Windows 上测试过。这就是为什么我没有建议它(尽管我认为它必须有效)。 我在 Windows 上使用过 IO::Socket::INET,它确实有效。我没有任何问题。【参考方案4】:

IIRC,Perl 的更高版本在 Windows 上有一个有效的套接字对。

【讨论】:

以上是关于在 Perl、套接字或命名管道 (fifos) 中啥更便携?的主要内容,如果未能解决你的问题,请参考以下文章

什么时候应该使用 fifo 文件/命名管道?

使用 php 中的名称管道

检测阅读器何时关闭命名管道(FIFO)

ZeroMQ 和本地 FIFO

当阅读器断开连接时,命名管道 (FIFO) 数据会去哪里?

进程间通信——命名管道