GUI laten communiceren met C-applicatie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 17-09 18:39

Matis

Rubber Rocket

Topicstarter
Beste PRGers,

Op de zaak hebben wij een videoserver, welke geschikt is voor het uitspelen van ruwe HD-video op 1,5Gb/s. De server is een Dell PowerEdge en er zitten 4 keer 160GB SAS-schijven in RAID1 in om (ook voor de toekomst) genoeg snelheid te kunnen leveren om de video continu uit te kunnen blijven spelen.
Dit werkt allemaal prima. Om de SDI-video uit te kunnen spellen hebben we bij DeltaCast een PCI-e insteekkaart aangeschaft. DeltaCast levert een SDK (in C) aan om tegenaan te programmeren en zo dus video uit te kunnen spelen op relatief hoge snelheden.
De applicatie zelf is ook in C geprogrammeerd (zowel door mij als door een aantal collega's). Deze applicatie draait op Ubuntu 10.04 64bits en werkt naar behoren. Er kan zowel opgenomen worden als uitgespeeld. Dit op verschillende bandbreedtes en op verschillende refreshrates.

Momenteel kunnen een select aantal mensen inloggen op de server middels SSH om zo via de terminal de applicatie te starten. Dit werkt prachtig en op deze manier kan er ook maar één gebruiker tegelijkertijd ingelogd zijn op de machine.

We hebben op de zaak ook een aantal mensen met een aversie voor consoles/terminals en zij hebben aangegeven een GUI te willen voor de videoserver. Onze manager leek dat ook een goed idee, dus heb ik de taak op me genomen om een dergelijke GUI in elkaar te zetten.

Het leek me het eenvoudigste om de GUI in een website te gieten en gebruikers dus op de webserver van de videoserver te laten inloggen en zo via een aantal knoppen de machine te besturen. Echter loop ik nu al tegen een aantal problemen op.
Allereerst is het vrij lastig om vanuit PHP te communiceren met een (draaiend) proces op de videoserver. Daarnaast is de communicatie tussen PHP en de C-applicatie ook niet te doen, want de STD_OUT kan niet worden ingelezen en je bent op een bepaald moment ook de sessie kwijt.
Daarnaast is het lastig om te controleren hoeveel mensen nu daadwerkelijk op de server ingelogd zijn. Ook asynchroon is het erg lastig om te werken in PHP. Ik ben begonnen met een stukje Ajax icm PHP op de webserver, maar dat lijkt een gebed zonder einde. Dit omdat de PHP-deamon met een groot aantal restricties draait, zodat hij niet bij de userspace kan komen.

Ik ben dus op zoek gegaan naar een mogelijke oplossing om een GUI te realiseren om de C-applicatie heen.
Een aantal manieren om een GUI te laten communiceren met de C-applicatie zijn:
  • Laat PHP XML-bestanden genereren, welke de C-applicatie op zijn beurt weer inleest om aan de hand van de instructies in het XML-bestand acties te ondernemen.
  • Een Java GUI-applicatie (cross-platform) met een SSH-verbinding naar de videoserver. Dan kan er telkens maar één persoon inloggen op de server (die SSH-restrictie) en hoeft er niet al te veel te veranderen in de C-applicatie. Daarnaast draait de GUI dan ook op een gebruikersniveau (net zoals de C-applicatie) en is dat probleem weggenomen.
  • Maak een Java-applet op de videoserver, dan is de software altijd up-to-date en kan verder op dezelfde manier als bovenstaand werken.
Nu zullen er nog legio mogelijkheden zijn om zo'n GUI te laten communiceren met een webserver, maar ik ken ze natuurlijk niet allemaal.

Wat ik graag van jullie wil weten is hoe jullie zo'n taak zouden oplossen. Welke vorm van GUI en onderliggende communicatie naar de C-applicatie kan hier het beste / handigste gebruikt worden?

Momenteel is het alleen mogelijk om met de C-applicatie te babbelen middels de commandline-parameters tijdens het opstarten en de STD_IN via de terminal. Ikzelf voel er (nog) niet heel veel voor om een server/host-interface toe te voegen aan de C-applicatie, maar het kan (indien jullie dit aangeven) wel meegenomen worden in de keuzes die ik/we hebben.

Zijn er misschien ook (PHP) Frameworks die een groot gedeelte van deze problematiek voor hun rekening nemen?

Alvast bedankt,

Matis

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

Verwijderd

Is het een idee om een simpel proces te hebben draaien dat luistert op een Unix socket en dat simpelweg alle I/O van de stdin/stdout van de webapplicatie napapegaait?

Simpel genoeg, en makkelijk om tegenaan te praten vanuit PHP.

Acties:
  • 0 Henk 'm!

  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Er is inderdaad wel wat voor te zeggen om de bestaande app in de stdio sfeer te houden en er een proxy-proces tussen te hangen. KISS.

Anders is het een beetje afhankelijk van de hoeveelheid informatie die je wilt uitwisselen:
• Moeten dat hele datastructuren zijn? Thrift.
• Kan het in de vorm van berichtjes? dbus
• Kan het met simpele bytebuffers of het oude doch bewezen System-V? shmop en meer

This can no longer be ignored.


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 17-09 18:39

Matis

Rubber Rocket

Topicstarter
Verwijderd schreef op zondag 09 januari 2011 @ 16:51:
Is het een idee om een simpel proces te hebben draaien dat luistert op een Unix socket en dat simpelweg alle I/O van de stdin/stdout van de webapplicatie napapegaait?

Simpel genoeg, en makkelijk om tegenaan te praten vanuit PHP.
Dat is op zich geen slecht idee :)

