[英]inter-process communication on local machine using socket in perl and c#
我正在使用ac#應用程序,該應用程序會生成新的進程來運行Perl程序:
我想知道是否有一種使用套接字接口的方法讓perl程序與c#應用程序通信。 如果使用套接字,則該地址必須是本地主機:127.0.0.1? 如何選擇要使用的端口號?
也,
由於C#應用程序產生了一個進程來運行Perl程序,是否有一種方法可以在c#中使用進程間通信來完成此任務? 我的意思是也許正在運行perl的進程可以向c#應用程序發送消息?
謝謝。
使用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#連接到本地主機上的端口8080。
端口的選擇大部分是任意的。 雙方都需要在集合點端口上達成共識,並且要避免端口低於1024。連接到localhost還是其他地址由服務器綁定的地址確定。 要綁定到網絡可訪問的地址,請修改以上代碼以使用
$lsn = new IO::Socket::INET(Listen => 1, LocalAddr => "host.example.com:8080");
大小為1(“ Listen
參數)的積壓異常。 一個典型的大小是sys/socket.h
中SOMAXCONN
的值。
您可以嘗試命名管道(.NET側為System.IO.Pipes,Perl側為Win32 :: Pipe)。
您可以在沒有套接字和管道的情況下進行管理:在C#中,重定向生成的進程的標准輸入和輸出( 例如 ),然后編寫perl腳本,該腳本從STDIN接收數據並將結果發送到STDOUT。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.