使用perl和c#中的套接字在本地机器上进行进程间通信

时间:2009-12-17 02:07:12

标签: c# perl sockets process

我正在开发一个c#应用程序,它生成新的进程以运行Perl程序:

我想知道是否有办法使用套接字接口让perl程序与c#应用程序通信。如果使用套接字,则地址必须是本地主机:127.0.0.1?如何选择 要使用哪个端口号?

由于C#应用程序产生一个Process来运行Perl程序,有没有办法使用 c#中的进程间通信来完成这个任务?我的意思是也许这个过程 运行perl可以向c#appilication发送消息吗?

感谢。

4 个答案:

答案 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>