ďťż

Ładny brzuch

Sciagnalem z jakiejs strony przykladowy program na socketach do przesyłania plików. Mam Delphi 7e. Ja mam łacze radiowe a mój znajomy neostrade i podczas testow gdy ja wysylalem z clienta plik do niego ktory mial np.400KB to u niego sciagnelo tylko z 8KB i wyskakiwał błąś I/O error 103. NIe wiem o co chodzi.Gdy sprawdzalem klienta i serwera u siebi ena kompie (127..0.0.1) wszystko bylo ok.A w sieci juz lipa. ZAmieszczam kod Clienta i Serwera :

KLIENT
--------------------------------------------------
Unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ScktComp; type TForm1 = class(TForm) Label1: TLabel; GroupBox1: TGroupBox; Edit1: TEdit; Button1: TButton; GroupBox2: TGroupBox; stat: TStatusBar; od: TOpenDialog; Label2: TLabel; filename: TLabel; Button3: TButton; Button2: TButton; prog: TProgressBar; cmdsock: TClientSocket; filesock: TClientSocket; procedure Button3Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure cmdsockConnect(Sender: TObject; Socket: TCustomWinSocket); procedure cmdsockError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure cmdsockDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button3Click(Sender: TObject); begin if od.Execute then filename.Caption:=od.filename; //przypisujemy plik do labela:) end; procedure TForm1.Button1Click(Sender: TObject); begin cmdsock.active:=false; //dezaktywujemy socketa cmdsock.Address:=edit1.text; //ustawiamy adres cmdsock.Active:=true; //│╣czymy siŕ - konekting pipul stat.SimpleText:='Ăş╣czenie z serwerem ['+edit1.text+'].....'; //info edit1.Enabled:=false; //uniemo┐liwiamy zmiane adresu button1.Enabled:=false; //do not more click end; procedure TForm1.cmdsockConnect(Sender: TObject; Socket: TCustomWinSocket); begin stat.SimpleText:='Po│╣czono z serwerem!'; //ma│e info filesock.Active:=false; //deaktywacja po│╣czenia filesock.Address:=edit1.text; // adres filesock.Active:=true; // │╣czmy sie end; procedure TForm1.cmdsockError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin stat.SimpleText:='Nie mo┐na siŕ po│╣czyĹ  z wybranym komputerem. ERROR #'+inttostr(errorcode); //the news... errorcode:=0; //obslozyliĹĄmy b│╣d //aktywujemy komponenty edit1.Enabled:=true; button1.enabled:=true; cmdsock.Active:=false; // deaktywacja socketu filesock.Active:=false; // -||--||- showmessage('Po│╣czenie nie mo┐e byĹ  zrealizowane. Sprawdč poprawnoĹĄĹ  adresu i sprˇbuj ponownie.'); end; procedure TForm1.cmdsockDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin //aktywujemy komponenty edit1.Enabled:=true; button1.enabled:=true; stat.SimpleText:='Roz│╣czono '; end; procedure TForm1.Button2Click(Sender: TObject); var plik:File; //nasz plik do wyslania odczytane:integer; //liczba odczytanych bajtˇw pozycja:integer; //miejsce od ktˇrego zaczynamy wysy│aĹ  pakiet: Array[0..1024] of Char; //1 kb do wys│ania (bufor) begin {najwa┐niejsza czeĹĄĹ  - wysy│anie pliku} if fileexists(filename.caption) then begin //nasz plik istnieje cmdsock.Socket.SendText('wysylam'+extractfilename(filename.caption)); //rozpoczynamy wysylanie pozycja:=0; // wysylamy plik od pocz╣tku, nie? // *** przypisujemy plik do zmiennej i pobieramy o nim info AssignFile(plik,filename.caption); //normalne przypiasnie Reset(plik,1); //otwieramy do ODCZYTU prog.Max:=FileSize(plik); // rozmiar pliku // *** zabezpieczenia debiloodpornoĹĄciowe button3.enabled:=false; button2.enabled:=false; // *** no i wysylamy stat.SimpleText:='Wysy│am plik ['+InttoStr((FileSize(plik) div 1024))+' kB]'; repeat Application.ProcessMessages; //wyswietlaj rezultaty (odswiezaj sie) Sleep(10); //im wiecej tym pewniejszy, ale wolniejszy przekaz Seek(plik,pozycja); //ustawiamy wskaznik pliku w miejscu na ktorym ostatnio skonczylismy BlockRead(plik,pakiet,sizeof(pakiet),odczytane); {pierwszy parametr to plik, drugi bufor, trzeci ilosc bajtow do odczytania, ostatni to rezultat - czyli ilosc odczytanych bajtow} if odczytane>0 then //jesli cos jeszcze zostalo begin filesock.Socket.SendBuf(pakiet,SizeOf(pakiet)); //wysylamy nasz 'pakiet', czyli czesc pliku pozycja:=pozycja+odczytane; //zwiekszamy 'pozycja' o ilosc odczytanych bajtow end; prog.Position:=pozycja; //ile wyslalismy until odczytane=0; //dopˇki nie skonczy nam sie plik (nie odczytamy 0 bajtˇw) cmdsock.Socket.SendText('koniec'); // ka┐emy zamkn╣Ĺ  plik CloseFile(plik); //sami go te┐ zamykamy prog.Position:=0; //zerujemy progressbara button3.enabled:=true;// unlock button2.enabled:=true; end else showmessage('Z│a nazwa pliku!!! Plik nie istnieje!'); // gdyby plik nie istnia│ end; end. ------------------------------------------- -------------------------------------------- SERWER: --------------------------------------------- Unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, ComCtrls, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; stat: TStatusBar; cmdsrv: TServerSocket; filesrv: TServerSocket; procedure cmdsrvClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure cmdsrvClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure filesrvClientRead(Sender: TObject; Socket: TCustomWinSocket); private { Private declarations } public { Public declarations } end; var Form1: TForm1; plik:file; //przyslany nam plik przyslano:integer;//ile juz przyslano (odpowiednik 'pozycja' z klienta) implementation {$R *.DFM} procedure TForm1.cmdsrvClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin stat.SimpleText:='Po│╣czono z klientem!'; //hehe mamy frajera end; procedure TForm1.cmdsrvClientRead(Sender: TObject; Socket: TCustomWinSocket); var s:string; //co nam przyslal za komende kliencik begin s:=socket.ReceiveText; //odbieramy polecenie if s='koniec' then begin //ahh to koniec... mozemy sie cieszyc nowym plikiem... closefile(plik); //zamykamy plik stat.SimpleText:='Odebrano plik'; //mamy plik! end; if copy(s,0,7)='wysylam' then //cos do nas wysylaja... begin przyslano:=0; //resetujemy licznik stat.SimpleText:='Odbieram plik '+copy(s,8,length(s)-7); //info AssignFile(plik,getcurrentdir+'\pliki\'+copy(s,8,length(s)-7));//przypisujemy plik Rewrite(plik,1); //odfieramy plik end; end; procedure TForm1.filesrvClientRead(Sender: TObject; Socket: TCustomWinSocket); var pakiet:Array[0..1024] of Char; //ten sam pakiet zapisano:integer; //ile mamy na twardzielu begin filesrv.Socket.Connections[0].ReceiveBuf(pakiet, SizeOf(pakiet)); //odbieramy Seek(plik,przyslano); //przesuwamy sie w pliku na miejsce, gdzie skonczylismy blockwrite(plik,pakiet,sizeof(pakiet),zapisano); //zapisujemy do pliku przyslano:=przyslano+zapisano; //hehe te bezokoliczniki stat.simpletext:='Odebrano '+(inttostr(przyslano div 1024))+ 'kb danych'; //info end; // i to ju┐ wszystko. Proste, nie? end.
-------------------------------------------------------------------------
// Używaj [ code ] (ew. [ codebox] )
Użytkownik _Herkules_ edytował ten post 29 wrzesień 2005, 19:11


