我正在开发一个c#应用程序,它生成新的进程以运行Perl程序:
我想知道是否有办法使用套接字接口让perl程序与c#应用程序通信。如果使用套接字,则地址必须是本地主机:127.0.0.1?如何选择 要使用哪个端口号?
也
由于C#应用程序产生一个Process来运行Perl程序,有没有办法使用 c#中的进程间通信来完成这个任务?我的意思是也许这个过程 运行perl可以向c#appilication发送消息吗?
感谢。
答案 0 :(得分:4)
使用IO::Socket::INET模块。
您可以连接到localhost上的端口
$sock = IO::Socket::INET->new('127.0.0.1:2525');
或其他地址
$sock = IO::Socket::INET->new("host.example.com:6789");
这些示例假设Perl程序将是客户端,并且您已使用C#编写服务器。如果是相反的方法,请使用IO :: Select模块。以下是其文档中的示例:
use IO::Select;
use IO::Socket;
$lsn = new IO::Socket::INET(Listen => 1, LocalPort => 8080);
$sel = new IO::Select( $lsn );
while (@ready = $sel->can_read) {
foreach $fh (@ready) {
if ($fh == $lsn) {
# Create a new socket
$new = $lsn->accept;
$sel->add($new);
}
else {
# Process socket
# Maybe we have finished with the socket
$sel->remove($fh);
$fh->close;
}
}
}
使用此代码,您将从C#连接到localhost上的端口8080。
港口的选择大多是任意的。双方需要就集合端口达成一致,并且您希望避免1024以下的端口。无论是连接到localhost还是其他地址都取决于服务器绑定的地址。要绑定到网络可访问的地址,请修改上面的代码以使用
$lsn = new IO::Socket::INET(Listen => 1, LocalAddr => "host.example.com:8080");
大小为1的积压(Listen
参数)不常见。典型尺寸是SOMAXCONN
的{{1}}值。
答案 1 :(得分:3)
您可以尝试命名管道(.NET端的System.IO.Pipes,Perl端的Win32 :: Pipe)。
答案 2 :(得分:0)
您最好的选择是套接字。您可以选择任何未使用的端口,并且大于1024.但您可能希望查看common port assignments列表,以确保不会选择与环境中的程序冲突。
- 编辑:
似乎链接建议高于49152的端口号。哇,时间改变:))
答案 3 :(得分:0)
您可以在没有套接字和管道的情况下进行管理:在C#中,您为生成的进程(example)重定向标准输入和输出,然后编写从STDIN接收数据并将结果发送到STDOUT的perl脚本。 / p>