Einzelnen Beitrag anzeigen

Evilboyz

Registriert seit: 14. Jan 2003
78 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#15
  Alt 30. Jan 2003, 08:58
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;
  Mit Zitat antworten Zitat