Hallo Jan,
also grundsätzlich konnte ich in Deinem Code mal keinen Fehler entdecken. Fehler 10052 bedeutet laut Delphi Hilfe "Verbindung pausiert, wenn SO_KEEPALIVE gesetzt wird." .... Soweit ich mich erinnern kann, hatte ich den Fehler auch hin und wieder, wenn eine Seite des Programms unplanmäßig beendet wurde.
Ansonsten hast Du, um die Verbindung aufzubauen, Socket.open verwendet, ich habe das über socket.active := true gemacht, aber das kann ja eigentlich keinen Unterschied machen!
Außerdem habe ich (siehe weiter oben) den Filestream vor dem schreiben beim Empfänger auf die letzte Position gesetzt. Das hat zwar sicher nichts mit Deinem Problem zu tun, allerdings habe ich damit noch ein Problem! Und zwar wird die Datei bei mir wunderbar übertragen, allerdings schleichen sich beim Schreiben dann falsche Bits, nämlich die der Bufferinitialisierung, ein, wenn meine Datei über 100 KB hat. Hat einer eine Idee, woran das liegen könnte?
Ich poste einfach mal meinen Code ... @jan: Vielleicht hilft er Dir ja weiter!?!
Server (Dateisender):
Code:
procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var fsWork : TFileStream;
sBuffer, sIncome : String;
begin
sIncome := Socket.ReceiveText;
if sIncome='GetUpdate' then begin
fsWork := TFileStream.Create('datei\bindif.exe', fmOpenRead);
sBuffer := StringOfChar(#0,fsWork.Size);
try
// Komplett in Buffer einlesen
fsWork.Read(sBuffer[1],fsWork.Size);
finally
FreeAndNil(fsWork);
end;
if Socket.SendBuf(sBuffer[1],Length(sBuffer))=-1 then
showMessage('Es konnte keine Datei übertragen werden')
else begin
Events.Lines.Add('Datei wurde erfolgreich an Client übertragen');
end;
end
end;
procedure TForm1.ConnectClick(Sender: TObject);
begin
ServerSocket.Port := StrToInt(Port.Text);
ServerSocket.active := true;
PageControl.ActivePage := TabSheet1;
end;
procedure TForm1.DisconnectClick(Sender: TObject);
begin
ServerSocket.active:=false;
Events.Lines.Add('Server disconnected');
Clients.Text := '0';
end;
Client (Dateiempfänger):
Code:
procedure TForm1.ConnectClick(Sender: TObject);
begin
ClientSocket1.Port := StrToInt(Port.Text);
ClientSocket1.Host := Host.Text;
ClientSocket1.active := true;
end;
procedure TForm1.DisconnectClick(Sender: TObject);
begin
ClientSocket1.Active:=false;
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
fsData : TFileStream;
sBuffer : String;
begin
fsData := TFileStream.Create('datei\bindif.exe',fmOpenWrite);
try
sBuffer := StringOfChar(#23,Socket.ReceiveLength);
if Socket.ReceiveBuf(sBuffer[1],Socket.ReceiveLength) <> -1 then
begin
fsData.Seek(0, SoFromEnd); //Hier scheint irgendwie noch ein
//Problem aufzutreten
fsData.Write(sBuffer[1],length(sBuffer));
Events.Lines.Add('Datenblock empfangen');
end;
finally
FreeAndNil(fsData);
end;
end;