межпроцессное взаимодействие на локальной машине с использованием сокетов в Perl и C # - PullRequest
1 голос
/ 17 декабря 2009

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

Мне было интересно, есть ли способ использовать интерфейс сокетов, чтобы позволить perl-программе общаться с c # приложением. Если используется сокет, адрес должен быть локальным: 127.0.0.1? Как выбрать какой номер порта использовать?

также

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

Спасибо.

Ответы [ 4 ]

4 голосов
/ 17 декабря 2009

Используйте модуль 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.

3 голосов
/ 17 декабря 2009

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

0 голосов
/ 18 декабря 2009

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

0 голосов
/ 17 декабря 2009

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

- Изменить:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...