Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#28

Re: wie versende ich mit tclient/serversocket eine datei?

  Alt 7. Feb 2007, 13:01
1. Der Buffer braucht nur "Package" gross sein - schliesslich nutzt du auch nur soviel von ihm.
2. Der Socket hat intern einen Puffer und füllt den immer nur bis zu seiner Maximalgrösse. Wenn du nun mit SendBuf() Daten hinein schreibst, dann gibt dir SendBuf() zurück, wieviel er davon in seinen internen Buffer aufgenommen hat. Daher muss du auch darauf resgieren und entsprechend auch mal Teile von deinem Buffer erneut dem SendBuf() übergeben.
Zitat von Delphi Hilfe:
Bei nicht-blockierenden Sockets werden die Daten an die WinSock DLL gesendet, die über eigene interne Puffer verfügt. Wenn WinSock weitere Daten akzeptieren kann, gibt SendBuf sofort die Anzahl der Byte in der Warteschlange zurück. Wenn der interne Puffer von WinSock den gesendeten Puffer nicht mehr aufnehmen kann, gibt SendBuf -1 zurück, und es werden keine Daten in die Warteschlange übernommen. In diesem Fall müssen Sie etwas warten, bis WinSock die sich bereits in der Warteschlange befindlichen Daten gesendet hat und es dann erneut versuchen.
3. Read() vom TStream gibt dir zurück, wieviele Bytes er ausgelesen hat. Somit kannst du leicht den Rückgabewert von Read() nutzen um ihn beim SendBuf() entsprechend anzugeben. Hierdrüber kannst du dir auch leicht deine letzte "Sonder-If-Abfrage" für das "Reste-senden" sparen.
4. Du hast selber schon geschrieben (fälschlicherweise wahrscheinlich), dass es noch die Methode SendStream() gibt. Diese erledigt alle von dir gesuchten Aufgaben asynchron. Du gibst ihr ein TStream Nachkomme (z.B. TFileStream) und sie kümmert sich um das Senden des Streams. Wenn der Stream erfolgreich gesendet wurde, dann gibt der Socket den Stream auch weider automatisch frei. Die SendStream() beinhaltet dein gesamten Code samt Warten etc. Du darfst nach der Übergabe der TStream Instanz diese nicht mehr weiter verwenden in deinem Programm, da der Socket in seinem Thread damit arbeitet.

PS: Und ja, so wie du es umgesetzt hast meinte ich es auch...
  Mit Zitat antworten Zitat