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.