Bijkomende uitdaging is ook (en dat ben ik vergeten te vermelden in de TS), dat er ook interactie met het filesystem is. Zo moeten er ook folders aangemaakt kunnen worden en bestanden gemaakt, aangepast of verwijderd worden.
Een nadeel van jouw oplossing, is dat ik dan ook nog steeds geen idee heb hoeveel mensen er daadwerkelijk op de server zitten.
Erik Jan schreef op zondag 09 januari 2011 @ 17:36:
Er is inderdaad wel wat voor te zeggen om de bestaande app in de stdio sfeer te houden en er een proxy-proces tussen te hangen. KISS.

Anders is het een beetje afhankelijk van de hoeveelheid informatie die je wilt uitwisselen:
• Moeten dat hele datastructuren zijn? Thrift.
• Kan het in de vorm van berichtjes? dbus
• Kan het met simpele bytebuffers of het oude doch bewezen System-V? shmop en meer
Bedankt voor de frameworks. Het hoeven geen complete datastructuren te zijn. Simpele bytebuffers zouden al voldoende moeten zijn.
Daarnaast moet er (zoals ik hierboven ook al beschreef) ook nog wat interactie met het filesystem zijn. Maar dat is momenteel nog niet heel erg spannend.

[ Voor 70% gewijzigd door Matis op 09-01-2011 17:44 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Matis schreef op zondag 09 januari 2011 @ 17:38:
Daarnaast moet er (zoals ik hierboven ook al beschreef) ook nog wat interactie met het filesystem zijn. Maar dat is momenteel nog niet heel erg spannend.
PHP is ook erg goed in simpele filesystem operaties. Of wil je dat via de daemon (in C) gaan ontsluiten vanwege de restricties waarmee PHP draait?

This can no longer be ignored.


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 17-09 18:39

Matis

Rubber Rocket

Topicstarter
Erik Jan schreef op zondag 09 januari 2011 @ 17:54:
PHP is ook erg goed in simpele filesystem operaties. Of wil je dat via de daemon (in C) gaan ontsluiten vanwege de restricties waarmee PHP draait?
Ik weet dat PHP de mogelijkheden daartoe heeft. Alleen zijn de videobestanden waar ik over praat zo rond de 100GB per stuk. Wat ik momenteel deed was een bash-bestandje genereren in PHP en dan vanuit PHP dat bash-bestandje uitvoeren met de credentials van de gebruiker.

Echter heb ik op dat moment geen idee meer hoever de applicatie is met de kopieeractie. Om die reden zou ik ook graag op een asynchrone manier willen communiceren met filesystem-operaties.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 19-08 14:24

ZaZ

Tweakers abonnee

Geen idee of je met PHP deze dingen kunt aanspreken maar hier een aantal dingen hoe ik het in het verleden heb gedaan.
-memory mapped file met mutex (of semaphore als de situatie daar beter voor is)
-named pipes (kan ook via netwerk, dus applicatie op computer x en client op computer y)
-mailslots

Ga maar eens zoeken op MSDN naar Inter Process Communications. Je hoeft echt niet via stdin/out te communiceren en files wegschrijven/inlezen is ranzig en moet je dan sowieso gaan guarden en kom je al snel weer op mutexes enzo uit.
Kan natuurlijk ook via sockets communiceren ,maar zelf ben ik daar geen fan van.

[ Voor 13% gewijzigd door ZaZ op 10-01-2011 00:10 ]

Lekker op de bank


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 17-09 18:39

Matis

Rubber Rocket

Topicstarter
ZaZ schreef op maandag 10 januari 2011 @ 00:06:
Geen idee of je met PHP deze dingen kunt aanspreken maar hier een aantal dingen hoe ik het in het verleden heb gedaan.
-memory mapped file met mutex (of semaphore als de situatie daar beter voor is)
-named pipes (kan ook via netwerk, dus applicatie op computer x en client op computer y)
-mailslots
Mailslots gaat hem hoogstwaarschijnlijk niet worden, omdat het OS Ubuntu 10.04 is, maar de andere twee zien er veelbelovend uit.
Ga maar eens zoeken op MSDN naar Inter Process Communications. Je hoeft echt niet via stdin/out te communiceren en files wegschrijven/inlezen is ranzig en moet je dan sowieso gaan guarden en kom je al snel weer op mutexes enzo uit.
Kan natuurlijk ook via sockets communiceren ,maar zelf ben ik daar geen fan van.
Op MSDN zijn eigenlijk alle voorbeelden gericht op Windows (C++) applicaties. Dat gaat hem dus niet worden :P

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 15-09 16:19

alienfruit

the alien you never expected

Matis, een eenvoudige handleiding IPC voor Linux kan je hier vinden:
http://beej.us/guide/bgipc/output/html/singlepage/bgipc.html
Pagina: 1