【问题标题】:inter-process communication on local machine using socket in perl and c#在 perl 和 c# 中使用套接字在本地计算机上进行进程间通信
【发布时间】:2010-12-27 12:07:09
【问题描述】:

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

我想知道是否有一种方法可以使用套接字接口让 perl 程序与 c# 应用程序对话。如果使用套接字,地址必须是本地主机:127.0.0.1?如何选择 使用哪个端口号?

还有,

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

谢谢。

【问题讨论】:

    标签: c# perl sockets process


    【解决方案1】:

    您最好的选择是套接字。您可以选择任何未使用且高于 1024 的端口。但您可能需要查看common port assignments 的列表,以确保您不会选择与您环境中的程序冲突。

    -- 编辑:

    似乎链接建议的端口号高于 49152。哇,时代变了 :)

    【讨论】:

    • 通常,我让操作系统为服务器进程分配一个随机的开放端口。然后我将端口作为命令行参数传递给客户端。
    • 你能告诉我如何让操作系统分配一个随机端口吗? IPendPoint 需要一个端口号。以及如何获得分配给我的进程的随机端口号。谢谢。
    • 好吧,我的进程都是用 Perl 编写的,但我使用 IO::Socket::INET 库,只是没有指定端口。然后我从对象请求端口。这相当于使用 bind 系统调用并将端口设置为 0。我不确定您如何从 C# 访问它。
    • MSDN 显示,如果您创建一个端口号设置为 0 的 IPEndPoint 对象,您将获得自动分配:msdn.microsoft.com/en-us/library/…
    【解决方案2】:

    您可以尝试命名管道(.NET 端的 System.IO.Pipes,Perl 端的 Win32::Pipe)。

    【讨论】:

    • 我支持命名管道
    【解决方案3】:

    使用IO::Socket::INET 模块。

    您可以连接到本地主机上的端口

    $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 的值来自sys/socket.h

    【讨论】:

      【解决方案4】:

      您可以在没有套接字和管道的情况下进行管理:在 C# 中,您将标准输入和输出重定向到衍生进程 (example),然后您将编写从 STDIN 接收数据并将结果发送到 STDOUT 的 perl 脚本。

      【讨论】:

      • 你是对的。但我正在使用 perl 脚本的标准输出来记录日志。我可以在标准输出上进行字符串搜索,只是我不习惯在字符串中搜索以找到结果。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2017-05-20
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2020-12-30
      • 2013-12-26
      • 2017-02-12
      相关资源
      最近更新 更多