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

use*_*678 1 c# sockets perl process

我正在开发 ac# 应用程序,该应用程序会生成新的进程来运行 Perl 程序:

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

还,

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

谢谢。

Gre*_*con 5

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

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

$sock = IO::Socket::INET->new('127.0.0.1:2525');
Run Code Online (Sandbox Code Playgroud)

或到另一个地址

$sock = IO::Socket::INET->new("host.example.com:6789");
Run Code Online (Sandbox Code Playgroud)

这些示例假设 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此代码,您可以从 C# 连接到本地主机上的端口 8080。

端口的选择大多是任意的。双方需要就集合点的端口达成一致,要避免1024以下的端口。是连接localhost还是其他地址,由服务器绑定的地址决定。要绑定到网络可访问地址,请修改上面的代码以使用

$lsn = new IO::Socket::INET(Listen => 1, LocalAddr => "host.example.com:8080");
Run Code Online (Sandbox Code Playgroud)

大小为 1(Listen参数)的积压异常。典型的大小是SOMAXCONNfrom的值sys/socket.h