Ĺadny brzuch
Jak w Delphi przesłać jakiś plik go innego gościa korzystając TCP? Dlaczego wtedy obaj muszą się widzieć, tj musi połączenie p2p?
Na początku wymyśliłem sobie metodę na przesyłanie plików poprzez przerobienie ich na tekst, wysłanie, a po drugiej stronie nastąpiłoby składanie do kupy. Dla upewnienia się, czy takie coś jest możliwe, zmieniłem rozszerzenie jakiegoś programu na txt, skopiowałem zawartość i wkleiłem do innego pliku txt, którego rozszerzenie następnie zmieniłem na exe. I tu, mimo że wszyściutko skopiowałem, program jest nieprawidłowy, tj nie działa. Dlaczego?
Pewnie dlatego, ze skorzystales z notatnika...
Pewnie dlatego, ze skorzystales z notatnika...
Dlatego, że Notatnik usuwa z tekstu niektóre znaki, których nie może wyświetlić - mowa tu o znakach np. o kodzie ASCII < 32, czyli znakach sterujących. W plikach .exe jest bardzo wiele bajtów o takich kodach, i je notatnik usuwa. Zapisując potem taki obcięty EXEc nieodwracalnie dziurawisz program, który nie ma prawa być potem prawidłowy.
Pozdrawiam.
TAPL trwa...
...a jak by tak skorzystać z richedit bo wordpad to używa to zadziałałoby czy nie bo ja chyba wątpie. Ja tak samo próbuje wykombinować żeby przesyłać pliki jako tekst i potem rozszerzenia zmieniać bo przecież można by było wykorzystać go do wysyłania/odbierania w częściach.
Moim skromnym zdaniem nie ma możliwości zrobienia tego w ten sposób. Możesz przesyłać plik zczytywany bitowo. Każda normalna konwersja na tekst powoduje jego uszkodzenie i nie sądze aby udało się to komuś obejść.
Dlaczego wtedy obaj muszą się widzieć, tj musi połączenie p2p?
Ja myślę że jakby dało się zedytować plik jako text to można wysyłać/odbierać plik bez zew. IP lub przekierowania. Wystarczyłoby podzielić plik na części jako text bo text bardzo szybko sie wysyła/odbiera i można bybyło podzielone części wgrywać na serwer a jednocześnie odbierać. powiedzmy mamy plik 1MB dzielimy go po 10KB jako text i ślemy na serwer i jednocześnie odbieramy i tak całyczas. Powinno działać tyle że na końcu plik musi się skleić w jedną kupę oraz trzeba obmyśleć jak plik dzielić na części...
Hmm. Co do szybkosci - nie ma roznicy. Wgrywac na server... moze i ma to jakis sens, tyle ze kazda osoba musi miec swoj server (FTP jak sie domyslam). No ale jezeli zakladamy, ze kazdy ma swoj server, to robimy cos takiego:
1. Ladujemy na FTP plik 'glowny' np. FileInfo.dat, a w nim znajduje sie informacja, jak duzy jest plik, w ilu czesciach bedzie zaladowany na server i jakie duze beda te czesci (oraz rozmiar ostatniej!!!)
2. Ladujemy po kolei czesci pliku (z tym raczej nie bedzie problemu)
3. W tym samym czasie odbierajacy odczytuje plik FileInfo.dat i czeka az pierwsza czesc osiagnie taki rozmiar jak jest to ustalone, jezeli juz go osiagnie, to pobiera dana czesc i dokleja do pliku na dysku (to tez jest proste), po pobaniu usuwa.
No i to by bylo na tyle. Co do dzielenia pliku na czesci - wczytujemy Xb do pamieci (np. TMemoryStream) i wysylamy na server i tak w kolko. A 'skladanie' - odbieramy plik z FTP do pamieci (j.w.) i dopisujemy do pliku.
Jak by bylo cos nie jasne to prosze pisac B)
Musza sie widziec, a dokladniej jeden z nich musi widziec drugiego (czyli tylko jeden musi miec zew. ip / przekierowany port).
Po nawiazaniu połączenia wysylasz nazwe, rozmiar pliku, i zaczynasz przesyl zawartosci pliku :)
// Edit: Dla czego chcecie przesylac ten plik jako tekst, a nie binarnie?
Przy przesyłaniu tekstu nie muszą się widzieć bo jest wysyłany przez serwer gg a wysyłanie plików za bardzo obiążało by serwer.
metaxy-można wysyłać plik zapisany w postaci tekstu i robiono to od czasów dosa programik nazywał sie chyba uuencode czy jakoś tak.
1. Jezeli przesylasz text przez gg, to laczysz sie z serverem, ktorego widzisz Ty i osoba do ktorej przesylasz tekst.
2. Co do przesylania pliku jako tekst: Nie da sie. Czemu? Jezeli w pliku znajduje sie znak ASCII o kodzie 0 to ciag znakow zostaje zakonczony. Nio chyba, ze zwiekszyc rozmiar pliku 2-krotnie i wysylac jako tekst w postaci tekstu szesnsatkowego... (jezeli dobrze pamietam, tak sa wysylane zalaczniki na poczte e-mail).
3. Przesylanie plikow binarnie znajdziesz u mnie na stronie (kilka zrodel i maly art o wysylaniu). Co prawda sa tam kody, ktore dzialaja woooolno, no ale jak je pisalem to zadawalo mi sie ze szybciej sie nie da :P
Nie wiem jak przesylanie, ale wiem ze mozna zapisać program do pliku txt, a później spowrotem zapisac w exe, a program będzie działał poprawnie
1. Nie da się jednocześnie wysyłać pliku na serwer ftp ani http ani na jaki kolwiek inny i go w tym samym czasie pobierać...
2. http://4programmers....ticle.php?id=39 <- art o socketach i przesyłaniu pliku.
3. w GG przesylanie plików odbywa się po połączeniu bezpośrednim...(z tąd wzioł się inwigilator w pGG)
Jeden z użytkowników napisał, że nie można przesyłać plików za pomocą stringa. Jest to prawda, ale nie do końca. Prawdopodobnie występuje u Ciebie błąd, ponieważ wraz ze stringiem wysyłasz niepotrzebne śmieci z przodu, ale też np. znaki o kodzie #0, które urywają string.
Można wysłać plik w postaci Array of Byte, nie stracisz wówczas żadnych danych, ani nie będzie sie nic urywać [ jak w/w #0 ]
W stringach też możesz przechowywać #0. Trzeba tylko określić jego rozmiar przez SetLength i wpakować do niego co się chce :)
1. Jezeli jest znak ASCII 0 to string sie konczy (juz zreszta pisalem)
2. array of byte <> string
3.
Nie wiem jak przesylanie, ale wiem ze mozna zapisać program do pliku txt, a później spowrotem zapisac w exe, a program będzie działał poprawnie Jezeli chodzi o samo rozszerzenie sie da, ale przez program do edycji tekstu sie nie da (wylaczajac EditPlus i podobne :P).
4.
1. Nie da się jednocześnie wysyłać pliku na serwer ftp ani http ani na jaki kolwiek inny i go w tym samym czasie pobierać... tak jak ja napisalem sie da.
5.
Trzeba tylko określić jego rozmiar przez SetLength i wpakować do niego co się chce Ale nie koniecznie potem wszystko wyjdzie....
Do przechowywania danych binarnych uzywa sie tablic a nie stringow B)
Użytkownik Ali240 edytował ten post 23 lipiec 2005, 13:40
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Na początku wymyśliłem sobie metodę na przesyłanie plików poprzez przerobienie ich na tekst, wysłanie, a po drugiej stronie nastąpiłoby składanie do kupy. Dla upewnienia się, czy takie coś jest możliwe, zmieniłem rozszerzenie jakiegoś programu na txt, skopiowałem zawartość i wkleiłem do innego pliku txt, którego rozszerzenie następnie zmieniłem na exe. I tu, mimo że wszyściutko skopiowałem, program jest nieprawidłowy, tj nie działa. Dlaczego?
Pewnie dlatego, ze skorzystales z notatnika...
Pewnie dlatego, ze skorzystales z notatnika...

