Probleme mit TCP?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

bruce85

Betreff: Probleme mit TCP?

BeitragSo, Sep 19, 2010 3:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
beim Server stelle ich z.B. eine beliebige SpielerAnzahl ein und wenn ein Client Connected, dann soll der Server die SpielerAnzahl an den Clienten schicken.
Irgendwie funktioniert das nicht so wie ich es versucht habe, sobald ein Client Connected ist und ich beim Clienten mit ReadLine etwas auslesen möchte, dann hängt sich das Fenster beim Clienten auf.

Hier mal mein Code:
BlitzMax: [AUSKLAPPEN]
If Server = 1 Then
receivesocket = SocketAccept(TCP_SOCKET)
TCP_STREAM = CreateSocketStream(receivesocket)
If receivesocket <> Null Then
tmpSpielerID = tmpSpielerID + 1
Local n:String = ReadLine(TCP_STREAM) 'Spielername lesen
For Local i:Int=0 To SpielerAnzahl-1
If Spieler[i].SpielerID = tmpSpielerID Then
Spieler[i].Joined = 1
Spieler[i].Name = n
Spieler[i].receivesocket = receivesocket
Spieler[i].TCP_SOCKET = TCP_SOCKET
Spieler[i].TCP_SOCKET_STREAM = TCP_SOCKET_STREAM
Spieler[i].TCP_STREAM = TCP_STREAM
EndIf
Next
For Local i:Int=0 To SpielerAnzahl-1
If Spieler[i].Joined = 1 Then
If Spieler[i].Server = 0 Then
'WriteLine Spieler[i].TCP_STREAM,SpielerAnzahl 'SpielerAnzahl an alle Clienten schicken
EndIf
EndIf
Next
WriteLine TCP_STREAM,SpielerAnzahl 'SpielerAnzahl zum aktuellen Clienten schicken
EndIf
Else
If TCP_STREAM <> Null Then
While Not Eof(TCP_STREAM)
SpielerAnzahl = Int(ReadLine(TCP_STREAM)) 'Hier ist der Fehler........
Wend
EndIf
EndIf

For Local i:Int=0 To SpielerAnzahl-1
If Spieler[i].Joined = 1 Then
DrawText Spieler[i].Name,200,200+i*30
Else
DrawText "Warte auf Spieler...",200,200+i*30
EndIf
Next


Weiss Vielleicht jemand was ich da falsch gemacht habe?

Ich bedanke mich schonmal im Voraus.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
 

c64

BeitragSo, Sep 19, 2010 9:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Bin dein Code nur grob überflogen aber wenn du Integer's verschickst dann nich per Write/Read- Line, sende Sie dann nur mit Write/Read Int. Ist eindeutiger und erzeugt keine Redundanzen, erspart dir das Casten.

mfg. c64
Betreten verboten! Kinder haften für ihre Eltern!
 

bruce85

BeitragMo, Sep 20, 2010 4:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank.

Das Verbinden zum Server funktioniert, aber sobald ich etwas zum Clienten schicken möchte, dann hängt sich das Fenster vom Clienten auf.

Der Stream ist in Type gespeichert und sobald der Server die Verbindung vom Clienten aktzeptiert hat, dann speicher ich den Stream in Type.

So schreibe ich dann in den Stream von den Clienten:
BlitzMax: [AUSKLAPPEN]
'Server
Spieler[i].TCP_STREAM = TCP_STREAM
WriteLine Spieler[i].TCP_STREAM,1
WriteLine Spieler[i].TCP_STREAM,SpielerAnzahl


und so habe ich es testhalber mal getestet ob der Stream angekommen ist beim Clienten:
BlitzMax: [AUSKLAPPEN]
'Client
If TCP_STREAM <> Null Then
While Not Eof(TCP_STREAM)
Print Int(ReadLine(TCP_STREAM))
Print Int(ReadLine(TCP_STREAM))
Wend
EndIf


Sobald ich beim Clienten etwas vom Stream auslesen möchte, dann hängt sich das Fenster sofort auf.

Ich wäre euch sehr dankbar, wenn mir jemand weiterhelfen könnte.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
 

bruce85