[ot] Uzywaj znacznika [code] bo ciezko sie ten kod czyta ....
Hmm z tego co widze to ty tego kodu nie rozumiesz -wklepales tutaj kod sciagniety z jakiejs strony i sie pytasz co jest nie tak :/ Polecam zaczac od podstaw programowania na gniazdkach, moze jakis chat?

Ja ten kod rozumiem i na jego podstawie chce stworzyc swoj prog.I napisalem ze nie wiem czemu wystepuje błąd,a nie że nie rozumiem kodu.

Zapomij, że ktoś Ci poproawi te bazgroły co wkleiłeś - wklejasz cały kod, 95% linii jest tu zbednych i Ty mówisz, że rozumiesz ten kod?

Pozatym wystarczy zajrzeć do FAQ.

Błąd I/O o numerze 103 oznacza nieotwarty plik.



Ok jeszcze raz.Podejrzewam ze błąd wystepuje w Serwerze.Oto najprawdopodobniej bledna procedura:

SERWER
--------------------------
procedure TForm1.filesrvClientRead(Sender: TObject; Socket: TCustomWinSocket); var pakiet:Array[0..1024] of Char; //ten sam pakiet zapisano:integer; //ile mamy na twardzielu begin filesrv.Socket.Connections[0].ReceiveBuf(pakiet, SizeOf(pakiet)); Seek(plik,przyslano); blockwrite(plik,pakiet,sizeof(pakiet),zapisano); przyslano:=przyslano+zapisano; stat.simpletext:='Odebrano '+(inttostr(przyslano div 1024))+ 'kb danych'; end;
------------------------------------------
Ja wiem ze błąd o nr 103 I/O oznacza nieotwart plik.Ale jak to sie dzieje ze gdy testuje u siebie klienta i serwera na (127.0.0.1) to wszystko jest ok.A gdy sprawdzam tak ze mam u siebie(łącze radiowe) klienta a u znajomego co ma neostrade zainstalowany jest SERWER i błąd wystepuje u niego.Pod niby koniec sciagania chociaz i takk plik sie sciaga w 5%.
// Używaj [ code ] (ew. [ codebox] )
Użytkownik _Herkules_ edytował ten post 29 wrzesień 2005, 19:12
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •