CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - socket wysyłanie jpg

socket wysyłanie jpg

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Re: socket wysyłanie jpg

Nowy postprzez polymorphism » piątek, 8 października 2010, 11:25

Poczytaj, czym się różni metoda od zwykłej funkcji.


swoją drogą, jak korzystasz z auto_ptr, to bądź konsekwentny i zastosuj tę klasę do innych obiektów (pCanvas, Bmp i fl).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: socket wysyłanie jpg

Nowy postprzez Cyfrowy Baron » piątek, 8 października 2010, 11:44

Udzielę odpowiedzi tylko odnośnie błędów, gdyż już nie śledzę tego wątku tak dokładnie jak polymorphism.


[BCC32 Error] Unit7.cpp(23): E2451 Undefined symbol 'ClientSocket1'


Odnosi się najprawdopodobniej do tego fragmentu kodu:

KOD cpp:     UKRYJ  
 void SendExact(const char *p, unsigned size)
{
                while(size)
                {
                                unsigned sent = ClientSocket1->Socket->SendBuf(p,size);      /* PATRZ TUTAJ */
                                p += sent;
                                size -= sent;
                }
}
Funkcja SendExact nie należy do klasy TForm7 dlatego nic nie wie o elementach tej klasy, dlatego odwołując się w tej funkcji do elementów formularza Form7 musisz je odpowiednio adresować, czyli:

KOD cpp:     UKRYJ  
unsigned sent = Form7->ClientSocket1->Socket->SendBuf(p,size);




[BCC32 Error] Unit7.cpp(88): E2034 Cannot convert 'long *' to 'const char *'
[BCC32 Error] Unit7.cpp(88): E2342 Type mismatch in parameter 'p' (wanted 'const char *', got 'long *')


odnosi się do:

KOD cpp:     UKRYJ  
SendExact(&max,sizeof(long));


Chodzi o to, że zmienna max jest typu long, a funkcja SendExact oczekuje jako pierwszego argumentu typu const char. Nie wiem dlaczego polymorphism wstawia tam max, gdyż kompilator tego nie przełknie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: socket wysyłanie jpg

Nowy postprzez polymorphism » piątek, 8 października 2010, 11:49

dlatego odwołując się w tej funkcji do elementów formularza Form7 musisz je odpowiednio adresować, czyli:

Zuo! Niech po prostu zrobi metodę, tak jak napisałem, i problem zniknie.

Nie wiem dlaczego polymorphism wstawia tam max, gdyż kompilator tego nie przełknie.

Wystarczy rzutować na char* i przełknie:
KOD cpp:     UKRYJ  
SendExact((char*)&max,sizeof(long));

większość kodów piszę z palca, więc pewne rzeczy mogę pomijać.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: socket wysyłanie jpg

Nowy postprzez Cyfrowy Baron » piątek, 8 października 2010, 11:55

polymorphism napisał(a):Zuo! Niech po prostu zrobi metodę, tak jak napisałem, i problem zniknie.


Chodzi o funkcję składową klasy, czyli w pliku nagłówkowym Unit7.h sekcji public lub private należy umieścić deklarację tej funkcji. Pisze to gwoli wyjaśnienia, gdyż osoby dopiero uczące się programowania, nie zawsze potrafią posługiwać się odpowiednią terminologią.


Cyfrowy Baron napisał(a):dlatego odwołując się w tej funkcji do elementów formularza Form7 musisz je odpowiednio adresować, czyli:


W ten sposób też można się czegoś nowego nauczyć. Tak wogóle to proponuję zapoznać się z poradą w serwise Cyfrowy Baron w dziale: teoria -> Przekazywanie obiektów i funkcji pomiędzy formularzami.


polymorphism napisał(a):Wystarczy rzutować na char* i przełknie:


Tyle to wiem, ale pomyślałem, że może to pomyłka.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: socket wysyłanie jpg

Nowy postprzez gregor » piątek, 8 października 2010, 18:17

polymorphism napisał(a):Poczytaj, czym się różni metoda od zwykłej funkcji.


Czy tu chodzi o metody: metody wirtualne
Bo tylko to znalazłem

Cyfrowy Baron napisał(a):Funkcja SendExact nie należy do klasy TForm7 dlatego nic nie wie o elementach tej klasy, dlatego odwołując się w tej funkcji do elementów formularza Form7 musisz je odpowiednio adresować, czyli:

