TSocketStream - wann sind Daten vorhanden?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

PhillipK

Betreff: TSocketStream - wann sind Daten vorhanden?

BeitragSa, Aug 13, 2011 6:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Heyho!

Vorweg: Ich weiß, es gibt Netzwerklibs. Und ich weiß, das diese vieeel einfacher sind, als selbst was zu schreiben. Aber mal ehrlich: WAS lerne ich denn damit? Garnichts!

Und darum bin ich hier Smile

Jetzt, da mein BCC beitrag oben ist, kann ich mein Snakespiel verändern wie ich möchte. Das heißt erstmal: Netzwerktechniken lernen und im Snakespiel evtl eine Netzwerkanbindung reinbringen.

Hier stoße ich aber, wie zu erwarten war, direkt auf ein Problem Smile

Vorher habe ich mit einem mod namens TNet (oderso?) meine Netzwerkschnittstellen gebastelt und hab mich Ziemlich daran gewöhnt.
Nach kurzem suchen hier im Forum, kam ich auf einen ersten Hinweis, wie so ne Netzwerkverbindung aussieht.
Ohne großes Vorwissen, hinein in die Schlacht! Very Happy


Ich musste schnell feststellen, wenn ich der Clientseite einen Integer in den Stream schreibe und auf der Serverseite einen Byte auslese, gibts einen Error (bla, streamlesen nicht möglich).
Allerdings Integer zu Interger klappte.

Was tun? Genau. Ein kleines Puffer-type schreiben, welches mir die daten in einen String (faulheit, optimaler wäre n richtiger Byte-array), schreibt und diese byte für byte einträgt.
Auf der Gegenseite wird also wieder so n datenbatzen ausgelesen und per umkehrfunktion ausgelesen.

Hierzu verwende ich flags innerhalb meines Datenbatzens: _int:Byte, _byte:Byte usw.

Mein Code:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Const _int:Byte = 255
Const _String:Byte = 254
Const _Byte:Byte = 253
Const _Short:Byte = 252
Const _minInt:Int = 2 ^ 32
Const _maxInt:Int = Abs(_minInt)
Print _minInt

Local clientSocket:TSocket = CreateUDPSocket()
Local serverSocket:TSocket = CreateUDPSocket()

Print DottedIP(HostIp("localhost"))

clientSocket.Bind(8000)
serverSocket.Bind(8001)
clientSocket.Connect(HostIp("localhost") , 8001)


Local clientStream:TSocketStream = CreateSocketStream(clientSocket)


Local puffer:TStreamPuffer = New TStreamPuffer

puffer.WriteByte(200)
puffer.WriteString("omg wtf bbq? 32434234234wefddsfasdfasdgahfdhsgjkhfkajrfhwekrhewjkcvhdfsgjkawhertjkwehriuewheiurzh3245h32riueh8937rz9e8rz23h9r2h398")
puffer.Send(clientStream)


Local serverStream:TSocketStream = CreateSocketStream(serverSocket)

Local bufferLen:Int = serverStream.ReadInt()
Local buffer:Byte[] = New Byte[bufferLen]
serverStream.Read(Varptr(buffer[0]), bufferLen)
Print "okay?"
TStreamPuffer.DebugPrintPuffer(buffer)

serverStream.Close()
clientStream.Close()
serverSocket.Close()
clientSocket.Close()

Local by:Byte[] = [Byte(55), Byte(66), Byte(77), Byte(88)]
Print Byte2Int(Int2Bytes(1337))

Type TStreamPuffer
Field data:String = ""

Method WriteInt(zahl:Int)
Self.data:+Chr(_int) + IntToString(zahl)
End Method

Method WriteString(str:String)
Self.data:+Chr(_String) + IntToString(Len(str)) + str
End Method

Method WriteByte(zahl:Byte)
Self.data:+Chr(_Byte) + Chr(zahl)
End Method

Method Send(StreamTo:TSocketStream)
Print "Data: " + Self.data
StreamTo.WriteInt(Len(Self.data))
StreamTo.Write(Self.data.ToCString(), Len(Self.data))

