2009-12-17 5 views
1

Я работаю на C# приложение, которое плодить новые процессы для запуска программ на Perl:межпроцессного взаимодействия на локальном компьютере, используя сокет в PERL и C#

мне было интересно, если есть способ использовать интерфейс сокетов, чтобы perl, чтобы поговорить с приложением C#. При использовании сокета адрес должен быть локальным хостом: 127.0.0.1? Как выбрать какой номер порта использовать?

также,

Поскольку применение C# порождать процесс для запуска программы Perl, есть ли способ использовать межпроцессного взаимодействия в C# для достижения этой задачи? Я имею в виду, может быть, процесс, который является запуском perl, может отправить сообщение в C# appilication?

Спасибо.

ответ

4

Используйте модуль 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. Независимо от того, подключаетесь ли вы к локальному хосту или другому адресу, определяется адрес, к которому привязан сервер. Для привязки к сети доступный адрес, изменить приведенный выше код для использования

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

Отставание размер 1 (параметр Listen) является необычным. Типичным размером является значение SOMAXCONN от sys/socket.h.

0

Ваш лучший вариант - это сокет. Вы можете выбрать любой порт, который не используется, и находится выше 1024. Но вы можете просмотреть список common port assignments, чтобы убедиться, что вы не выбрали конфликт с программой, имеющейся в вашей среде.

- Edit:

кажется, что ссылка советует номера портов выше 49152. Вау, времена меняются :)

+0

Как правило, я позволяю ОС назначать случайный открытый порт для процесса сервера. Затем я передаю порт клиенту в качестве аргумента командной строки. – daotoad

+0

Можете ли вы рассказать мне, как позволить OS назначить случайный порт? IPendPoint требует номер порта.И как я могу получить номер случайного порта, назначенный моему процессу. Благодарю. – user195678

+0

Ну, мои процессы написаны на Perl повсюду, но я использую библиотеку IO :: Socket :: INET и просто не указываю порт. Затем я запрашиваю порт из объекта. Это означает использование вызова 'bind' sytem с портом, установленным в 0. Я не уверен, как вы получаете доступ к этому из C#. – daotoad

3

Вы можете попробовать именованные каналы (System.IO.Pipes на стороне .NET, Win32 :: Труба со стороны Perl).

+0

Я болею за именованные трубы – Salamander2007

+0

Спасибо за помощь. – user195678

0

Вы можете управлять без сокетов и труб: в C# вы перенаправляете стандартный ввод и вывод для порожденного процесса (example), а затем вы должны писать perl-скрипт, который получает данные от STDIN и отправляет результат в STDOUT.

+0

Вы правы. Но я использую stdout perl-скрипта для целей ведения журнала. Я могу выполнять строковый поиск на stdout, мне просто не удобно искать в строке, чтобы найти результат. Спасибо. – user195678

Смежные вопросы