KOD cpp:     UKRYJ  
unsigned sent = Form7->ClientSocket1->Socket->SendBuf(p,size);





Złatwiło sprawe.

polymorphism napisał(a):Wystarczy rzutować na char* i przełknie:
KOD cpp:     UKRYJ  
SendExact((char*)&max,sizeof(long));

większość kodów piszę z palca, więc pewne rzeczy mogę pomijać.

Ok. tu też w porządku.


Tu nadal jest błąd:
KOD cpp:     UKRYJ  
unsigned sent = Form7->ClientSocket1->Socket->SendBuf(p,size);


[BCC32 Error] Unit7.cpp(36): E2034 Cannot convert 'const char *' to 'void *'
[BCC32 Error] Unit7.cpp(36): E2342 Type mismatch in parameter 'Buf' (wanted 'void *', got

Avatar użytkownika
gregor
Bladawiec
Bladawiec
 
Posty: 17
Dołączył(a): wtorek, 5 października 2010, 18:56
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Win XP
Kompilator: RAD Studio 2010
C++
Gadu Gadu: 0
    Windows XPOpera

Re: socket wysyłanie jpg

Nowy postprzez polymorphism » piątek, 8 października 2010, 18:30

Czy tu chodzi o metody: metody wirtualne

I tak, i nie. Poczytaj sobie o klasach.

Tu nadal jest błąd:

Rzutuj.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: socket wysyłanie jpg

Nowy postprzez gregor » piątek, 8 października 2010, 18:44

No tak rzutuje:

KOD cpp:     UKRYJ  
unsigned sent = Form7->ClientSocket1->Socket->SendBuf((char*)p,size);


ale i tak:

[ILINK32 Error] Error: Unresolved external 'TForm7::SendExact(const char *, unsigned int)' referenced from C:\DOCUMENTS AND SETTINGS\USER\MOJE DOKUMENTY\RAD STUDIO\PROJECTS\DEBUG\UNIT7.OBJ
[ILINK32 Error] Error: Unable to perform link



Ja nie wiem czy to nie jest przez to, że gdzieś czytałem „metoda jest umieszczana i usuwana razem z obiektem” :roll:
Avatar użytkownika
gregor
Bladawiec
Bladawiec
 
Posty: 17
Dołączył(a): wtorek, 5 października 2010, 18:56
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Win XP
Kompilator: RAD Studio 2010
C++
Gadu Gadu: 0
    Windows XPOpera

Re: socket wysyłanie jpg

Nowy postprzez Cyfrowy Baron » piątek, 8 października 2010, 18:53

gregor napisał(a):Czy tu chodzi o metody: metody wirtualne
Bo tylko to znalazłem


Przecież wyjaśniłem, że tutaj chodzi o funkcję składową klasy:

Cyfrowy Baron napisał(a):Chodzi o funkcję składową klasy, czyli w pliku nagłówkowym Unit7.h sekcji public lub private należy umieścić deklarację tej funkcji. Pisze to gwoli wyjaśnienia, gdyż osoby dopiero uczące się programowania, nie zawsze potrafią posługiwać się odpowiednią terminologią


Wyjaśnię dokładniej: w pliku Unit7.h w sekcji private robisz tak:

KOD cpp:     UKRYJ  
private:
         void SendExact(const char *p, unsigned size)



gregor napisał(a):Tu nadal jest błąd:


Chyba jesteś już przemęczony. Przecież to również wyjaśniłem częściowo:

Cyfrowy baron napisał(a):Chodzi o to, że zmienna max jest typu long, a funkcja SendExact oczekuje jako pierwszego argumentu typu const char.


a polymorphism podał rozwiązanie. Masz tutaj podobny komunikat błędu co wcześniej, tylko tym razem funkcja jako pierwszego argumentu oczekuje typu void, a Ty podajesz jej const char, więc znów rzutujesz:

KOD cpp:     UKRYJ  
unsigned sent = Form7->ClientSocket1->Socket->SendBuf( (void *)p,size);


Musisz sprawdzać jakich argumentów oczekuje funkcja i jakie ty podajesz, a le z tym rzutowaniem to uważaj, bo nie wszystko można rzutować na wszystko.
Z treści komunikatu błędu również wynika czego oczekuje funkcja i co podajesz:


[BCC32 Error] Unit7.cpp(36): E2034 Cannot convert 'const char *' to 'void *'
[BCC32 Error] Unit7.cpp(36): E2342 Type mismatch in parameter 'Buf' (wanted 'void *', got



Znaczy tyle co:


[BCC32 Error] Unit7.cpp(36): E2034Nie można konwertować typu 'const char *' na typ 'void *'
[BCC32 Error] Unit7.cpp(36): E2342 Rozbieżność typów w parametrze 'Buf' (potrzebny 'void *', otrzymano 'const char')




gregor napisał(a):No tak rzutuje:
KOD cpp:     UKRYJ  
unsigned sent = Form7->ClientSocket1->Socket->SendBuf((char*)p,size);


To, że raz rzutowałeś char nie oznacza, że za każdym razem tak ma być. W poprzednim przypadku miałeś zmienną long a funkcja oczekiwała typu char dlatego rzutowałeś long na char. Teraz funkcja oczekuje typu void, a Ty masz typ char więc rzutujesz char na void.
Nie zapędź się z tym rzutowaniem, bo jak wspomniałem wcześniej, nie wszystko można rzutować na wszystko.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: socket wysyłanie jpg

Nowy postprzez polymorphism » piątek, 8 października 2010, 18:56

Unresolved external 'TForm7::SendExact

Błąd ten oznacza to, że linker nie może znaleźć implementacji metody. Jeszcze może poczytaj o implementacji metod, bo chyba przeoczyłeś tę część (linku, który podałem, jest to opisane).

(...) że gdzieś czytałem „metoda jest umieszczana i usuwana razem z obiektem”

Bzdury!

Zaopatrz się w jakąś dobrą książkę do nauki C++.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: socket wysyłanie jpg

Nowy postprzez Cyfrowy Baron » piątek, 8 października 2010, 19:00

polymorphism napisał(a):Błąd ten oznacza to, że linker nie może znaleźć implementacji metody. Jeszcze może poczytaj o implementacji metod, bo chyba przeoczyłeś tę część (linku, który podałem, jest to opisane).


W tym konkretnym przypadku musisz tłumaczyć dokładniej, czyli w pliku nagłówkowym Unit7.h w sekcji private lub public należy zadeklarować tą funkcję, tak by stałą się funkcja składową klasy TForm7:

KOD cpp:     UKRYJ  
private:
         void SendExact(const char *p, unsigned size);


Potem w pliku źródłowym Unit7.cpp musisz przypisać tą funkcję klasie TForm7, czyli:

KOD cpp:     UKRYJ  
void TForm7::SendExact(const char *p, unsigned size)
{
                while(size)
                {
                                unsigned sent = ClientSocket1->Socket->SendBuf(p,size);
                                p += sent;
                                size -= sent;
                }
}
Zwróć uwagę na to: void TForm7::SendExac ...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: socket wysyłanie jpg

Nowy postprzez polymorphism » piątek, 8 października 2010, 19:41

W tym konkretnym przypadku musisz tłumaczyć dokładniej (...)

W linku, który dostał wszystko jest opisane. Wystarczy skojarzyć pewne fakty i samemu kombinować.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: socket wysyłanie jpg

Nowy postprzez gregor » piątek, 8 października 2010, 20:32

Cyfrowy Baron napisał(a):
KOD cpp:     UKRYJ  
private:
         void SendExact(const char *p, unsigned size);

Potem w pliku źródłowym Unit7.cpp musisz przypisać tą funkcję klasie TForm7, czyli:
KOD cpp:     UKRYJ  
void TForm7::SendExact(const char *p, unsigned size)

Zwróć uwagę na to: void TForm7::SendExac ...


Ja wcześniej zrozumiałem gdzie trzeba zadeklarować ale bez przykładu nie wiedziałem jak to dokładnie ma wyglądać i następnie wywołanie no ale teraz jest w porządku.

polymorphism napisał(a):
W tym konkretnym przypadku musisz tłumaczyć dokładniej (...)

W linku, który dostał wszystko jest opisane. Wystarczy skojarzyć pewne fakty i samemu kombinować.

No właśnie kombinowałem zawsze gdzieś cos brakowało z mojej niewiedzy wychodziły mi zawsze błędy…

Sprawdziłem działanie kodu samo przesyłanie (bez robienia zrzutu tylko przesyłanie tego samego pliku)

Sprawdzałem w ClientSocket OnRead (serwer informuje o zapisaniu pliku i pozwala na wysłanie kolejnego) przesyła tylko raz i źle mimo, ze rozmiar jest dobry to bez obrazu.

W Timer przesyła dobrze ale do czasu ten sam błąd co od początku…

Nie wiem jak wy ale ja mówię pas od kilku dni stoję z tym w miejscu a to zaledwie cześć programu który napisałem. To chyba znaczy, że jest to niewykonalne (albo ja jeszcze za mało potrafię ) na socketach no szkoda…

Pozdrawiam i dziękuje za poświecony mi czas

p.s.
może jest ktoś czytający ten post co robi tutoriale i może zrobi tutorial do tego zagadnienia to bym prosił info.
Avatar użytkownika
gregor
Bladawiec
Bladawiec
 
Posty: 17
Dołączył(a): wtorek, 5 października 2010, 18:56
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Win XP
Kompilator: RAD Studio 2010
C++
Gadu Gadu: 0
    Windows XPOpera

Re: socket wysyłanie jpg

Nowy postprzez polymorphism » piątek, 8 października 2010, 21:18

To chyba znaczy, że jest to niewykonalne (albo ja jeszcze za mało potrafię )

Opcja numer dwa ;)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: socket wysyłanie jpg

Nowy postprzez Cyfrowy Baron » sobota, 9 października 2010, 08:33

Wewnątrz Timer'a mamy taki oto kod:

KOD cpp:     UKRYJ  
void __fastcall TForm7::Timer1Timer(TObject *Sender)
{
 /* ... */

TFileStream *fl = new TFileStream("111.jpg", fmOpenRead);
 int razem = 0, rozmiar = 0 , max = fl->Size;
ClientSocket1->Socket->SendBuf(&max,sizeof(int));
  //ClientSocket1->Socket->SendBuf(&max,4);
  do
  {
        rozmiar = fl->Read(bufor,1024);
        razem += rozmiar;
        ClientSocket1->Socket->SendBuf(bufor,rozmiar);
        Application->ProcessMessages();
  } while (razem < max);

 delete fl;
}

Timer z każdym tyknięciem zegara będzie ten kod wywoływał, a co jeżeli ClientSocket1 podczas jednego tyknięcia nie zdoła przesłać do serwera całego pliku? W tym zdarzeniu obiekt klasy TFileStream musi wysłać plik w przeciągu jednego tyknięcia, gdyż w kolejnym pojawi się nowy obiekt z nowym plikiem. Co się stanie ze starym jeżeli przed rozpoczęciem nowego cyklu zegara, pętla do while, nie zakończyła działania, to kod delete fl nie zostanie wywołany, ale w nowym cyklu zostanie utworzony nowy obiekt fl!? Pętla nawet jeżeli nie zakończyła działania, to i tak nie powstrzymuje zegara przed rozpoczęciem kolejnego cyklu. Może należałoby zatrzymać zegar przed pętlą i uruchomić go ponownie poza pętlą???
KOD cpp:     UKRYJ  
void __fastcall TForm7::Timer1Timer(TObject *Sender)
{
 /* ... */

TFileStream *fl = new TFileStream("111.jpg", fmOpenRead);
 int razem = 0, rozmiar = 0 , max = fl->Size;
ClientSocket1->Socket->SendBuf(&max,sizeof(int));

Timer1->Enabled = false; // zatrzymanie zegara
  do
  {
        rozmiar = fl->Read(bufor,1024);
        razem += rozmiar;
        ClientSocket1->Socket->SendBuf(bufor,rozmiar);
        Application->ProcessMessages();
  } while (razem < max);

 delete fl;

Timer1->Enabled = true; // uruchomienie zegara.
}




Programów nie tworzy się przez jeden dzień czy tydzień. Czasami trwa to miesiącami. Wziąłem się za wyjątkowo trudny projekt, a wiedzę masz na poziomie początkującego. Jeżeli jedno niepowodzenie tak Ciebie zniechęca, to pewnie nigdy nie dokończysz żadnego programu.



Kolejna sprawa którą zauważyłem w Twoim kodzie, a która może w pewnych okolicznościach powodować błędne działanie programu. Nie podaje się samej nazwy pliku, lecz również ścieżkę dostępu, czyli np:

KOD cpp:     UKRYJ  
TFileStream *fl = new TFileStream("c:\\zrzuty ekranu\\111.jpg", fmOpenRead);


jeżeli pliki znajdują się w katalogu programu to podaje się ścieżkę względną, względem tegoż programu i to tak, żeby program sam sprawdził własną lokalizację, czyli:

KOD cpp:     UKRYJ  
  String fileName = ExtractFilePath( ParamStr(0) ) + "111.jpg";
  TFileStream *fl = new TFileStream( fileName, fmOpenRead );




Dlaczego wysyłając kolejne pliki nadajesz im identyczne nazwy. Odbierając pliki również zapisujesz je za każdym razem pod tą samą nazwą. Proponuję to zmienić:

Wysyłanie:

KOD cpp:     UKRYJ  
void __fastcall TForm7::Timer1Timer(TObject *Sender)
{
  static int fNr = 0;

  String fileName = ExtractFilePath( ParamStr(0) ) + "file_" + (String)fNr + ".jpg";
 
 TCanvas *pCanvas = new TCanvas();
 Graphics::TBitmap *Bmp = new Graphics::TBitmap;
  pCanvas->Handle = GetDC(0);
  Bmp->Width  = Screen->Width;
  Bmp->Height = Screen->Height;
  Bmp->Canvas->CopyRect(Rect(0, 0, Bmp->Width, Bmp->Height), pCanvas, Rect(0, 0, Bmp->Width, Bmp->Height));

  std::auto_ptr<TJPEGImage> jpegImg(new TJPEGImage());
  jpegImg->CompressionQuality = 20;//ostrość jakość
  jpegImg->Assign(Bmp);
  jpegImg->SaveToFile( fileName ); // <-- tutaj zmieniłem
  ReleaseDC(0, pCanvas->Handle);
  delete pCanvas, Bmp;

TFileStream *fl = new TFileStream( fileName, fmOpenRead ); // <-- tutaj zmieniłem
 int razem = 0, rozmiar = 0 , max = fl->Size;
ClientSocket1->Socket->SendBuf(&max,sizeof(int));

  do
  {
        rozmiar = fl->Read(bufor,1024);
        razem += rozmiar;
        ClientSocket1->Socket->SendBuf(bufor,rozmiar);
        Application->ProcessMessages();
  } while (razem < max);

 delete fl;
 fNr += 1;

}


Odbieranie:

KOD cpp:     UKRYJ  
void __fastcall TForm6::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket)
{
  static int fNr = 0;
  String fileName = ExtractFilePath( ParamStr(0) ) + "file_" + (String)fNr + ".jpg";

  if (fl)
  {
    char buf[1024];
        int size = Socket->ReceiveBuf(buf,1024);
        if(size == -1)return;
        fl->WriteBuffer(buf,size);
        odebranowszystko += size;

        if(odebranowszystko == wielkoscpliku)
        {
                delete fl;
                fl = NULL;
               fNr += 1;
        }
}
else
{
        if(Socket->ReceiveBuf(&wielkoscpliku,sizeof(long)) == sizeof(long) && wielkoscpliku > 0)
        {
                odebranowszystko = 0;
                fl = new TFileStream( fileName, fmCreate ); // <-- tutaj zmieniłem
        }
}
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: socket wysyłanie jpg

Nowy postprzez polymorphism » sobota, 9 października 2010, 10:33

W sumie to nie wiem, po co te zabawy ze strumieniem plikowym i zapisywaniem do pliku, przecież można to zrobić w pamięci, przy pomocy strumienia pamięciowego, co upraszcza jeszcze bardziej kod klienta:
KOD cpp:     UKRYJ  
auto_ptr<TMemoryStream> mem_str(new TMemoryStream());

...

mjpegImg->SaveToStream( mem_str.get() );

long max = mem_str->Size;
SendExact((char*)&max,sizeof(long));
SendExact((char*)mem_str->Memory, mem_str->Size);



Cyfrowy Baron napisał(a):
KOD cpp:     UKRYJ  
void __fastcall TForm6::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket)
{
        static int fNr = 0;
        String fileName = ExtractFilePath( ParamStr(0) ) + "file_" + (String)fNr + ".jpg";
        ...
 

Tworzenie ścieżki w tym miejscu to chyba niezbyt dobry pomysł, ponieważ to zdarzenie może być wywoływane wiele razy dla jednego pliku. Wystarczy przenieść to do warunku, gdzie tworzony jest strumień fl.

@gregor, w jakim trybie pracują sockety, blokującym czy nieblokującym?

____
p.s. Baron, jak poprawiasz kod, rób to z aktualną wersją.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron