[C] Wysyłanie struktury przez TCP/IP linux?

Mam do wysłania przez TCP/IP powiedzmy 3 liczby: int x, y, player. I teraz pytanie jak to najlepiej zrobić z poziomu C oczywiście.

Myslałem że użyje do tego struktury, ale… nie działa. Nie daje na razie kodu gdyż chciałbym się dowiedziec czy w ogóle pomysł robienia tego na strukturach jest dobry.

Jeśli nie to w jaki sposób się to robi? Np. w jakiś prostych grach multiplayer? Jeśli chodzi o tcp/ip mam jeszcze małą wiedzę, więc prosze o w miare zrozumiałe dla początkujacego odpowiedzi.

 

Pozdrawiam.

Sciagnij sobie zrodlo jakiego komunikatora, programu do ftp, telnetu, czegokolwiek (nawet ping). Porównasz, zobaczysz jak to robia inni, jak obsluguja bledy.

Nie lepiej tak poszukać jak czekac na odpowiedz?

Nie możesz przesłać struktury, ponieważ to nie ten poziom abstrakcji. TCP nic nie wie o strukturach, bo np. łączysz się z drugiej strony do gniazda w Java, co to jest struktura w Javie? Przesyła się strumienie bajtów.

Dzięki kostek135, wlasnie takich wskazówek potrzebuje. A jeszcze z ciekawości, jeśli po dwóch stronach gniazda są aplikacje napisane w C, i mają tak samo zadeklarowaną strukture, to czy jest możliwość jej wysłania i poprawnego odbioru ?

Pytam bo pamiętam kiedyś wysyłałem strukture przez kolejki w linuxie, a protokól TCP/IP chodź całkiem co innego to jednak mi to troszke przypomina.

 

Pozdrawiam.

Nie, ponieważ protokół musi działać zawsze, a nie wiesz do czego się połączysz. Jedyny wspólny mianownik wszystkiego to bajty, więc zostało to wybrane rozsądnie przez mądrzejszych ludzi niż ty czy ja. Co najwyżej może istnieć jakaś zewnętrzna biblioteka, która opakowuje ten proces, ale sprowadzi się to do tego samego. Czyli implementacji jakiegoś protokołu wyższego poziomu, który niżej będzie operował na bajtach. Po prostu ten proces zostanie przykryty bardziej user-friendly api. Takiej biblioteki będziesz musiał jednak sam, bo raczej aplikacje sieciowe/webowe na co dzień piszę w Javie. Prostym wariantem takiej bibliotki będzie napisanie przesyłania struktur, które zostały poddane serializacji, czyli zamienieniu struktury na ciąg bajtów. Spróbuj poszukać ze słowami: serialize/deserialize struct c.

Do przesyłania struktur w C użyj np. write, oto przykład:

write(socket, &struktura, sizeof(struktura));

Powinno działać. Gdybyś chciał udostępnić swój program na GNU/GPLv3, to bym Ci pozwolił na skorzystanie ze źródeł libgreattao czy tao-network-client. Jest tam zaimplementowane przesyłanie danych z użyciem tcp/ip.

 

Aha. Jeżeli korzystasz z GCC, to nie zapomnij w każdym pliku dopisać

#pragma pack(1)

Ja się pomyliłem - write nie jest funkcją standardowej biblioteki C,  a Uniksa.