在 Perl 中,套接字和命名管道 (fifos) 哪个更可移植?

发布于 2024-10-28 04:58:05 字数 229 浏览 3 评论 0原文

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

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

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

I'm writing some Perl code. I want it to run on Windows and Linux/UNIX/OSX. So far it works on *NIX and uses fifos.

I am considering switching to sockets to avoid the problem that POSIX::mkfifo() doesn't work on Windows, so I need to write some separate code to use Win32::Pipe.

I'm feeling ambivalent about the whole thing. It seems to me both fixes require about the same amount of work. Is it a good idea to switch to sockets?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

苏大泽ㄣ 2024-11-04 04:58:05

简短回答: IO::Socket::INET 在 Windows 和 *NIX 上都可以工作。

命名管道

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

套接字

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

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

Short answer: IO::Socket::INET works on both Windows and *NIX.

Named Pipes

  • Slightly easier to code up quickly. You don't need write connect code.
  • Slightly faster. Sockets have the overhead of TCP and setting up the initial connection.
  • Works on all platforms.
  • Works even when network card doesn't exist. Some laptops shut down the network card to save power which can prevent even local sockets from working.

Sockets

  • Works on all platforms. However, some laptops shut down the network card to save power and even local sockets won't work if there is no network interface.
  • More portable in Perl. IO::Socket::INET works on both *NIX and Windows.
  • Allows you to have a separate conversation with each client.
  • Firewalls are not a problem. Ports over 1024 should work.

Personally, I've decided to switch to sockets. In my application it doesn't matter much. But I think it makes the code a bit simpler, gives me the flexibility to move to > 1 client in the future, and I want to learn IO::Socket anyway.

伪装你 2024-11-04 04:58:05

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

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

恕我直言,正确的做法是在不是网络套接字的 Windows 上使用正确的解决方案,因为这会给应用程序带来安全问题。因此,在其他所有事情上“正确执行”,但在 Windows 上,则退回到网络套接字之类的东西。 但是,请确保如果您采用网络套接字路由,您至少应该仅使用本地套接字(即绑定到 127.0.0.1)。

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

Answering more generically (ie, it's not perl specific):

Doing this sort of thing in windows vs the rest of the world almost always requires separate code for windows vs everything-else. Pretty much everything-else has good solutions for things like this, like unix file sockets or fifo's or ... Then on windows you have to fall back to sockets.

The right thing to do, IMHO, is to use the right solution on windows that isn't network sockets because that opens the application up to security issues. So on everything else "do it correctly" but then on windows, fall back to something like network sockets instead. But, make sure if you take the network-socket route you should at least use local sockets only (ie, bound to 127.0.0.1).

For perl, I'd be tempted to look in CPAN for a class that's already made this generic. But... I wouldn't be surprised if nothing exists.

¢好甜 2024-11-04 04:58:05

LWP::socket 在 Windows 和 *NIX 中工作正常。如果您选择套接字而不是 fifo,那么您最终将能够与 Windows 和 *NIX 进程进行通信。也许你今天不需要它,但谁知道呢。

LWP::socket works fine in Windows and *NIX. If you opt for sockets over fifos, then you eventually would be able to communicate Windows and *NIX processes. May be you don't need it today, but who knows.

幸福丶如此 2024-11-04 04:58:05

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

IIRC, later versions of Perl have a working socketpair on Windows.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文