Print "Daten senden abgeschlossen. Gesendete Bytes: " + Len(Self.data)
End Method

Method IntToString:String(zahl:Int)
Return Chr((zahl & 255) Shl 24) + Chr((zahl & 255) Shl 16) + Chr((zahl & 255) Shl 8) + Chr((zahl & 255))
End Method

Function DebugPrintPuffer(data:Byte[])
Local dataPos:Int = 0

While dataPos < Len(data)
Print "DATAPOS: " + dataPos
Select data[dataPos]
Case _int
Print "INTEGER: " + Byte2Int(data[dataPos + 1..dataPos + 5])
dataPos:+5
Case _String
Local laenge:Int = Byte2Int(data[dataPos + 1..datapos + 5]) + 1
Print "STRING LAENGE: " + laenge
dataPos:+4
Print "STRING: " + String.FromBytes(Varptr(data[dataPos]), laenge)
dataPos:+laenge
Case _Byte
Print "BYTE: " + data[dataPos + 1]
dataPos:+1
Default
Print "nix? :( " + dataPos
End Select
dataPos:+1
Wend
End Function
End Type

Function Int2Bytes:Byte[] (zahl:Int)
Return[Byte(zahl Shr 24), Byte((zahl Shr 16) & 255), Byte((zahl Shr 8) & 255), Byte(zahl & 255)]
End Function

Function Byte2Int:Int(zahl:Byte[])
Return Byte(zahl[0] Shl 24) | Byte((zahl[1] Shl 16) & 255) | Byte((zahl[2] Shl 8) & 255) | Byte(zahl[3] & 255)
End Function


An sich hauts schon hin. Hier und da ein paar speedtests machen und abwägen, was einfacher/schneller ist. Was mehr effizienz bietet oder gar nen anderes Data-sammel-packet schreiben.

Was mir aber größtes Kopfzerbrechen bereitet:
wenn ich auf den Serverstream (wahrscheinlich auch auf den Clientstream? noch nicht getestet) eine der Readfunktionen ausführe, gibts .. nix. Verbindung blockiert (mein programm wartet wohl darauf, das endlich was zu Readen ist?)
Folge ist ein Programmabsturz.

Serverstream.Size() o.ä kann ich nicht auslesen, genausowenig wie EOF(Serverstream) - gibt mir beides immer 0.
Das ganze habe ich sowohl als TStream wie auch als TSocketStream probiert Sad

Nun frage ich mich, wie stelle ich das am dämlichsten an? Andere netzwerklibs müssen so oder so etwas ähnliches machen und ich bin mir fast sicher, sie müssen Streams nutzen - wie wird im Optimalfall ein vorhandensein von Paketen überprüft?

ZEVS

BeitragSa, Aug 13, 2011 16:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe nicht ganz, wieso du nicht weißt, was für eine Art Daten da kommen. Dafür gibt es doch Protokolle. Der Server weiß doch anhand der bisher gesendeten Daten, was für Daten er erwarten muss.
Damit haben sich in meinen Augen deine ganzen _* Variablen erledigt, genauso wie der Type TStreamPuffer. Somit sind von deinem Code nur noch Bruchstücke übrig, sodass ich mutivierend sagen kann: Falsches Konzept, mach es noch mal neu! Und wenn du Netzwerktechniken erst lernen willst, fang besser mit TCP an, das ist wesentlich einfacher und ist nur ein wenig langsamer.
ZEVS
 

PhillipK

BeitragMo, Aug 15, 2011 7:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hachja.. ich und meine ideen Very Happy

Aber du hast recht, ich habe ein wenig blauäugig Programmiert.
Ich habe mich nun ein wenig mehr mit der TStream klasse befasst und erarbeite mit solangsam ein konzept Sad

Allerdings hat mir BNetEx als vorlage doch super dienste geleistet - hätte nicht gedacht, das der Code so schön kommentiert und übersichtlich gehalten ist. Ich denke, das werde ich zum lernen nutzen.

(erst denken, dann forum posten *merk*)

Entschuldigt :3

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group