Seite 1 von 2

Kann mir einer ein "ReceiveNetworkString()" bastel

Verfasst: 15.10.2005 15:27
von AND51
Hallo!

Der Titel dieses Posts macht es ja schon deutlich.

Ich kenne mich noch nicht so aus mit Speicherbuffern und so, aber ich lerne.
Daher meine Frage. Kann einer ein ReceiveNetworkString() basteln? Wäre für euch eine Übung, und für mich ein Segen.
Ich habe nur 1 Bedingung, die muss nicht 100%ig erfüllt werden, nur so weit, wie es geht.

1. Die Procedure sollte möglichst schlank und schnell sein. Außerdem sollten Konflikte mit Variablennamen umgangen werden. Das geht doch mit Protected, oder? Nicht, dass ich im Hauptprogramm eine Variable verwende, die schon in der Procedure da ist...

Der Rückgabewert der Procedure sollte der empfange String sein.
Sodass ich schreiben kann

Code: Alles auswählen

a$ = ReceiveNetworkString(ClientID oder ServerID)
; a$ ist der empfangene String
Also im Prinzip sollte mir die Prozedur die Arbeit mit mit dem Speicherbuffer-zeugs ersparen. Außerdem währe dies vielleicht auch eine Hilfe für andere PB-Anfänger.


Selbstverständlich habe ich schon im Forum gesucht, bin aber nur hier fündig geworden:
http://forums.purebasic.com/german/view ... workstring
Diesen Link könnt ihr natürlich als Hilfe nehmen, wenn ihr wollt.
Leider erspart mir das aber nicht den umgang mit Speicheradressen und so.

Wenn ihr noch weitere Informationen benötigt, dann fragt einfach!
Danke schon mal für eure Bemühungen und eure posts.

Verfasst: 15.10.2005 15:41
von Laurin

Code: Alles auswählen

Procedure.s ReceiveNetworkString(ClientID.l)
  Protected Puffergroesse.l, *MemoryID.l, Laenge.l, Temp.s
  
  Puffergroesse = 8192
  
  *MemoryID = AllocateMemory(Puffergroesse)
  
  If *MemoryID
    Repeat
      Laenge = ReceiveNetworkData(ClientID, *MemoryID, Puffergroesse)
      Temp + PeekS(*MemoryID, Puffergroesse)
    Until Laenge < Puffergroesse
  
    FreeMemory(*MemoryID)
  EndIf
  
  ProcedureReturn Temp
EndProcedure

Verfasst: 15.10.2005 15:58
von AND51
Hallo Laurin!

Danke für dein Werk!
Kann ich damit auch beliebig große Strings übertragen lassen?
Da steht, dass die Puffergröße nur 8 Kilobyte groß ist. Ist das schlimm, wenn mein STring, 10 KB groß ist?

Verfasst: 15.10.2005 16:01
von hardfalcon
Dann wird dein String halt bei den 8KB abgeschnitten. Ich würde das Limit auf 64000 Bytes setzen, da das auch das Limit für PureBasic-Strings ist.

Verfasst: 15.10.2005 16:02
von AND51
Also, dass in PB Strings nur ~64 KB groß sein dürfen, das wusst ich, aber ich wusste nciht, dass der dann halt abgeschnitten wird. danke!

Verfasst: 15.10.2005 16:07
von DarkDragon

Code: Alles auswählen

InitNetwork()

Procedure.s ReceiveNetworkString(ConnectionID)
  Text.s = ""
  Repeat
    length = ReceiveNetworkData(ConnectionID, @char.b, 1)
    If char <> 0
      Text.s + Chr(char.b)
    EndIf
  Until char.b = 0 ;Such einfach daten bis eine 0 kommt.
  ProcedureReturn Text.s
EndProcedure

Procedure.l SendNetworkString2(ConnectionID, Text.s)
  ProcedureReturn SendNetworkData(ConnectionID, @Text, Len(Text)+1)
EndProcedure

If CreateNetworkServer(6000)
  ConnectionID = OpenNetworkConnection("127.0.0.1", 6000)
  If ConnectionID
    SendNetworkString2(ConnectionID, "blah blablah blablablablah!")
    Delay(10)
    SendNetworkString2(ConnectionID, "muuuuuuuh!")
    Delay(10)
    While NetworkServerEvent() <> 2 : Delay(1) : Wend
    ClientID = NetworkClientID()
    Debug ReceiveNetworkString(ClientID)
    Debug ReceiveNetworkString(ClientID)
  EndIf
  CloseNetworkServer()
EndIf
Hier musst du halt SendNetworkString2 anwenden.

Verfasst: 15.10.2005 16:09
von hardfalcon
@DD: Was is denn der Unterschied zwischen deiner SendNetworkString-Procedure, und der, die in PureBasic implementiert ist?

Verfasst: 15.10.2005 16:11
von DarkDragon
hardfalcon hat geschrieben:@DD: Was is denn der Unterschied zwischen deiner SendNetworkString-Procedure, und der, die in PureBasic implementiert ist?
SendNetworkString sendet die 0 nicht am Ende jedes Strings.

Verfasst: 15.10.2005 16:14
von hardfalcon
Achso, stimmt, das hatte ich übersehen. :oops:

Verfasst: 15.10.2005 16:56
von Laurin
> Da steht, dass die Puffergröße nur 8 Kilobyte groß ist. Ist das schlimm, wenn mein STring, 10 KB groß ist?

> Dann wird dein String halt bei den 8KB abgeschnitten.

Habt ihr euch den Quelltext nicht durchgelesen? Da ist eine Schleife.
Wenn die Daten > 8 KB sind, dann wird sie nochmal durchlaufen , sodass alle Daten abgefragt werden.