UDP-Server hat einen (leider noch unbekannten) Fehler.

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

BtbN

Betreff: UDP-Server hat einen (leider noch unbekannten) Fehler.

BeitragMi, Jul 27, 2005 11:36
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
AppTitle(\"SMK-Server\")

file = ReadFile(\"serverconfig.conf\")
ReadLine(file)
silent = ReadLine(file)
ReadLine(file)
name$ = ReadLine(file)
ReadLine(file)
sonst$ = ReadLine(file)
CloseFile(file)

If Not silent Print \"Starte Server...\"

stream = CreateUDPStream(14555)
If stream Then
If Not silent Then : Print \"Server gestartet!\" : EndIf
Else
If Not silent Then : Print \"Konnte server nicht starten...\" : EndIf
Delay(5000)
End
EndIf
Dim player$(3,4)

If Not silent Print \"Trage Spiel ein...\"

tcpPyr = OpenTCPStream (\"clonk-point.de\", 80)
If tcpPyr = 0 Then
CloseTCPStream tcpPyr
If Not silent Print \"FAIL!\"
EndIf

WriteLine tcpPyr, \"GET http://clonk-point.de/ip.php?what=enter&Name=\"+ name$ +\"&Map=map0.smk&Sonst=\"+ sonst$ +\" HTTP/1.0\"
WriteLine tcpPyr, Chr$(10)

los = 0

While Not Eof(tcpPyr)
Txt$ = ReadLine(tcpPyr)
If los And Trim(Txt$) <> \"\" And Lower(Trim(Txt$)) <> \"ende\" And silent = 0 Print Txt$
If Instr(Txt$,\"beginn\") los = 1
Wend

CloseTCPStream(tcpPyr)

If Not silent Print \"Spiel eingetragen!\"

clients = -1

If Not silent Print \"Warte auf clienten...\"

Repeat

ip = RecvUDPMsg(stream)
If ip <> 0 Then
port = UDPMsgPort(stream)
Typ = ReadInt(stream)
Select Typ
Case 1
If clients < 3 Then
clients = clients + 1
player$(clients,1) = port
player$(clients,2) = ip
player$(clients,0) = ReadString(stream)
If Not silent Then : Print \"Client connected: \"+player$(clients,0)+\" IP:\"+DottedIP(ip)+\":\"+port : EndIf
WriteString(stream,\"welcome\")
WriteInt(stream,clients)
SendUDPMsg(stream,ip,port)
For i = 0 To clients
ip2 = player$(i,2)
port2 = player$(i,1)
If ip2 <> ip Then
WriteInt(stream,2)
WriteInt(stream,ip)
SendUDPMsg(stream,ip2,port2)
EndIf
Next
Else
ReadString(stream)
WriteString(stream,\"sorry\")
SendUDPMsg(stream,ip,port)
EndIf
Case 2
x = ReadInt(stream)
y = ReadInt(stream)
Print \"Einer bewegt sich!\"
Print x+\"/\"+y
For i = 0 To clients
ip2 = player$(i,2)
port2 = player$(i,1)
Print ip2+\"/\"+port2
If ip2 <> ip Then
Print \"Sende das an \"+ip+\":\"+port2
WriteInt(stream,1)
WriteInt(stream,ip)
WriteInt(stream,x)
WriteInt(stream,y)
SendUDPMsg(stream,ip2,port2)
EndIf
Next
Case 3
Select ip
Case Int(player$(0,2))
player$(0,3) = 0
Case Int(player$(1,2))
player$(1,3) = 0
Case Int(player$(2,2))
player$(2,3) = 0
Case Int(player$(3,2))
player$(3,3) = 0
End Select
Case 25
tcpPyr = OpenTCPStream (\"clonk-point.de\", 80)
If tcpPyr = 0 Then
CloseTCPStream tcpPyr
EndIf

WriteLine tcpPyr, \"GET http://clonk-point.de/ip.php?what=remove HTTP/1.0\"
WriteLine tcpPyr, Chr$(10)
los = 0
While Not Eof(tcpPyr)
Txt$ = ReadLine(tcpPyr)
If los And Trim(Txt$) <> \"\" And Txt$ <> Trim(\"Ende\") Print Txt$
If Instr(Txt$,\"anfang\") los = 1
Wend

CloseTCPStream(tcpPyr)
End
End Select
EndIf

If MilliSecs()-timeouttime > 30000 Then

For vari = 0 To clients

ip2 = player$(vari,2)
port2 = player$(vari,1)

If ip2 <> 0 Then

WriteInt(stream,3)
SendUDPMsg(stream,ip2,port2)

player$(vari,3) = 1
player$(vari,4) = MilliSecs()

EndIf
Next

timeouttime = MilliSecs()
EndIf

If player$(0,3) = \"1\" And MilliSecs()-Int(player$(0,4)) > 7000 Then
If Not silent Print player$(0,0)+\" Timeout!\"
player$(0,0) = 0
player$(0,1) = 0
player$(0,2) = 0
player$(0,3) = 0
player$(0,4) = 0
clients = clients - 1
EndIf
If player$(1,3) = \"1\" And MilliSecs()-Int(player$(1,4)) > 7000 Then
If Not silent Print player$(1,0)+\" Timeout!\"
player$(1,0) = 0
player$(1,1) = 0
player$(1,2) = 0
player$(1,3) = 0
player$(1,4) = 0
clients = clients - 1
EndIf
If player$(2,3) = \"1\" And MilliSecs()-Int(player$(2,4)) > 7000 Then
If Not silent Print player$(2,0)+\" Timeout!\"
player$(2,0) = 0
player$(2,1) = 0
player$(2,2) = 0
player$(2,3) = 0
player$(2,4) = 0
clients = clients - 1
EndIf
If player$(3,3) = \"1\" And MilliSecs()-Int(player$(3,4)) > 7000 Then
If Not silent Print player$(3,0)+\" Timeout!\"
player$(3,0) = 0
player$(3,1) = 0
player$(3,2) = 0
player$(3,3) = 0
player$(3,4) = 0
clients = clients - 1
EndIf

Forever


Das ist der code meines UDP-Servers, mit seinen bisher 3 Funktionen.
Hier eine erklärung:

Case 1:
Ein neuer Spieler hat sich angemeldet, was an alle anderen Clients gesendet wird.

Case 2:
Ein Spieler hat sich bewegt, und er hat die neuen X/Y-Koordinaten gesendet, welche ebenfals an alle anderen Clienten gesendet werden.

Case 3:
PONG
Wenn noch einem PING(Einer 3) an den clienten, nicht inerhalb von 7 Sekunden ein PONG(auch ne 3) zurückkommt, wird er aus dem Spiel entfernt.

Probleme:
Es kommt nichts von dem, was bei Case 1 und 2 an alle gesendet werden soll, bei irgend wem an.

Warum?
Ich finde keine Bugs darin.

Dante

BeitragMi, Jul 27, 2005 12:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Den Fehler an sich seh ich grad nicht,
gucks mir später mal an^^

Aber du solltest für die spieler mit types arbeiten...
Beispiel:
BlitzBasic: [AUSKLAPPEN]
Type player
Field IP$
Field Port
Field x
Field y
End Type


dann kannst du mit each arbeiten, ist eigentlich leichter.

und der server sollte nicht die X/Y Kooridinaten an alle spieler senden. Dann hat der Server zu viel zu tun.
Der server sollte nur neue clienten annehmen und an alle sagen das ein neuer da ist und die entsprechenden daten wie IP,Port usw senden.
Spieler erntfernen und z.B. Monster (das sie sich bei allen spielern gleich bewegen)

Die X/Y Kooridintaen sollten unter den Clienten hin und her gesendet werden.

BtbN

BeitragMi, Jul 27, 2005 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Und sobald dann einer der Clienten hinter nem Router klemmt, isses aus.....
Das wär extremst blöd.
Und ne Portfreigabe mache kann man ja nicht, da die clienten Random-Ports benutzen.

Sebastian

BeitragMi, Jul 27, 2005 12:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Kommt drauf an ...

Wenn der Router richtig konfiguriet ist können Pakete von außen auf eine bestimmte Ip umgeleitet werden ....

(... ,wollt ich nur mal erwähen damit nicht immer alle denken ein Router sei ein unüberwindliches Hinderniss ...)
Seit 2 Jahren kein BlitzBasic und kein Windows mehr, und stolz darauf !

BtbN

BeitragMi, Jul 27, 2005 13:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Random-Port = Unüberwindliches Hindernis
Fester-Port = Kein Problem mit Port-Forwarding

Nichts anderes habe ich gesagt.
Und die Clienten haben einen Random-Port

Dante

BeitragMi, Jul 27, 2005 13:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich würde schon feste ports benutzen, klappt bei mir auch immer einwandfrei.

BtbN

BeitragMi, Jul 27, 2005 15:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Also dabeisagen:
Wenn ihr nen Router benutzt, dann bitte die Ports 14555 bis 14559 freigeben.
Auch ok....

Aber könntet ihr mir das nochmal kurz erklären?
Also, wie das mit dem ganzen zusammenspiel dann laufen soll?
Hab das noch nicht so zusammen...

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group