Wysyłanie pliku poprzez TClientSocker i TServerSocket

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

Wysyłanie pliku poprzez TClientSocker i TServerSocket

Nowy postprzez modyy » poniedziałek, 8 grudnia 2008, 22:06

Witam ;]
Mam nastepujace zadanie do szkoły musze napisać chat z mozliwościa wysyłania plików.
Ogolnie chat juz działa można pisać itd. ale nie wiem jak rozwiązać sprawe wysyłania plików.
Nie wiem jak wogole sie za to zabrać. Jak wczytać plik? Jak wysłać plik? ;]
Nie chce gotowego kodu, potrzebuje jakiś wskazówek ;]
Pozdrawiam
Avatar użytkownika
modyy
 
    NieznanyNieznana

Re: Wysyłanie pliku poprzez TClientSocker i TServerSocket

Nowy postprzez modyy » wtorek, 9 grudnia 2008, 16:45

Probowałem zrobic to tak:
Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ifstream plik("NOTEPAD.exe",ios::binary);
plik.seekg(0,ios::end);
int size=plik.tellg();
char* plik2;
plik2=new char[size];
plik.seekg(0,ios::beg);

int i=0;
char ch;
while(plik.get(ch))
{
  plik2[i]=ch;
  i++;

}
ClientSocket1->Socket->SendBuf(plik2,i);
}


Ale wywala error, że ifstrem, plik itd. Jest nie zadeklarowany ;/ Nie umiem tego przeskoczyć.
W Borlandzie pisze od niedawana, zawsze tylko DEVc++ a tu to pewnie trzeb a winnym miejscu zadeklarwać albo cos ;]
Jakies pomysły jak to zrobić?
Avatar użytkownika
modyy
 
    NieznanyNieznana

Re: Wysyłanie pliku poprzez TClientSocker i TServerSocket

Nowy postprzez Witold » wtorek, 9 grudnia 2008, 18:32

modyy napisał(a):...W Borlandzie pisze od niedawana, zawsze tylko DEVc++ a tu to pewnie trzeb a winnym miejscu zadeklarwać albo cos ;]
Jakies pomysły jak to zrobić?


Wydaje mi się że tego brak:
Kod: Zaznacz cały
#include <fstream>
using namespace std;
delete [] plik2;
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Wysyłanie pliku poprzez TClientSocker i TServerSocket

Nowy postprzez modyy » wtorek, 9 grudnia 2008, 18:40

Mam to ;/ oprocz tej ostatniej linkijki ale nie ma roznicy czy jest czy nie ;/
Avatar użytkownika
modyy
 
    NieznanyNieznana

Re: Wysyłanie pliku poprzez TClientSocker i TServerSocket

Nowy postprzez Cyfrowy Baron » wtorek, 9 grudnia 2008, 19:23

Nie korzystałem nigdy do tego celu z socketów, więc sugeruję skorzystać z protokołu FTP i komponentu INDY IdFTP, czyli klient wysyła plik na serwer oraz informację do drugiego klienta z którym się komunikuje o tym pod jakim adresem osiągalny jest plik, drugi klient akceptuje pobranie pliku i pobiera go z podanej lokalizacji. Mozesz w tym celu skorzystać z porady w serwisie Cyfrowy Baron w dziale: sieć - internet, porada: Ściąganie i Wysyłanie plików poprzez protokół FTP.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Wysyłanie pliku poprzez TClientSocker i TServerSocket

Nowy postprzez modyy » piątek, 12 grudnia 2008, 19:39

