在 Perl 中,套接字和命名管道 (fifos) 哪个更可移植?
我正在写一些 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
简短回答: IO::Socket::INET 在 Windows 和 *NIX 上都可以工作。
命名管道
套接字
就我个人而言,我决定改用套接字。在我的应用程序中,这并不重要。但我认为它使代码变得更简单,让我可以灵活地转到 >将来有1个客户端,无论如何我想学习IO::Socket。
Short answer: IO::Socket::INET works on both Windows and *NIX.
Named Pipes
Sockets
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.
更笼统地回答(即,它不是特定于 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.
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.
IIRC,更高版本的 Perl 在 Windows 上有一个工作套接字对。
IIRC, later versions of Perl have a working socketpair on Windows.