BeitragMo, Sep 20, 2010 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe jetzt noch ein Delay eingebaut und jetzt hängt sich das Programm auch nicht mehr auf.
BlitzMax: [AUSKLAPPEN]
'Client
If Eof(TCP_STREAM) <> 0 Then
Print "Test: "+ReadLine(TCP_STREAM)
EndIf
Delay 10


Aber irgendwie empfängt der Client keine Daten vom server, wieso eigentlich?
Muss ich den Stream Vielleicht neu einlesen oder so?

Edit: Jetzt funktioniert das empfangen, nur erreiche ich nie das ende der Stream und somit habe ich eine endlos-schleife und dann hängt sich mein Programm auf:
BlitzMax: [AUSKLAPPEN]
While Not Eof(TCP_STREAM)
Print "Test: "+ReadLine(TCP_STREAM)
Wend


Was habe ich falsch gemacht?

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
 

bruce85

BeitragDi, Sep 21, 2010 5:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist wohlmöglich ein Bug in BlitzMax, habe diesen Code umgeschrieben für Blitz Basic und dort funktioniert es ohne probleme.
Ich sitze schon seit mehrere Stunden/Tage und versuche einfach nur etwas vom Stream auszulesen, den der Server geschickt hat.
In BlitzMax hängt sich das Fenster sofort auf wenn ich While Not Eof(Stream) benutze.

Naja, wie es aussieht kann mir da keiner weiterhelfen, ich werde einfach mit Blitz Basic weiter machen da es dort ja funktioniert.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

Lastmayday

BeitragDi, Sep 21, 2010 8:10
Antworten mit Zitat
Benutzer-Profile anzeigen
guten morgen!

also mit dem standart Modul komme ich auch nicht klar. dieses hier habe ich zurzeit in verwendung und bin ganz zufrieden.

für ein server - client spiel habe ich den code soweit modifiziert:

um ein "packet" zu versenden muss erst ein byte versendet werden der die größe des "packets" angibt. Es muss komplet verarbeitet werden oder zumindest bis zum nächsten verworfen werden.

(und write line für zahlen zu benutzen ist extrem performance raubend) Wink


Server:

BlitzMax: [AUSKLAPPEN]
SuperStrict
Import vertex.bnetex

Global openslots:Int = 0
Global maxopenslots:Int = 1
Global networkpacketsize:Int = 0

Global Server:TTCPStream = New TTCPStream
If Not Server.Init() Then Throw("Can't create socket")
If Not Server.SetLocalPort(8888) Then End ; Throw("Can't set local port")
If Not Server.Listen() Then Throw("Can't set to listen")

Type Tslot
Global list:TList = CreateList()
Field client:TTCPStream
Field active:Byte, close:Byte, login:Byte, name:String

Method free()
list.remove(Self)
EndMethod
End Type


Global timer:TTimer = CreateTimer(10)
While Not AppTerminate()
timer.Wait()

If openslots < maxopenslots Then
openslots:+1
Local nslot:tslot = New tslot
Tslot.list.AddLast(nslot)
End If

For Local slot:tslot = EachIn Tslot.list

If slot.active = 0 Then
slot.client = Server.Accept()
If (slot.client <> Null) Then
Print("Client from '" + DottedIP(slot.client.GetlocalIP()) + "' connected!")
slot.active = 1
openslots:-1
EndIf
Else
If (slot.client <> Null) Then
'aktiv

If slot.client.GetState() <> 1 Then
slot.close = 1
Else

While slot.client.RecvAvail()
While slot.client.RecvMsg() ;Wend
If slot.client.Size() > 0 Then
Local networkround:Byte = True
While networkround
networkround = False
If slot.client.Size() >= 1 And networkpacketsize = 0 Then networkpacketsize = slot.client.ReadByte()
If networkpacketsize <= slot.client.Size() And networkpacketsize > 0 Then
networkround = True
networkpacketsize = 0
'empfangen
Select slot.client.ReadByte()
Case 1 'woot empfangen
Local lenght:Byte = slot.client.ReadByte() 'string laenge
Local msg:String = slot.client.ReadString(lenght)
Print(slot.name + " sagt: " + msg)