Dlatego, że Notatnik usuwa z tekstu niektóre znaki, których nie może wyświetlić - mowa tu o znakach np. o kodzie ASCII < 32, czyli znakach sterujących. W plikach .exe jest bardzo wiele bajtów o takich kodach, i je notatnik usuwa. Zapisując potem taki obcięty EXEc nieodwracalnie dziurawisz program, który nie ma prawa być potem prawidłowy.
Pozdrawiam.
TAPL trwa...
...a jak by tak skorzystać z richedit bo wordpad to używa to zadziałałoby czy nie bo ja chyba wątpie. Ja tak samo próbuje wykombinować żeby przesyłać pliki jako tekst i potem rozszerzenia zmieniać bo przecież można by było wykorzystać go do wysyłania/odbierania w częściach.
Moim skromnym zdaniem nie ma możliwości zrobienia tego w ten sposób. Możesz przesyłać plik zczytywany bitowo. Każda normalna konwersja na tekst powoduje jego uszkodzenie i nie sądze aby udało się to komuś obejść.
Dlaczego wtedy obaj muszą się widzieć, tj musi połączenie p2p?

Ja myślę że jakby dało się zedytować plik jako text to można wysyłać/odbierać plik bez zew. IP lub przekierowania. Wystarczyłoby podzielić plik na części jako text bo text bardzo szybko sie wysyła/odbiera i można bybyło podzielone części wgrywać na serwer a jednocześnie odbierać. powiedzmy mamy plik 1MB dzielimy go po 10KB jako text i ślemy na serwer i jednocześnie odbieramy i tak całyczas. Powinno działać tyle że na końcu plik musi się skleić w jedną kupę oraz trzeba obmyśleć jak plik dzielić na części...
Hmm. Co do szybkosci - nie ma roznicy. Wgrywac na server... moze i ma to jakis sens, tyle ze kazda osoba musi miec swoj server (FTP jak sie domyslam). No ale jezeli zakladamy, ze kazdy ma swoj server, to robimy cos takiego:
1. Ladujemy na FTP plik 'glowny' np. FileInfo.dat, a w nim znajduje sie informacja, jak duzy jest plik, w ilu czesciach bedzie zaladowany na server i jakie duze beda te czesci (oraz rozmiar ostatniej!!!)
2. Ladujemy po kolei czesci pliku (z tym raczej nie bedzie problemu)
3. W tym samym czasie odbierajacy odczytuje plik FileInfo.dat i czeka az pierwsza czesc osiagnie taki rozmiar jak jest to ustalone, jezeli juz go osiagnie, to pobiera dana czesc i dokleja do pliku na dysku (to tez jest proste), po pobaniu usuwa.
No i to by bylo na tyle. Co do dzielenia pliku na czesci - wczytujemy Xb do pamieci (np. TMemoryStream) i wysylamy na server i tak w kolko. A 'skladanie' - odbieramy plik z FTP do pamieci (j.w.) i dopisujemy do pliku.
Jak by bylo cos nie jasne to prosze pisac B)
Musza sie widziec, a dokladniej jeden z nich musi widziec drugiego (czyli tylko jeden musi miec zew. ip / przekierowany port).
Po nawiazaniu połączenia wysylasz nazwe, rozmiar pliku, i zaczynasz przesyl zawartosci pliku :)
// Edit: Dla czego chcecie przesylac ten plik jako tekst, a nie binarnie?

