Kann mir einer ein "ReceiveNetworkString()" bastel

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Kann mir einer ein "ReceiveNetworkString()" bastel

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag 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
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag 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.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

@DD: Was is denn der Unterschied zwischen deiner SendNetworkString-Procedure, und der, die in PureBasic implementiert ist?
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Achso, stimmt, das hatte ich übersehen. :oops:
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag 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.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Antworten