Case 100 'einloggen
slot.login = True

Local lenght:Byte = slot.client.ReadByte() 'string laenge
slot.name = slot.client.ReadString(lenght)

'[### PACK ###] = login bestaetigen
slot.client.WriteByte(1) '+++ size
slot.client.WriteByte(100)
'[###------###
End Select
EndIf
Wend
EndIf
Wend

If slot.login Then
'[### PACK ###] = wiederholt ein hallo senden
slot.client.WriteByte(1 + 1 + 5) '+++ size
slot.client.WriteByte(1) 'daten id byte
slot.client.WriteByte(5) 'string laenge
slot.client.WriteString("hallo")
'[###------###
EndIf

slot.client.SendMsg()
EndIf

Else
'geschlossen
slot.close = 1
End If
EndIf

If slot.close Then
Print ("Client disconnected!")

slot.client.close()
slot.free()
EndIf

Next

'spiel funktionen hier abarbeiten

Wend



Client:
BlitzMax: [AUSKLAPPEN]
SuperStrict
Import vertex.bnetex

Global networkpacketsize:Int = 0
Global lastmsg:String, logedin:Int, sendtimer:Int

Graphics(1024,768)

Global client:TTCPStream = New TTCPStream
If Not client.Init() Then Throw("Can't create socket")
If Not client.SetLocalPort() Then Throw("Can't set local port")
client.SetRemoteIP(TNetwork.intIP("127.0.0.1"))
client.SetRemotePort(8888)
If Not client.Connect() Then Throw("Can't connect to host")

'[### PACK ###] = login senden
client.WriteByte(1 + 1 + 4) '+++ size
client.WriteByte(100)
client.WriteByte(4)
client.WriteString("Name")
'[###------###

While Not (KeyHit(KEY_1) Or AppTerminate())

Cls

DoNetwork()


DrawText("logedin: " + logedin, 10, 100)
DrawText("Letzte Nachricht: " + lastmsg,10,110)


Flip(1)
Wend

End




Function DoNetwork()
If client.GetState() <> 1 Then

client.close() ; End
Else
While client.RecvAvail()
While client.RecvMsg() ;Wend
If client.Size() > 0 Then
Local networkround:Byte = True
While networkround
networkround = False
If client.Size() >= 1 And networkpacketsize = 0 Then networkpacketsize = client.ReadByte()
If networkpacketsize <= client.Size() And networkpacketsize > 0 Then
networkround = True
networkpacketsize = 0
'empfangen
Select client.ReadByte()
Case 1'hallo empfangen
Local lenght:Byte = client.ReadByte() 'string laenge
lastmsg = client.ReadString(lenght)

Case 100 'eingeloggt
logedin = 1
End Select
EndIf
Wend
End If
Wend

'senden
If sendtimer < MilliSecs() Then
sendtimer = MilliSecs() + 1000

'[### PACK ###] = wiederholt ein woot senden
client.WriteByte(1 + 1 + 4) '+++ size
client.WriteByte(1) 'daten id byte
client.WriteByte(4) 'string laenge
client.WriteString("woot")
'[###------###
EndIf

client.SendMsg()
EndIf
End Function


mfg Lastmayday
 

c64

BeitragDi, Sep 21, 2010 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
sagte ich bereits und trotz Danke fand es siehe Code kein Gehör Wink
Betreten verboten! Kinder haften für ihre Eltern!
 

bruce85

BeitragDi, Sep 21, 2010 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die antwort.

Ich wollte es eigentlich ohne Netzwerk Modul machen.

Hier ist mal ein Teil von meinem Code:
BlitzMax: [AUSKLAPPEN]
Function Multiplayer()
SetClsColor 127,127,127
Repeat
Cls

If Server = 1 Then
'Client erlauben zu verbinden
receivesocket = SocketAccept(TCP_SERVER_SOCKET)
TCP_SERVER_STREAM = CreateSocketStream(receivesocket)
If receivesocket <> Null Then
Local n:String
tmpSpielerID = tmpSpielerID + 1

