[solved][C++][Sockety] Odbieranie danych o różnych wielkości

0

Witam.
Napisałem protokół (tzn jestem w trakcie pisania), który na podstawie otrzymanego tekstu tworzy zapytanie do MySQL i zwraca do klienta całą treść wyniku z MySQL przez port, na którym działa dana aplikacja.
No i moje pytanie brzmi... Jak (korzystając z funkcji send(), recv()) klient ma odebrać i zapisać dane o zmiennym rozmiarze bez potrzeby marnowania miejsca na zapas lub ryzyka ze tego miejsca braknie?

Tzn. chodzi dokładnie o to ze send() i recv() odbierają jako jeden argument bufor (który musi mieć już określony rozmiar) oraz zmienną zawierającą rozmiar tego bufora. No i jak to zrobić (najoptymalniej) aby odebrać nawet bardzo duże dane bez potrzeby deklarowania bufora "na zapas"...

Ja wymyśliłem coś takiego ze najpierw serwer (w odpowiedzi na żądanie klienta) wysyła informacje o rozmiarze wyniku... klient dynamicznie tworzy sobie taką tablicę (bufor operatorem new), po czym odpowiada serwerowi ze już ma bufor (np. wysyła jedynkę). Serwer dopiero wtedy przystępuje do wysłania danych właściwych. Potem klient operuje na danych i po tym wszystkim dealokuje bufor (delete). Problemem dla mnie jest tylko to że czasami będzie potrzeba wykonania serii zapytań (np. około 100 pod rząd). Przy tym rozwiązaniu liczba operacji wysyłania jest równa 200. A gdyby doliczyć, że z serwera korzysta więcej niż jedna osoba to jego obciążenie może być znaczne.

Ma ktoś jakieś lepsze pomysły?? A może moje obawy o obciążeniu serwera nie są potrzebne??

0

procesora raczej nie przeciążysz ( zakładam że masz >2ghz )
pamięci może dość dużo zeżreć bo musi gdzieś trzymać dane zanim dojdzie pakiet od klienta o gotowości do odebrania
połączenie może oczywiście nie wytrzymać, ale to już zależy jego od szybkości i ilości przesyłanych danych

więc testuj testuj =)
musisz wiedzieć ile danych średnio wysyłasz i jaki czas serverowi zajmie ich wykopanie z SQL'a przy X klientów z Y zapytań

0

a jaką funkcją na linuxie zmierzyć czas w mili albo nawet i nano sekundach żeby obliczyć sobie różnicę czasu (czas trwania) takiego wysyłania i odbierania informacji... (najpierw na localhoscie dla sprawdzenia obciążenia dla procesora a później przez Internet aby obliczyc dodatkowo opóźnienia dla pakietów w sieci)??

0
coder() napisał(a)

Ja wymyśliłem coś takiego ze najpierw serwer (w odpowiedzi na żądanie klienta) wysyła informacje o rozmiarze wyniku... klient dynamicznie tworzy sobie taką tablicę (bufor operatorem new), po czym odpowiada serwerowi ze już ma bufor (np. wysyła jedynkę). Serwer dopiero wtedy przystępuje do wysłania danych właściwych. Potem klient operuje na danych i po tym wszystkim dealokuje bufor (delete)

nie ma potrzeby rozszczepiac operacji na wysylanie inta, potwierdzanie i wysylanie informacji. wystarczy ze wszystko wyslesz na raz w odpowiedniej kolejnosci. majac do wyslania string jakiejs nieokreslonej dlugosci np.:

"alamakotaakotmaale\0"

niech wysle:

|strlen+1|zawartosc|, czyli:

0x00000013|"alamakotaakotmaale\0"

po stronie klienta odbierzesz to w mniejwiecej taki sposob jak myslisz:

int dlugosc = 0;
recv 4bajty => &dlugosc;
char* bufor = new char[dlugosc];
recv 'dlugosc'bajtow => bufor;

0

Z dużą pomocą jednego z forumowiczów zastosowałem odbieranie danych porcjami w pętli do...while z wykorzystaniem funkcji realloc i memcpy :) Wszystko działa cacy :D

0

mam nadzieje, ze w tym zawarliscie rowniez obserwacje co recv/send zwraca :)

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