C# 在perl和c中使用socket在本地机器上进行进程间通信

C# 在perl和c中使用socket在本地机器上进行进程间通信,c#,perl,sockets,process,C#,Perl,Sockets,Process,我正在开发一个c应用程序,它产生了新的进程来运行Perl程序: 我想知道是否有一种方法可以使用套接字接口让perl程序与c应用程序对话。如果使用套接字,地址必须是本地主机:127.0.0.1?如何选择 使用哪个端口号 而且 由于C应用程序生成一个进程来运行Perl程序,有没有一种方法可以使用 用c实现进程间通信来完成这项任务?我的意思是,也许这个过程 运行perl可以向c应用程序发送消息吗 谢谢。您最好的选择是插座。您可以选择任何未使用且大于1024的端口。但您可能需要查看一个列表,以确保您的选

我正在开发一个c应用程序,它产生了新的进程来运行Perl程序:

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

而且

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


谢谢。

您最好的选择是插座。您可以选择任何未使用且大于1024的端口。但您可能需要查看一个列表,以确保您的选择不会与您环境中的程序冲突

-编辑:


link似乎建议端口号在49152以上。哇,时代变了:

你最好的选择是插座。您可以选择任何未使用且大于1024的端口。但您可能需要查看一个列表,以确保您的选择不会与您环境中的程序冲突

-编辑:


link似乎建议端口号在49152以上。哇,时代变了:

您可以在.NET端尝试命名管道System.IO.pipes,在Perl端尝试Win32::Pipe

您可以在.NET端尝试命名管道System.IO.pipes,在Perl端尝试Win32::Pipe

使用该模块

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

$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连接到本地主机上的8080端口

端口的选择大多是随意的。双方需要就会合端口达成一致,并且您希望避免1024以下的端口。连接到localhost还是其他地址取决于服务器绑定到的地址。要绑定到网络可访问地址,请修改上述代码以使用

$lsn = new IO::Socket::INET(Listen => 1, LocalAddr => "host.example.com:8080");
大小为1的Listen参数的积压是不寻常的。典型的大小是sys/socket.h中的SOMAXCONN值。

使用该模块

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

$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连接到本地主机上的8080端口

端口的选择大多是随意的。双方需要就会合端口达成一致,并且您希望避免1024以下的端口。连接到localhost还是其他地址取决于服务器绑定到的地址。要绑定到网络可访问地址,请修改上述代码以使用

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

大小为1的Listen参数的积压是不寻常的。典型的大小是sys/socket.h中SOMAXCONN的值。

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

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

我正在为命名管道进行根操作。我正在为命名管道进行根操作。通常,我让操作系统为服务器进程分配一个随机的开放端口。然后我将端口作为命令行参数传递给客户端。您能告诉我如何让操作系统分配一个随机端口吗?IPendPoint需要端口号。以及如何获得分配给进程的随机端口号。谢谢。我的进程都是用Perl编写的,但我使用IO::Socket::INET库,只是不指定端口。然后我从对象请求端口。这相当于使用端口设置为0的绑定系统调用。我不确定如何从C.MSDN访问它。它表明,如果创建端口号设置为0的IPEndPoint对象,您将获得自动分配:通常,我让操作系统为服务器进程分配一个随机的开放端口。然后我将端口作为命令行参数传递给客户端。您能告诉我如何让操作系统分配一个随机端口吗?IPendPoint需要端口号。以及如何获得分配给进程的随机端口号。谢谢。我的进程都是用Perl编写的,但我使用IO::Socket::INET库,只是不指定端口。然后我从对象请求端口。这相当于使用端口设置为0的绑定系统调用。我不确定您是如何从C.MSDN访问它的。它表明,如果您创建一个端口号设置为0的IPEndPoint对象,您将获得自动分配:您是正确的。但我用的是s
t出于日志记录目的退出perl脚本。我可以在标准输出上进行字符串搜索,只是我不习惯在字符串中搜索结果。谢谢,你说得对。但是我使用perl脚本的stdout来记录日志。我可以在标准输出上进行字符串搜索,只是我不习惯在字符串中搜索结果。谢谢