Local t:Int = Int(ReadLine(TCP_SERVER_STREAM))
Select t
Case 1
n = ReadLine(TCP_SERVER_STREAM) 'Spielername lesen
For Local i:Int=0 To SpielerAnzahl-1
If Spieler[i].SpielerID = tmpSpielerID Then
Spieler[i].Joined = 1
Spieler[i].Name = n
TCP_STREAMS[i] = TCP_SERVER_STREAM
EndIf
Next
For Local j:Int=0 To SpielerAnzahl-1
If Spieler[j].Joined = 1 Then
If Spieler[j].Server = 0 Then
WriteLine TCP_STREAMS[j],1
WriteLine TCP_STREAMS[j],SpielerAnzahl
EndIf
EndIf
Next
End Select
'WriteLine TCP_STREAM,SpielerAnzahl 'SpielerAnzahl zum aktuellen Clienten schicken
EndIf
Else
'Client
While Not Eof(TCP_CLIENT_STREAM)
Print ReadLine(TCP_CLIENT_STREAM)
Print ReadLine(TCP_CLIENT_STREAM)
Wend
EndIf
SetColor 200,200,200
DrawText "Spieleranzahl: "+SpielerAnzahl,20,20
For Local i:Int=0 To SpielerAnzahl-1
If Spieler[i].Joined = 1 Then
DrawText Spieler[i].Name,300,230+i*30
Else
DrawText "Warte auf Spieler...",300,230+i*30
EndIf
Next
SetAlpha(1.0)

Flip
Until KeyHit(KEY_ESCAPE)
End Function


An dieser Position
BlitzMax: [AUSKLAPPEN]
While Not Eof(TCP_CLIENT_STREAM)

bleibt die Schleife einfach hängen.

Naja, wenn jemand ein Fehler sieht wieso die schleife unendlich durchläuft, dann wäre ich euch sehr dankbar.
Ansonsten wenn ich das nicht hinbekomme, dann verwende ich einfach das Netzwerk Modul.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
 

bruce85

BeitragDo, Sep 23, 2010 11:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo nochmal.
wenn ich das BNet Modul in meinem Project einbinde, dann kennt er die Standard befehle nicht mehr, er sagt z.B. Identifier 'TImageFont' not found oder Identifier 'TImage' not found u.s.w.

BlitzMax: [AUSKLAPPEN]
SuperStrict
Framework Vertex.BNetEx
Import Brl.LinkedList

Graphics 1024,768,0

SeedRnd MilliSecs()

Global Schrift1:TImageFont = LoadImageFont("font/Comic Sans MS.ttf",12)
Global Schrift2:TImageFont = LoadImageFont("font/Comic Sans MS.ttf",14)
Global Schrift3:TImageFont = LoadImageFont("font/Comic Sans MS.ttf",18)
Global Schrift4:TImageFont = LoadImageFont("font/Alpha Echo.ttf",20)

SetMaskColor 255,0,255
Global button001_png:TImage = LoadImage("button001.png")
Global button002_png:TImage = LoadImage("button002.png")
.......
.......


woran könnte das denn liegen?

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

Xeres

Moderator

BeitragDo, Sep 23, 2010 11:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du ein Framework benutzt, musst du alle nötigen Module mit Import dazuladen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Lastmayday

BeitragDo, Sep 23, 2010 12:22
Antworten mit Zitat
Benutzer-Profile anzeigen
genau wie Xeres sagte: (kleines beispiel)

BlitzMax: [AUSKLAPPEN]
Framework brl.math
Import brl.timer
Import brl.system
Import brl.stream
Import brl.standardio
Import brl.retro
Import brl.random
Import brl.pngloader
Import brl.pixmap
Import brl.max2d
Import brl.linkedlist
Import brl.jpgloader
Import brl.glmax2d
Import brl.d3d7max2d
Import brl.bmploader
Import brl.blitz
Import brl.basic
Import brl.polledinput
Import brl.d3d9max2d
Import vertex.bnetex


du kannst leicht herausfinden welches modul fehlt indem du die angezeigte funktion in der bmax hilfe suchst und dann auf der modul seite GANZ oben dir die erste zeile anschaust: "brl.xxx: Functions source" dann einfach die brl.xxx importen und fertig. =)

