Erweiterung für Bentschi's Socket Class (überarbeitet)

Veröffentliche deine funktionierenden Skripte und Funktionen

Moderator: jNizM

struppi81
Posts: 9
Joined: 17 Oct 2014, 15:44

Erweiterung für Bentschi's Socket Class (überarbeitet)

18 Oct 2014, 05:38

Hallo,

für alle die, die Bentschi's neue Socket Class: http://www.autohotkey.com/board/topic/9 ... rarbeitet/
nutzen und eine Funktion für das Senden einer Datei vermissen, habe ich mal eine kleine Erweiterungen geschrieben.


SendFilePackages()
RecvFilePackages()

Code: Select all

SendFilePackages(filepath, package_size=1024)
  {
    FileObj := fileopen( filepath, "r")
    VarSetCapacity(buf, FileObj.length)
    FileObj.RawRead(&buf, FileObj.length)
    
    Stringsplit, filepath, filepath, \
    filename := filepath%filepath0%                            ; Dateiname Rausfiltern
    
    len := FileObj.length
    pos := &buf

    this.sendText(filename ":" len ":" package_size)           ; Header
    this.recvText() 

    while (len>0)
          {
          current_len := (len>=package_size) ? package_size : len
          this.send(pos, current_len)

          len -= current_len  
          pos += current_len
          this.recvText()
          }
    FileObj.close()
  }

  RecvFilePackages(filepath="")
  {
    Header := this.recvText()

    Stringsplit, Header, Header, :

    num_packages := Ceil(Header2/Header3)                      ; Anzahl der Packete aufgerundet 

    If (filepath = "") 
       {
       IfExist, %A_Scriptdir%\%Header1%
              filepath := A_Scriptdir "\" "Kopie von " Header1
           else
              filepath := A_Scriptdir "\" Header1
       }
    else
       {
       filepath := filepath "\" Header1
       }

    FileObj := fileopen(filepath, "w") 

    this.sendText("#")

    Loop, % num_packages
        {     
        len := this.recv(buffer)
        FileObj.RawWrite(&buffer, len)
        If (A_Index = num_packages)
           {
           FileObj.close()
           }
        this.sendText("#")
        }          
  }
Die "package_size" kann bis auf 4096KB erhöht werden.
Obwohl 8192KB theoretisch möglich wären, kommt es aber dann zu Fehlern.

Vielleicht kann es ja jemand gebrauchen.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Erweiterung für Bentschi's Socket Class (überarbeitet)

18 Oct 2014, 06:59

Es wäre schneller eine Package size zu benutzen die nicht festgelegt ist. .Send() gibt die Grösse des gesendeten Packages zurück.
Wenn du nun anstatt einer Package size immer die maximale Grösse anfordern würdest, und dann die von der .Send() Funktion tatsächlich gesendete Grösse verrechnen würdest, könntest du viel schnellere Geschwindigkeiten erhalten.
Recommends AHK Studio
struppi81
Posts: 9
Joined: 17 Oct 2014, 15:44

Re: Erweiterung für Bentschi's Socket Class (überarbeitet)

18 Oct 2014, 17:02

Danke für deine Hilfe nnnik, aber könntest du mir noch ein bisschen auf die Sprünge helfen. :roll:
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Erweiterung für Bentschi's Socket Class (überarbeitet)

19 Oct 2014, 00:22

Ich meinte es in ungefähr so:

Code: Select all

  SendPackages(byref Buffer,Len)
  {
    static blenlen:=VarSetCapacity(blen,4)
    pBuffer:=&Buffer
    Numput(Len,blen,0,"UInt") ;Header ist nur noch die Grösse
    This.Send(&blen,4)
    While (Len!=0)
    {
      This.recv(blen) ;blen wird nicht mehr gebraucht und könnte wieder neu Hergestellt werden.
      SendSize:=This.Send(pBuffer,Len)
      Len-=SendSize
      pBuffer+=SendSize
    }
    This.recv(blen)
    return pBuffer-&Buffer
  }
  
  RecvPackages(byref Buffer)
  {
    static blenlen:=VarSetCapacity(blen,4)
    This.Recv(blen)
    Len:=NumGet(blen,0,"UInt")
    CLen:=0
    VarSetCapacity(Buffer,Len,0)
    
    While (CLen<Len)
    {
      This.SendText("#")
      CLen+=This.Recv(&Buffer+CLen)
    }
      This.SendText("#")
    return CLen
  }
Recommends AHK Studio
struppi81
Posts: 9
Joined: 17 Oct 2014, 15:44

Re: Erweiterung für Bentschi's Socket Class (überarbeitet)

21 Oct 2014, 07:10

Ah, jetzt verstehe ich.

Doch leider, das hatte ich vorher so auch schon mal getestet, sendet Send() die volle Länge und nicht die maximale mögliche Package Size.
Somit wird bei der SendPackages Fkt. schon nach dem ersten Send() die While Schleife abgebrochen,
weil Send() die volle Länge zurück gibt und Len = 0 ist.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Erweiterung für Bentschi's Socket Class (überarbeitet)

21 Oct 2014, 09:55

weil Send() die volle Länge zurück gibt und Len = 0 ist.
Ich würde wiedersprechen:

Code: Select all

  send(addr, length)
  {
    if ((r := DllCall("ws2_32\send", "ptr", this.socket, "ptr", addr, "int", length, "int", 0, "int"))<=0)
      return 0
    return r
  }
Daher gibt Send das Ergebnis des DllCalls der Windows ws2_32\send funktion zurück.
Und laut MSDN:
Return value

If no error occurs, send returns the total number of bytes sent, which can be less than the number requested to be sent in the len parameter.
BTW mir ist grad ein Fehler bei der SendPackages Funktion aufgefallen.
Recommends AHK Studio
struppi81
Posts: 9
Joined: 17 Oct 2014, 15:44

Re: Erweiterung für Bentschi's Socket Class (überarbeitet)

22 Oct 2014, 01:26

Hi,
hast du die Funktionen schon erfolgreich in der Praxis getestet?
Es ist wirklich so!
Ich will dich ganz bestimmt nicht ärgern!
Send() gibt die komplette Länge zurück.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Erweiterung für Bentschi's Socket Class (überarbeitet)

22 Oct 2014, 10:19

Dann hat er in einem rutsch alles gesendet.
Das könnte viele Gründe haben. Ich nehme mal an das du alles der Einfachheit halber an Localhost gesendet hast, oder?
Recommends AHK Studio
struppi81
Posts: 9
Joined: 17 Oct 2014, 15:44

Re: Erweiterung für Bentschi's Socket Class (überarbeitet)

22 Oct 2014, 12:17

Ja, habe es erst einmal nur mit "Localhost" getestet. (Server: 0.0.0.0, Client: 127.0.0.1)

BTW habe bei "SendPackages" noch einen kleinen Fehler entdeckt (Len-=SenSize => Len-=SendSize)

Return to “Skripte und Funktionen”

Who is online

Users browsing this forum: No registered users and 78 guests