Ĺadny brzuch
Witam,
Zastanawiam się w jaki sposób można odebrać srtukture za pomocą gniazda TClientSoclet [BCB].
Mam np. taką strukture:
struct pakiet
{
    TStream* stream;
    char name[128];
};
Próbuje ją odczytać w ten sposób:
int size = Socket->ReceiveLength();
pakiet *rec;
Socket->ReceiveBuf(&rec, size);
Niestety w taki sposób tego zrobić nie mogę, prosze o poprawe kodu lub udzialenie kilku wskazówek za które z góry dziękuje.
Użytkownik Roman45 edytował ten post 20 luty 2005, 18:32
int size = Socket->ReceiveLength();
pakiet rec; // bez gwiazdki !!! :)
Socket->ReceiveBuf(&rec, size);
tylko ze przesylanie takiej struktury nie ma sensu
pole TStream* stream; po przeslaniu bedzie pokazywalo na bledna wartosc...
tylko ze przesylanie takiej struktury nie ma sensu
pole TStream* stream; po przeslaniu bedzie pokazywalo na bledna wartosc...
W takim razie jak można odczytać nazwe pliku odebranego z gniazda? W mojej strukturze właśnie tablica name[] przechowywała te dane.
ja sie nie doczepilem do pola name, w ktorym bedzie zapewne nazwa pliku tylko to tego wskaznika TStream* stream;
mozesz sobie go wyobrazic jako konkretne miejsce w pamieci twojego komputera A od ktorego zaczyna sie strumien [to tak obrazowo, w rzeczywistosci jest troche inaczej].
i teraz jezeli poslesz taka strukture na komputer B, to przeciez na komputerze B nie ma w pamieci strumienia stream w dokladnie w tym samym miejscu co na twoim komputerze A, wiec przesylanie tego wskaznika nie ma sensu...
Więc jak moge "zdobyć" pierwotną nazwe wysłanego pliku?
Więc jak moge "zdobyć" pierwotną nazwe wysłanego pliku? musisz opracowac jakis sposob komunikacji. powiedzmy przesylanie jest zrealizowane tak:
klient laczy sie do serwera i wysyla nazwe pliku, serwer odsyla mu komunikat "ok", klient po odebraniu "ok" wysyla plik. cos w ten desen :)
Aha myślałem że można wysłać jakąś strukture z danymi o pliku lub coś w tym klimacie ;).
Wiesz może jak uzyskać dane dotyczące postępu w sciąganiu pliku [jego rozmiar i prędkośc połączenia]?
Wiesz może jak uzyskać dane dotyczące postępu w sciąganiu pliku [jego rozmiar i prędkośc połączenia]?
hmm... w takim przypadku ja bym to zrobil tak ;)
najpierw wysylane info o pliku: nazwa, rozmiar, ...
nastepnie zrobilbym inaczej wysylanie, nie przez wysylanie strumienia tylko na przyklad wysylanie w 8kilobajtowych kawalkach.
czyli klient wysyla info o pliku, serwer odsyla "ok", klient zaczyna wysylac plik po kawalkach, a serwer na kazdy odpowiada "ok".
wtedy wiesz ile juz kawalkow doszlo, ile jeszcze jest do wyslania, mozesz zmierzyc czas wysylania wiec i predkosc transferu, no i of coz zrobic postep wysylania...
najpierw wysylane info o pliku: nazwa, rozmiar, ...
nastepnie zrobilbym inaczej wysylanie, nie przez wysylanie strumienia tylko na przyklad wysylanie w 8kilobajtowych kawalkach.
czyli klient wysyla info o pliku, serwer odsyla "ok", klient zaczyna wysylac plik po kawalkach, a serwer na kazdy odpowiada "ok".
Hmmmm, istnieje jakaś funkcja która pobiera rozmiar pliku? i jak moge zrealizować takie wysyłanie po kilka kb?, prosiłbym o jakiś kod.
struktura informacji o pliku:
struct sFileInfo { char filename[255]; unsigned int filesize; }; sFileInfo fileInfo;
wysylanie:
void __fastcall TForm1::ButtonSendClick(TObject *Sender) { if ( OpenDialog->Execute() ) { fs = new TFileStream(OpenDialog->FileName, fmOpenRead); strncpy(fileInfo.filename,ExtractFileName(OpenDialog->FileName).c_str() ,255); fileInfo.filesize = fs->Size; ClientSocket->Socket->SendBuf(&fileInfo, sizeof(fileInfo)); ClientSocket->Socket->SendStream(fs); } }
odbieranie:
enum eTransferStatus { getFileInfo, getFile }; eTransferStatus transferStatus; void __fastcall TForm1::ServerSocketClientConnect(TObject *Sender, TCustomWinSocket *Socket) { transferStatus = getFileInfo; } void __fastcall TForm1::ServerSocketClientRead(TObject *Sender, TCustomWinSocket *Socket) { switch(transferStatus) { case getFileInfo: Socket->ReceiveBuf(&fileInfo, sizeof(fileInfo)); fs = new TFileStream(fileInfo.filename, fmCreate | fmOpenWrite); transferStatus = getFile; break; case getFile: int size = Socket->ReceiveLength(); char* buf = new char[size]; Socket->ReceiveBuf(buf, size); fs->Write(buf, size); delete buf; if ( fs->Size >= fileInfo.filesize ) delete fs; break; } }
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Zastanawiam się w jaki sposób można odebrać srtukture za pomocą gniazda TClientSoclet [BCB].
Mam np. taką strukture:
struct pakiet
{
    TStream* stream;
    char name[128];
};
Próbuje ją odczytać w ten sposób:
int size = Socket->ReceiveLength();
pakiet *rec;
Socket->ReceiveBuf(&rec, size);
Niestety w taki sposób tego zrobić nie mogę, prosze o poprawe kodu lub udzialenie kilku wskazówek za które z góry dziękuje.
Użytkownik Roman45 edytował ten post 20 luty 2005, 18:32
int size = Socket->ReceiveLength();
pakiet rec; // bez gwiazdki !!! :)
Socket->ReceiveBuf(&rec, size);
tylko ze przesylanie takiej struktury nie ma sensu
pole TStream* stream; po przeslaniu bedzie pokazywalo na bledna wartosc...
tylko ze przesylanie takiej struktury nie ma sensu
pole TStream* stream; po przeslaniu bedzie pokazywalo na bledna wartosc...
W takim razie jak można odczytać nazwe pliku odebranego z gniazda? W mojej strukturze właśnie tablica name[] przechowywała te dane.
ja sie nie doczepilem do pola name, w ktorym bedzie zapewne nazwa pliku tylko to tego wskaznika TStream* stream;
mozesz sobie go wyobrazic jako konkretne miejsce w pamieci twojego komputera A od ktorego zaczyna sie strumien [to tak obrazowo, w rzeczywistosci jest troche inaczej].
i teraz jezeli poslesz taka strukture na komputer B, to przeciez na komputerze B nie ma w pamieci strumienia stream w dokladnie w tym samym miejscu co na twoim komputerze A, wiec przesylanie tego wskaznika nie ma sensu...
Więc jak moge "zdobyć" pierwotną nazwe wysłanego pliku?
Więc jak moge "zdobyć" pierwotną nazwe wysłanego pliku? musisz opracowac jakis sposob komunikacji. powiedzmy przesylanie jest zrealizowane tak:
klient laczy sie do serwera i wysyla nazwe pliku, serwer odsyla mu komunikat "ok", klient po odebraniu "ok" wysyla plik. cos w ten desen :)
Aha myślałem że można wysłać jakąś strukture z danymi o pliku lub coś w tym klimacie ;).
Wiesz może jak uzyskać dane dotyczące postępu w sciąganiu pliku [jego rozmiar i prędkośc połączenia]?
Wiesz może jak uzyskać dane dotyczące postępu w sciąganiu pliku [jego rozmiar i prędkośc połączenia]?
hmm... w takim przypadku ja bym to zrobil tak ;)
najpierw wysylane info o pliku: nazwa, rozmiar, ...
nastepnie zrobilbym inaczej wysylanie, nie przez wysylanie strumienia tylko na przyklad wysylanie w 8kilobajtowych kawalkach.
czyli klient wysyla info o pliku, serwer odsyla "ok", klient zaczyna wysylac plik po kawalkach, a serwer na kazdy odpowiada "ok".
wtedy wiesz ile juz kawalkow doszlo, ile jeszcze jest do wyslania, mozesz zmierzyc czas wysylania wiec i predkosc transferu, no i of coz zrobic postep wysylania...
najpierw wysylane info o pliku: nazwa, rozmiar, ...
nastepnie zrobilbym inaczej wysylanie, nie przez wysylanie strumienia tylko na przyklad wysylanie w 8kilobajtowych kawalkach.
czyli klient wysyla info o pliku, serwer odsyla "ok", klient zaczyna wysylac plik po kawalkach, a serwer na kazdy odpowiada "ok".
Hmmmm, istnieje jakaś funkcja która pobiera rozmiar pliku? i jak moge zrealizować takie wysyłanie po kilka kb?, prosiłbym o jakiś kod.
struktura informacji o pliku:
struct sFileInfo { char filename[255]; unsigned int filesize; }; sFileInfo fileInfo;
wysylanie:
void __fastcall TForm1::ButtonSendClick(TObject *Sender) { if ( OpenDialog->Execute() ) { fs = new TFileStream(OpenDialog->FileName, fmOpenRead); strncpy(fileInfo.filename,ExtractFileName(OpenDialog->FileName).c_str() ,255); fileInfo.filesize = fs->Size; ClientSocket->Socket->SendBuf(&fileInfo, sizeof(fileInfo)); ClientSocket->Socket->SendStream(fs); } }
odbieranie:
enum eTransferStatus { getFileInfo, getFile }; eTransferStatus transferStatus; void __fastcall TForm1::ServerSocketClientConnect(TObject *Sender, TCustomWinSocket *Socket) { transferStatus = getFileInfo; } void __fastcall TForm1::ServerSocketClientRead(TObject *Sender, TCustomWinSocket *Socket) { switch(transferStatus) { case getFileInfo: Socket->ReceiveBuf(&fileInfo, sizeof(fileInfo)); fs = new TFileStream(fileInfo.filename, fmCreate | fmOpenWrite); transferStatus = getFile; break; case getFile: int size = Socket->ReceiveLength(); char* buf = new char[size]; Socket->ReceiveBuf(buf, size); fs->Write(buf, size); delete buf; if ( fs->Size >= fileInfo.filesize ) delete fs; break; } }