falls du auf meinem beispiel versuchen soltest etwas aufzubauen muss ich leider sagen das ich ein paar fehler drin hatte. (eine variable war im server auf global gesetzt, die in die type gehört und eine abfrage in schleifenform ist unnötig, was mehr geschwidigkeit bringt)

dieses hier ist jetzt up to date.
Client:
BlitzMax: [AUSKLAPPEN]
SuperStrict
Import vertex.bnetex

Global networkpacketsize:Int = 0
Global lastmsg:String, logedin:Int, sendtimer:Int

Graphics(1024,768)

Global client:TTCPStream = New TTCPStream
If Not client.Init() Then Throw("Can't create socket")
If Not client.SetLocalPort() Then Throw("Can't set local port")
client.SetRemoteIP(TNetwork.intIP("127.0.0.1"))
client.SetRemotePort(8888)
If Not client.Connect() Then Throw("Can't connect to host")

'[### PACK ###] = login senden
client.WriteByte(1 + 1 + 4) '+++ size
client.WriteByte(100)
client.WriteByte(4)
client.WriteString("Name")
'[###------###

While Not (KeyHit(KEY_1) Or AppTerminate())

Cls

DoNetwork()


DrawText("logedin: " + logedin, 10, 100)
DrawText("Letzte Nachricht: " + lastmsg,10,110)


Flip(1)
Wend

End




Function DoNetwork()
If client.GetState() <> 1 Then

client.close() ; End
Else
If client.RecvAvail() Then
While client.RecvMsg() ;Wend
If client.Size() > 0 Then
Local networkround:Byte = True
While networkround
networkround = False
If client.Size() >= 1 And networkpacketsize = 0 Then networkpacketsize = client.ReadByte()
If networkpacketsize <= client.Size() And networkpacketsize > 0 Then
networkround = True
networkpacketsize = 0
'empfangen
Select client.ReadByte()
Case 1'hallo empfangen
Local lenght:Byte = client.ReadByte() 'string laenge
lastmsg = client.ReadString(lenght)

Case 100 'eingeloggt
logedin = 1
End Select
EndIf
Wend
End If
EndIf

'senden
If sendtimer < MilliSecs() Then
sendtimer = MilliSecs() + 1000

'[### PACK ###] = wiederholt ein woot senden
client.WriteByte(1 + 1 + 4) '+++ size
client.WriteByte(1) 'daten id byte
client.WriteByte(4) 'string laenge
client.WriteString("woot")
'[###------###
EndIf

client.SendMsg()
EndIf
End Function


server:
BlitzMax: [AUSKLAPPEN]
SuperStrict
Import vertex.bnetex

Global openslots:Int = 0
Global maxopenslots:Int = 1


Global Server:TTCPStream = New TTCPStream
If Not Server.Init() Then Throw("Can't create socket")
If Not Server.SetLocalPort(8888) Then End ; Throw("Can't set local port")
If Not Server.Listen() Then Throw("Can't set to listen")

Type Tslot
Global list:TList = CreateList()
Field client:TTCPStream
Field active:Byte, close:Byte, login:Byte, name:String
Field networkpacketsize:Int = 0

Method free()
list.remove(Self)
EndMethod
End Type


Global timer:TTimer = CreateTimer(10)
While Not AppTerminate()
timer.Wait()

If openslots < maxopenslots Then
openslots:+1
Local nslot:tslot = New tslot
Tslot.list.AddLast(nslot)
End If

For Local slot:tslot = EachIn Tslot.list

If slot.active = 0 Then
slot.client = Server.Accept()
If (slot.client <> Null) Then
Print("Client from '" + DottedIP(slot.client.GetlocalIP()) + "' connected!")
slot.active = 1
openslots:-1
EndIf
Else
If (slot.client <> Null) Then
'aktiv

If slot.client.GetState() <> 1 Then
slot.close = 1
Else

