在Perl,套接字或命名管道(fifos)中哪些更便携?

时间:2011-03-30 11:28:19

标签: perl sockets portability named-pipes

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

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

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

4 个答案:

答案 0 :(得分:3)

简答: IO :: Socket :: INET适用于Windows和* NIX。

命名管道

  • 稍微快速编码就好了。您不需要编写连接代码。
  • 稍快一些。套接字具有TCP的开销并设置初始连接。
  • 适用于所有平台。
  • 即使网卡不存在也能正常工作。有些笔记本电脑关闭网卡以节省电力,甚至可以阻止本地插​​座工作。

套接字

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

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

答案 1 :(得分:2)

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

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

正确的做法,恕我直言,是在不是网络套接字的Windows上使用正确的解决方案,因为这会打开应用程序以解决安全问题。所以在其他一切“正确地做”但然后在Windows上,回到类似网络套接字的东西。 但是,请确保如果采用网络套接字路由,至少应该使用本地套接字(即绑定到127.0.0.1)。

对于perl,我很想在CPAN中寻找已经成为通用的类。但是......如果不存在,我不会感到惊讶。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

IIRC,更高版本的Perl在Windows上有一个可用的socketpair。