Przy przesyłaniu tekstu nie muszą się widzieć bo jest wysyłany przez serwer gg a wysyłanie plików za bardzo obiążało by serwer.
metaxy-można wysyłać plik zapisany w postaci tekstu i robiono to od czasów dosa programik nazywał sie chyba uuencode czy jakoś tak.
1. Jezeli przesylasz text przez gg, to laczysz sie z serverem, ktorego widzisz Ty i osoba do ktorej przesylasz tekst.
2. Co do przesylania pliku jako tekst: Nie da sie. Czemu? Jezeli w pliku znajduje sie znak ASCII o kodzie 0 to ciag znakow zostaje zakonczony. Nio chyba, ze zwiekszyc rozmiar pliku 2-krotnie i wysylac jako tekst w postaci tekstu szesnsatkowego... (jezeli dobrze pamietam, tak sa wysylane zalaczniki na poczte e-mail).
3. Przesylanie plikow binarnie znajdziesz u mnie na stronie (kilka zrodel i maly art o wysylaniu). Co prawda sa tam kody, ktore dzialaja woooolno, no ale jak je pisalem to zadawalo mi sie ze szybciej sie nie da :P
Nie wiem jak przesylanie, ale wiem ze mozna zapisać program do pliku txt, a później spowrotem zapisac w exe, a program będzie działał poprawnie
1. Nie da się jednocześnie wysyłać pliku na serwer ftp ani http ani na jaki kolwiek inny i go w tym samym czasie pobierać...
2. http://4programmers....ticle.php?id=39 <- art o socketach i przesyłaniu pliku.
3. w GG przesylanie plików odbywa się po połączeniu bezpośrednim...(z tąd wzioł się inwigilator w pGG)
Jeden z użytkowników napisał, że nie można przesyłać plików za pomocą stringa. Jest to prawda, ale nie do końca. Prawdopodobnie występuje u Ciebie błąd, ponieważ wraz ze stringiem wysyłasz niepotrzebne śmieci z przodu, ale też np. znaki o kodzie #0, które urywają string.
Można wysłać plik w postaci Array of Byte, nie stracisz wówczas żadnych danych, ani nie będzie sie nic urywać [ jak w/w #0 ]
W stringach też możesz przechowywać #0. Trzeba tylko określić jego rozmiar przez SetLength i wpakować do niego co się chce :)
1. Jezeli jest znak ASCII 0 to string sie konczy (juz zreszta pisalem)
2. array of byte <> string
3.
Nie wiem jak przesylanie, ale wiem ze mozna zapisać program do pliku txt, a później spowrotem zapisac w exe, a program będzie działał poprawnie Jezeli chodzi o samo rozszerzenie sie da, ale przez program do edycji tekstu sie nie da (wylaczajac EditPlus i podobne :P).
4.
1. Nie da się jednocześnie wysyłać pliku na serwer ftp ani http ani na jaki kolwiek inny i go w tym samym czasie pobierać... tak jak ja napisalem sie da.
5.
Trzeba tylko określić jego rozmiar przez SetLength i wpakować do niego co się chce Ale nie koniecznie potem wszystko wyjdzie....
Do przechowywania danych binarnych uzywa sie tablic a nie stringow B)
Użytkownik Ali240 edytował ten post 23 lipiec 2005, 13:40