If slot.client.RecvAvail() Then
While slot.client.RecvMsg() ;Wend
If slot.client.Size() > 0 Then
Local networkround:Byte = True
While networkround
networkround = False
If slot.client.Size() >= 1 And slot.networkpacketsize = 0 Then slot.networkpacketsize = slot.client.ReadByte()
If slot.networkpacketsize <= slot.client.Size() And slot.networkpacketsize > 0 Then
networkround = True
slot.networkpacketsize = 0
'empfangen
Select slot.client.ReadByte()
Case 1 'woot empfangen
Local lenght:Byte = slot.client.ReadByte() 'string laenge
Local msg:String = slot.client.ReadString(lenght)
Print(slot.name + " sagt: " + msg)

Case 100 'einloggen
slot.login = True

Local lenght:Byte = slot.client.ReadByte() 'string laenge
slot.name = slot.client.ReadString(lenght)

'[### PACK ###] = login bestaetigen
slot.client.WriteByte(1) '+++ size
slot.client.WriteByte(100)
'[###------###
End Select
EndIf
Wend
EndIf
EndIf

If slot.login Then
'[### PACK ###] = wiederholt ein hallo senden
slot.client.WriteByte(1 + 1 + 5) '+++ size
slot.client.WriteByte(1) 'daten id byte
slot.client.WriteByte(5) 'string laenge
slot.client.WriteString("hallo")
'[###------###
EndIf

slot.client.SendMsg()
EndIf

Else
'geschlossen
slot.close = 1
End If
EndIf

If slot.close Then
Print ("Client disconnected!")

slot.client.close()
slot.free()
EndIf

Next

'spiel funktionen hier abarbeiten

Wend
 

bruce85

BeitragDo, Sep 23, 2010 12:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich danke euch beiden.

Jetzt funktioniert das endlich.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
 

bruce85

BeitragSa, Sep 25, 2010 5:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo nochmal,
ich habe nur noch ein kleines Problem und zwar, wenn ich ein Client lösche, dann werden alle Clients gelöscht, wenn ich nur den letzten Client aus TList lösche, dann wird nur das letzte gelöscht ansonsten werden immer alle Clients gelöscht, wieso eigentlich?

Code: [AUSKLAPPEN]
For Client = EachIn Clients
         If Client.GetState() <> 1 Then
            For Local i:Int=0 To SpielerAnzahl-1
               If Spieler[i].Port = Client.GetLocalPort() Then
                  Spieler[i].Joined = 0
                  Spieler[i].Bereit = 0
                  Spieler[i].Port = 0
                  For Client = EachIn Clients
                     Client.WriteLine("5")
                     For Local j:Int=0 To SpielerAnzahl-1
                        Client.WriteLine(Spieler[j].Joined)
                        Client.WriteLine(Spieler[j].Bereit)
                        Client.WriteLine(Spieler[j].Port)
                     Next
                     While Client.SendMsg() ; Wend
                  Next
                  Exit
               EndIf
            Next

            WriteStdout("Client disconnected:~n" + ..
                     " - IP:" + TNetwork.StringIP(Client.GetLocalIP()) + "~n" + ..
                     " - Port:" + Client.GetLocalPort() + "~n")
            Client.Close()
            Clients.Remove(Client)
            Continue
         End If
.............
.............
.............


Dafür habe ich ja die for Schleife die jede Client durchgeht und dementsprechend diesen Client aus TList zu löschen, leider funktioniert das nicht so richtig.

Danke schonmal.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

Lastmayday

BeitragSa, Sep 25, 2010 5:53
Antworten mit Zitat
Benutzer-Profile anzeigen
hi!
vor 'WriteStdout("Client disconnected:~n" + ..' ein 'else' setzen und 'If Client.GetState() <> 1 Then' durch 'If Client.GetState() = 1 Then' ersetzen.

MfG Lastmayday
 

bruce85

BeitragSa, Sep 25, 2010 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Der gesamte Codeblock soll ausgeführt werden, wenn ein Client gelöscht wird, deshalb würde ich eher sagen 'else' vor 'For Local i:Int=0 To SpielerAnzahl-1', leider hat das auch nix geholfen.

Naja, dann werde ich es ambesten alles in einem Type packen und mit Types versuchen.
Im Moment stehen die Clients nur in einem TList Object und ich vermute das es Vielleicht dadran liegen könnte.
BlitzMax: [AUSKLAPPEN]
Global IP      : Int, ..
Server : TTCPStream, ..
Clients : TList, ..
Client : TTCPStream


