Независимая от ОС межпрограммная связь между Python и C - PullRequest
6 голосов
/ 09 июня 2010

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

Он будет писать в основном на C, моя основная часть будет на Python, и я вижу несколько вариантов:

  • Альтернативная запись во временный файл или в последующие временные файлы. Поскольку общение не будет в какой-то степени громоздким, это может сработать, но мне кажется, что это уродливый обходной путь, программы должны будут постоянно проверять наличие изменений / новых файлов, это просто уродливо.
  • Найдите способ манипулирования трубами, т.е. mine.py | ./его . Это похоже на тупик.
  • Используйте розетки. Но я не знаю, что я буду делать, так может кто-нибудь дать мне указатель на какой-нибудь материал для чтения? Я не уверен, есть ли независимые от ОС, независимые от языка методы. Должна ли быть какая-нибудь программа сервера-супервизора для администрирования?
  • Используйте какой-то протокол HTML, который выглядит как перебор. Я не против, чтобы программы запускались на одной машине.

Что люди рекомендуют и с чего начать чтение?

Ответы [ 5 ]

7 голосов
/ 09 июня 2010

Если вы хотите и нуждаетесь в действительно независимой от ОС, не зависящей от языка межпроцессной коммуникации, сокеты, вероятно, являются лучшим вариантом.

Это также позволит двум программам взаимодействовать между компьютерами (без изменения кода).

Для чтения материала, вот Как программировать на языке Python Socket .

3 голосов
/ 09 июня 2010

Две возможности:

  • Используйте IP-сокеты.В документации по Python есть некоторые примеры .(На самом деле это не так сложно, если вы просто используете базовые функции чтения / записи.) С другой стороны, сокеты в C обычно не так просты в использовании.

  • Создайте третье приложение.Он запускает оба приложения, используя подпроцесс , и связывается с обоими приложениями по каналам.Шахматные приложения должны иметь возможность только читать / писать в stdin / stdout.

    Это дает дополнительное преимущество, которое это приложение может проверить, если ход является законным.Это поможет вам найти ошибки и сохранить честность игры.

2 голосов
/ 09 июня 2010

Вы можете использовать Protobuf в качестве межпрограммного протокола и читать / записывать из файла каждый поворот.

Вы можете читать промежуточный файл каждые n секунд.

Как только у вас это заработает, вы можете перейти к использованию сокетов, где каждая программа будет запускать сервер и ожидать подключения.

Изменение должно быть небольшим, потому что протокол уже будет готов. Таким образом, единственное место, которое вы должны изменить, это где вы либо читаете из сокета, либо из файла.

В любом случае вам понадобится протокол обмена.

редактировать

Упс, я неправильно прочитал и подумал, что это C ++.

В любом случае, вот поддержка C для protobuf, но работа над ней все еще продолжается

http://code.google.com/p/protobuf-c/

0 голосов
/ 23 июня 2010

Сокеты с моделью клиент / сервер ...

Обычно вы и ваш друг создаете различные реализации клиента.

Локальный клиент показываетвизуальное представление игры и сохраняет состояние фигур (положение, убито / не убито) и правила о том, что фигурки могут / не могут делать (какие ходы можно делать с какими фигурками и находится ли состояние доски вcheck).

Удаленный сервер хранит информацию об игроках (чья очередь, набранные очки, независимо от того, выиграна игра или нет) и список выполненных ходов.

Когда вы делаете ход, ваш клиент проверяет ход в соответствии с правилами игры, а затем отправляет на сервер сообщение, что я сделал этот ход, ваш ход.

Другой клиент видит, что ход выполнен, извлекает последний ход с сервера, вычисляет, произошло ли это движение, проверяет ли это движение на соответствие правилам игры и воспроизводит действие локально.После того, как это все сделано, теперь он позволяет пользователю делать следующий ход (или нет, если игра окончена).

Самая важная часть взаимодействия клиент / сервер в играх - отправлять как можно меньше данных и хранитькак можно меньше состояния на сервере.Таким образом, вы можете играть в нее локально или по всему миру практически без задержки.Пока ваш клиент работает по тому же набору правил, что и клиент вашего оппонента, все должно работать.

Если вы хотите гарантировать, что никто не сможет обмануть, взломав их версию клиента, вы можете занять позициюи все правила вычислений выполняются на сервере и просто делают клиентов не более чем простыми механизмами воспроизведения.

Причина, по которой сокеты являются наилучшей средой связи:

  • ограничения на кроссобмен данными между процессами почти так же сложен, как и обмен данными между узлами
  • широко поддерживается во всех системах во всех системах
  • при использовании удаленного доступа при использовании

Это одна из причин, по которой многие крупные системы, такие как базы данных, используют сокеты в качестве сетевой, а также локальной коммуникационной среды.

0 голосов
/ 09 июня 2010

Я бы сказал, просто напишите xml-файл, который содержит ходы для черного и белого. Отметьте в отдельном файле, кто его включил, и убедитесь, что только программа, в которую он включен, будет писать в этот файл, чтобы зафиксировать свою очередь.

Вот ссылка на предложенный формат xml для хранения ваших ходов, предложенных другой группой. http://www.xml.com/pub/a/2004/08/25/tourist.html

...