Komunikacja C z Javą, przekazywanie struktur dynamicznie

0

Mam problem koncepcyjny, z którym za nic w świecie nie mogę sobie poradzić.

Generalnie sprawa wygląda tak, że z jednej strony mam aplikację C, która ładuje sobie różnorakie struktury - tzn takie struktury, których budowy przewidzieć nie mogę. Z drugiej strony mam aplikację Javową, która takowe struktury powinna czytać.

Początkowo oba programy mogą być odpalane na tej samej maszynie - i na razie takim zagadnieniem się zajmuję. I tutaj pytanie: czy ktoś kiedyś się z takim czymś zetknął? Jak to "ugryźć"?
Próbowałem szukać w sieci, lecz znalezione przykłady opierały się raczej na tym, że muszę wiedzieć, jaką strukturę wysyłam do javy.
Czy bawić się w parsowanie i serializację jsona, czy też są może lepsze - tzn łatwiejsze - sposoby?

0

o_O te struktury jakoś znane być muszą, bo Java musi jakoś interpretować kupę bajtów. Jak sobie to inaczej wyobarażasz bez znajomości struktury? Jeśli bardzo musisz to serializuj to do XMLa, wtedy możesz nie znać struktury przesyłanych danych i odczytać ją z tego XMLa.

0

Tzn chodziło mi o to, że JA na początku nie mogę przewidzieć, co poleci do Javy. Oczywiście przed wysłaniem taką strukturę w pamięci już mam.

Generalnie wykrystalizował mi się co najmniej jeden pomysł, ale być może ktoś już coś podobnego robił.

0
  1. Ale co za różnica że ty tą strukturę masz w pamięci, skoro program javowy jej nie zna? To tak jakbym ci teraz napisał, że wysyłam ci "pewną strukturę" w binarnej postaci, ja tą strukturę oczywiście znam, a ty sobie ją jakoś zdekoduj ;]
  2. Jest cała masa technologii middleware które służą do komunikowania programów w różnych językach. Na przykład CORBA, ICE czy Webservices. Ale one zakładają że struktury są znane na etapie kompilacji.

Swoją drogą jestem prawie pewien że twój problem wynika z tego że coś źle zaprojektowałeś ;] Niemniej jednak przesyłanie struktur w postaci XMLa i tak powinno rozwiązać twój problem.

0

Ja tu widzę kilka opcji:

  1. Używasz VLA.
  2. Po stronie C i tak przepychasz po prostu kupę bajtów.
  3. Używasz wektorów, itp, przez co twoje struktury mają stałe rozmiary, oprócz rozmiarów wektorów oczywiście.

Najlepiej pokaż kod opisujący te twoje struktury i jak je budujesz.

6

Some people, when confronted with a problem, think 'I know, I'll use XML.' Now they have two problems.

0

Jeżeli nie XML, czy webservice, to mam jeszcze inny pomysł.

Proponuję zestawić połączenie pomiędzy aplikacjami przez sockety (nieważne, która będzie serwerem, a która klientem). Może być też trzecia aplikacja, która będzie serwerem, a obie Twoje będą klientami, ale takie rozwiązanie będzie miało negatywny wpływ na wydajność.

W obu aplikacjach zaimplementuj własny algorytm serializacji i deserializacji struktur na ciąg bajtowy, w obu aplikacjach musi być identyczny algorytm, czyli taki, że aplikacja Javy zserializuje strukturą, a aplikacja C zdeserializuje do swojej struktury i na odwrót.

Na początku każdego komunikatu powinien być w dwóch bajtach długość całego ciągu, żeby aplikacja odbiorcza wiedziała, ile bajtów wyciągnąć z gniazda, chyba, że wymyślisz taką serializację, że aplikacja odbiorcza wychwyci sama, ile bajtów wyciągnąć, bądź w miarę wyciągania z gniazda będzie wiedzieć, kiedy wyciąga ostatni bajt.

Przy algorytmie serializacji/deserializacji skup się na tym, żeby operacje były możliwie najprostsze, bo to będzie słabe ogniwo, jeśli chodzi o wydajność Twojego projektu. Drugą sprawą jest przekazywanie danych między socketami przez system operacyjny (jeżeli localhost) lub sieć (jeżeli dwa różne komputery), ale programista nie ma na to wpływu.

0
wartek01 napisał(a):

z jednej strony mam aplikację C, która ładuje sobie różnorakie struktury - tzn takie struktury, których budowy przewidzieć nie mogę. Z drugiej strony mam aplikację Javową, która takowe struktury powinna czytać.
Jakiś przykład?

Generalnie musisz opracować sposób jak opakować te nieznane struktury w jakąś strukturę o wcześniej ustalonym kształcie, którą to już program w Java będzie umiał sobie zinterpretować.

Jak? To ściśle zależy od specyfiki twoich programów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1