I/O error 103

0

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 ;P
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 ;P
    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.

0

Facet, chyba sobie żartujesz. Wklej fragment, który wywala błąd a nie każ nam to przepisywać i kompilować lub, co gorsza, przegladać i analizować w przeglądarce. Pomóż innym pomóc sobie :)

0

Ok sorry.Zamiescilem caly kod b omyslalem ze latwiej bedzie wykryc,ale w sumie masz racje lepiej jak podam procedure w ktorej jest blad:


SERWER

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;

To w niej musi wystepowac błąd (I/O error 103) wystepuje po (niby zakonczeniu)sciagania pliku u osoby która ma uruchomiony serwer.Bo tu plik jest wysyłany Klient-->>Serwer. No błędem jest to że ściąga się tylko małą część z pliku.

0

Błąd wejścia/wyjścia o numerze 103 (wyjątek EInOutError z numerem błędu 103) to wedle helpa do Delphi "File not open". Przejrzyj debuggerem ten kod, gdzie występuje błąd.

0

Dziwne jest tylko dla mnie że ten błąd występuje jeśli serwer uruchomie u kogoś w sieci.Bo gdy testuje u siebie na kompier Serwer i Clienta to wszystko jest ok.Plik w całości sie kopiuje i zaden bład nie wystepuje.

0

hym ..to troche off-topic ale otrzymuje podobny error..
napisalem kod który bedzie czytal textfile i pokazywal go w memo ( ambitne wiem ).
i'm mam

AssignFile(Plik, costam.txt);
Reset(Plik);

no i wszystko pieknie dziala, ale chcialem zeby czytal ten plik z servera

no to pisze

AssignFile(Plik, http://localhost/costam.txt);
Reset(Plik);

w tym momencie dostaje error I/O 123 ( nie znalazlem jego opisu w helpie )
ale sprobowalem innej kombinacji i usunalem Reset(Plik);

Tym razem dostalem error I/O 104 ( znalazlem w helpie ale nic mi to nie mowi)

za pomoc bede wdzieczny ^^

0

chyba masz jakiś nawyk z php, assignfile otwiera pliki lokalne, do pobierania pliku z sieci musisz użyć np IdHTTP

0

Przy odczycie robisz AssignFile, potem Reset.
Przy zapisie natomiast po AssignFile powinno być Rewrite.

1 użytkowników online, w tym zalogowanych: 0, gości: 1