Ich danke Dir trotzdem für die Hilfe.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
 

c64

BeitragSa, Sep 25, 2010 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Mal ganz ehrlich, du hast ein Problem mit den standard Befehlen gehabt und bei diesen einen Bug vermutet ?! Dann wurde dir geraten BNETEX zu nutzen was an und für sich garnicht verkehrt ist allerdings benutzt BNETEX genau die Befehle die du für verbugt hältst.

Klar ist es gut ein Problem zu umgehen, aber damit ist ja die eigtl. Problematik nicht gelöst, und wenn BnetEX die Standard Befehle nutzt, sollte man nich dann davon ausgehen das diese funktionieren?

Und zu deiner Schleife ich weiss ja nicht was mit >if GetState() <> 1< bezweckt werden soll aber alles was GetState()<>1 zurückliefert wird in deiner Schleife gelöscht.

Jetzt vermutest du TLIST und wirst was anderes nehmen, was ist wenn dir mal die Optionen ausgehen? Geh doch mal ein Problem an anstatt es zu umgehen ?! Wink

Bekomm das jetz nich in den falschen Hals auch wenn sich das vllt. n bisl provokant liesst ist wirklich nicht meine Absicht! Will dir nur n kleinen "Tritt" geben Wink auch wenn ich, vllt. direkt bei deinem Code nich helfen kann, aber bei jedem Problemchen die Art und Weise der Problemlösung in Frage zu stellen anstatt die Umsetzung wird Dir auch nicht wirklich weiterhelfen!


mfg. C64
Betreten verboten! Kinder haften für ihre Eltern!
 

bruce85

BeitragSa, Sep 25, 2010 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast recht, aber wenn ich nach etliche Stunden/Tagen das Problem nicht lösen kann, dann versuch ich einfach eine andere Methode zu finden.

Ich habe das Problem jetzt doch lösen können:

BlitzMax: [AUSKLAPPEN]
For Client = EachIn Clients
If Client.GetState() <> 1 Then
For Local i:Int=0 To SpielerAnzahl-1
If Spieler[i].Port = Client.GetLocalPort() Then
WriteStdout("Client disconnected:~n" + ..
" - IP:" + TNetwork.StringIP(Client.GetLocalIP()) + "~n" + ..
" - Port:" + Client.GetLocalPort() + "~n")
Client.Close()
Clients.Remove(Client)

Spieler[i].Joined = 0
Spieler[i].Bereit = 0
Spieler[i].Port = 0
For Client = EachIn Clients
Client.WriteLine("5")
For Local j:Int=0 To SpielerAnzahl-1
Client.WriteLine(Spieler[j].Joined)
Client.WriteLine(Spieler[j].Bereit)
Client.WriteLine(Spieler[j].Port)
Next
While Client.SendMsg() ; Wend
Next
Exit
EndIf
Next
Continue
End If
.................
.................
.................


Ich prüfe zuerst welcher Client die verbindung unterbrochen hat und dann lösche ich diesen Client in dieser Zeile:
BlitzMax: [AUSKLAPPEN]
If Spieler[i].Port = Client.GetLocalPort() Then


Ich danke Dir trotzdem für die antwort.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

Lastmayday

BeitragSa, Sep 25, 2010 23:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Abend,

nun wenn man deinen Code lange anstarrt und darauf achtet bloß keine For schleife auszulassen, versteht man erst was gemeint war. Wenn ich in der ersten Zeile 'For Client = EachIn Clients' lese und irgendwo in der selben schleife nochmal 'For Client = EachIn Clients' steht, blickt absolut keiner mehr durch.

Was ich gelesen hab war 'If Client.GetState() <> 1 Then' , was bedeutet das der Client disconnected ist und mitten drin dann 'Client.WriteLine(Spieler[j].Joined)' was total unlogisch ist. tu dir selbst ein gefallen und deklariere For schleifen mit listen auch mit einem 'local clients:wasauchimmer' , bei schleifen in schleifen geht das sogar nicht anders.

Danke.

mfg Lastmayday

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group