ehh Panowie... co wy sobie myślicie, że jestem w trakcie pisania masowego serwera dla przynajmniej kilku tysięcy graczy i nie wiem czym się jak jest przechowywana tablica oraz czym jest wskaźnik... albo, że nie potrafię wysyłać struktur czy korzystać z sizeof troszeczkę powagi. Nie uważam się za jakiegoś znawcę tylko proszę o pomoc w konkretnej i bardzo nietypowej sprawie.
Nie wiem czy ciągle nie potraficie zrozumieć problemu przed jakim stoję czy co, że piszecie mi jak wysyłać struktury.
Spróbuję przedstawić problem jeszcze raz jak najbardziej jasno. Oczywiście w celu zrozumienia ta wersja którą przedstawię będzie dość uproszczona.
W związku z tym, że jest to uproszczona wersja nie powinniście raczej pytać po co i dlaczego w ten sposób ponieważ w rzeczywistym problemie to co chcę zrobić było by w pełni świadome i pomogło by mi w rozwiązaniu problemu przed którym stoję. Chyba, że nie da się rozwiązać tego tym sposobem wtedy pozostają tylko inne propozycje.
Więc tak mamy dwa duże stringi których na których nie chcemy wykonywać strcpy:
char *a;
char *b;
chcemy te stringi przesłać za jednym sendem (ze względu na to że tych stringów będzie dużo więcej)!
Wiadomo, że nie można użyć tutaj prostej struktury.
struct X
{
char *a;
char *b;
};
Wiadomo to bo zamiast stringów wyślą nam się tylko adresy pierwszych elementów;
Jeżeli jednak znamy długości tych stringów i wiemy że string a ma zawsze 4 znaki a b ma 10 znaków.
To mogli byśmy utworzyć drugą strukturę która przez kompilatora była by widoczna inaczej:
struct Y
{
char a[4]; // zapomnijmy o '\0'
char b[10]; // zapomnijmy o '\0'
};
Dla pewnej świadomości zróbmy:
X x;
x.a = "aaaa";
x.b = "0123456789";
(choć normalnie byśmy tego nie robili bo nasze stringi (char*) otrzymaliśmy już gotowe z bazy wiec to tylko przypisanie do przykładu)
mamy więc obiekt x i chcemy go wysłać wykonując tylko jeden raz funkcję send
jak już mówiłem nie możemy zrobić send((int)socket,&x,sizeof(x),0); bo wyślą się tylko adresy pierwszych elementów tych stringów, zresztą nawet sizeof nie będzie zgodny z oczekiwaniami.
Wiem, że poniższy zapis jest nieprawidłowy, bo na już na samą myśl o tym kompilator zaczyna krzyczeć, że nie można rzutować na char[].
chodzi jednak o to by zapisać coś takiego:
Y *y;
y->a = x.a;
w uproszczonej jeszcze formie mogło by ty być równie dobrze:
char *a = "cdef";
char b[4] = a;
Problem polega na oszukaniu komilatora w taki sposób by wziąć adres na literke 'c' co jest trywialne bo jest to po prostu a (i juz mamy adres).
i wpisać ten znaleziony adres w miejsce (char b[4] = "ghij";) adresu pod literką 'g' czyli po prostu w miejsce adresu b.
Próbowałem i też bez skutków:
((char*)b) = a;
i brakuje mi więcej pomysłów.
....
Zresztą po dość długich poszukiwaniach zaczynam wątpić w powodzenie tej misji...
pozostanie więc chyba strcpy lub wiele sendów no i ewentualnie przerobienie źródeł postgres tak by zwracały typ danych char array ale z tym pewnie było by masę pracy więc to jak już przy działającej wersji beta...