Dzekij za rade ;]
Probuje zrobic to wysylanie na ftp-ka ale nie dziala mi kilka rzeczy ;/ a robie to w.g poradnika Cyfrowy Baron. Nie dziala mi wysylanie wiekszych plikow na server ftp, da sie tylko kilku kb txt. Kiedy naciskam na wyslij program po chwili sie zawiesza ;/ Nie dziala mi takze wyswietlanie plikow, ktore sa aktualnie na serwerze ;( Po prostu lista zostaje pusta ;/
Jakies pomysl gdzie moze byc blad z tym wyslaniem na serwer?
Robilem dokaladnie w.g poradnika.
Pozdrawiam
Avatar użytkownika
modyy
 
    NieznanyNieznana

Re: Wysyłanie pliku poprzez TClientSocker i TServerSocket

Nowy postprzez Cyfrowy Baron » piątek, 12 grudnia 2008, 19:52

Na tym forum znajduje się już większość odpowiedzi na twoje pytania. Problem z komponentem IdFTP był już poruszany na tym forum kilkakrotnie. Przejrzyj wcześniejsze posty.
Nie możesz wysłać dużych plików, gdyż zanim wyślesz taki plik na serwer, to następuje zerwanie połączenia (być może masz zbyt wolne łącze, wtedy połączenie często jest zrywane). Ten problem również został opisany we wcześniejszych postach.



BBCode cyfbar używa się tak tak:
[ cyfbar=w.g poradnika]siec.html[/cyfbar] - w.g poradnika Cyfrowy Baron
[ cyfbar=]siec.html[/cyfbar] - Cyfrowy Baron
[ cyfbar=w.g poradnika][/cyfbar] - w.g poradnika Cyfrowy Baron
[ cyfbar][/cyfbar] - ► patrz serwis: Cyfrowy Baron
(bez spacji po znaku [)
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Wysyłanie pliku poprzez TClientSocker i TServerSocket

Nowy postprzez modyy » piątek, 12 grudnia 2008, 20:00

Szukałem przed napisaniem posta ale nic nie znalazłem.
Poszukam teraz dokładniej.


No wiec przeszukałem forum dokładniej niż za 1 razem i znalazłem roziwązanie na problem z lista ale z wysyłaniem dalej nie umiem sobie dac rady ;/
Mówiac, a w zasadzie pisząc "wieksze pliki" ;] miałem na mysli pliki od 1Mb do 3Mb ;).
Probowałem dac timer zeby podtrzymywac polaczenie ale nic to nie daje poniewaz bo naciśniecu na wyślij program sie zawiesza ;/
ProgressBar wskakuje od razu na maxa odbojętnie jaka wartosć ustawie w RecvBufferSize i SendBufferSize ;/
Przed wysyyłaniem pliku sprawdzam czy jestem jeszcze połaczony ;]
Kod: Zaznacz cały
void __fastcall TForm1::Button3Click(TObject *Sender)
{
   if(IdFTP1->Connected())   
     IdFTP1->Put("D:\\ftpek\\test.rar", "test.rar", true);
   else
    ShowMessage("Rozłączony");
    return;
   }
}
Avatar użytkownika
modyy
 
    NieznanyNieznana

Re: Wysyłanie pliku poprzez TClientSocker i TServerSocket

Nowy postprzez Cyfrowy Baron » piątek, 12 grudnia 2008, 20:59

A próbowałeś polecenia NOOP, patrz post: viewtopic.php?f=16&t=200&p=1251&hilit=noop#p1251

Powinieneś też umieścić na formularzu komponent IdAntiFreeze (zakładka Indy Misc) zapobiegający przed zawieszeniem aplikacji.

Pokombinuj z buforami wysyłania i odczytywania w komponencie IdFtp, właściwości odpowiednio RecvBufferSize i SendBufferSize, zmień wartości by ustalić wartość przy której pliki są wysyłane.

Zalecam również ustawić pasywny tryb wysyłania plików jak w przeglądarce WWW, czli w komponencie IdFTP ustaw właściwość Passive na true.

Jeżeli korzystasz z proxy to musisz ustawić odpowiednio skonfigurować właściwości ProxySetting.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Wysyłanie pliku poprzez TClientSocker i TServerSocket

Nowy postprzez modyy » piątek, 12 grudnia 2008, 21:51

-Korzystam z NOOP


Zastosowałem wszystkie twoje porady, w róznych kombinacjach i już sie program nie wiesza tylko po pewnym czasie wyswietla error "Socket error (#10054): Connection reset by peer" i plik sie nie wysyła.

A co do Proxy to nie wiem czy potrzebuje <wstydnis> ale obojetnie czy tam wpisze te dane czy nie efekt ciagle jest ten sam.
Konto ftp mam na yoyo.pl
Avatar użytkownika
modyy
 
    NieznanyNieznana

Re: Wysyłanie pliku poprzez TClientSocker i TServerSocket

Nowy postprzez Cyfrowy Baron » piątek, 12 grudnia 2008, 22:44

Connection reset by peer - znaczy mniej więcej tyle, że połączenie zostało zresetowane, w tym przypadku, prawdopodobnie przez serwer, dlatego nie możesz wysłać pliku. Robisz coś źle, lub masz jakiś problem z kontem FTP.
Za pomocą porady opisanej w serwisie, wysyłałem pliki o rozmiarach 0koło 3 MB na swoje konto na serwerze republiki i nie wystąpiły, żadne problemy.
Załóź sobie darmowe konto na jakimś innym serwerze i spróbuj.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Wysyłanie pliku poprzez TClientSocker i TServerSocket

Nowy postprzez modyy » sobota, 13 grudnia 2008, 15:17

Zalozyłem konto na republice i śmiga. ;] Wielkie dzeki! Bardzo mi pomogłes. ;]
Tylko mam jeszcze jeden problem, mianowicie obojętnie od wartości w RecvBufferSize i SendBufferSize ProgressBar od razu wskakuje na max-a zaraz po nacisnieciu na Wyslij ;/ a plik wysyła sie jeszcze przez ok 10-20sec. ;/


Już wpadłem na rozwiąznanie ;]
Avatar użytkownika
modyy
 
    NieznanyNieznana

Re: Wysyłanie pliku poprzez TClientSocker i TServerSocket

Nowy postprzez Cyfrowy Baron » sobota, 13 grudnia 2008, 16:11

Nie wiem. U mnie ProgressBar zachowuje się prawidłowo, sprawdź czy wszystko dobrze zrobiłeś.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • 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 3 gości

cron