UDP problem!!!!

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

juse4pro

Betreff: UDP problem!!!!

BeitragDo, Jun 28, 2007 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
hi leute!

hab zwei fragen: wieso funtionieren die folgenden Programme nich?
-man kann sich einklinken und dies wird auch beim server abgefragt!
-aber wenn sich 2 player ein loggen sehen sie sich nicht gegenseitig!
wieso ist das udp netzwerk so unglaublich langsam?

Client:
Code: [AUSKLAPPEN]

AppTitle "Nighthawk"

Graphics 640,480,16,3
SetBuffer BackBuffer()

Global x,y,dir
Global frame,FR
Global GOl,GOr,GOb,GOf
Global main_char=LoadAnimImage("gfx\main_char.bmp",24,32,0,12)
   MaskImage main_char,255,255,255
Global tileset=LoadAnimImage("gfx\tileset.bmp",32,32,0,1)

Global int_player=1
Global Sip$,Iip
Global yID,talkID

Type Tplayer
Field x,y,dir
Field name$
Field FR
Field ID
End Type

Global STREAM=CreateUDPStream(12556)

p.Tplayer=New Tplayer
Locate 15,15
p\name$=Input("Name: ")
Sip$=Input("IP des Servers: ")
Iip=INT_IP(Sip)
SendData(Iip)

Function INT_IP(IP$)
a1=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
a2=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
a3=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
a4=Int(IP$)
Return (a1 Shl 24) + (a2 Shl 16) + (a3 Shl 8 ) +a4
End Function


Function SendData(ip)
WriteInt(STREAM,0)
id=ReadInt(STREAM)
yID=id
For p.Tplayer=Each Tplayer
If p\ID=yID
WriteString(STREAM,p\name$)
WriteInt(STREAM,p\x)
WriteInt(STREAM,p\y)
WriteInt(STREAM,p\dir)
WriteInt(STREAM,p\FR)
WriteString(STREAM,p\name$)
SendUDPMsg STREAM,ip,12555
p\ID=yID
While Not way=1
Text 15,15,"empfange Daten..."
If Not RecvUDPMsg(STREAM)=0
If KeyHit(1) Then End
MSG$=ReadString(STREAM)
If MSG$="con" Then way=1
EndIf
Flip
Cls
Wend
EndIf
Next
End Function

Function NewPlayer(Oname$)
int_player=int_player+1
p.Tplayer=New Tplayer
p\x=0
p\y=0
p\dir=0
p\name$=Oname$
p\FR=0
p\ID=ReadInt(STREAM)
End Function

Function Your()
For p.Tplayer=Each Tplayer
If p\ID=yID
p\x=x
p\y=y
p\dir=dir
p\FR=FR
EndIf
Next
End Function

Function DrawPlayer()
GOr=False:GOl=False:GOf=False:GOb=False
For z2=0 To 128
For z1=0 To 128
;DrawBlock tileset,z1*32,z2*32,MAP(z1,z2,0)
If ImagesCollide(main_char,x+1,y,1,tileset,32,32,0) Then GOr=True
If ImagesCollide(main_char,x-1,y,1,tileset,32,32,0) Then GOl=True
If ImagesCollide(main_char,x,y-1,1,tileset,32,32,0) Then GOf=True
If ImagesCollide(main_char,x,y+1,1,tileset,32,32,0) Then GOb=True
Next
Next

Color 210,0,0
For p.Tplayer=Each Tplayer
DrawImage main_char,p\x,p\y,p\FR+(p\dir*3)
Text p\x,p\y-15,p\name$
Next
;DrawImage out_fit,x-scrollX,y-scrollY,FR+(dir*3)+inv*12
walk_modus=False
If KeyDown(200) Then y=y-1:walk_modus=True:dir=0
If KeyDown(208) Then y=y+1:walk_modus=True:dir=2
If KeyDown(203) Then x=x-1:walk_modus=True:dir=3
If KeyDown(205) Then x=x+1:walk_modus=True:dir=1

If walk_modus=True Then frame=frame+1:UDP_out()
If frame=6
FR=0
ElseIf frame=12
FR=1
ElseIf frame=18
FR=2
ElseIf frame=24
FR=1
ElseIf frame>24
frame=0
EndIf

End Function



Function Game()
While Not KeyHit(1)
Text 15,15,"Anzahl der Spieler: "+int_player
For p.Tplayer=Each Tplayer
If p\ID=yID
Text 15,30,"X: "+p\x
Text 15,45,"Y: "+p\y
EndIf
Next
DrawPlayer()
Your()

If Not RecvUDPMsg(STREAM)=0
UDP_in()
EndIf

Flip
Cls
Wend
End Function

Function UDP_out()
WriteInt(STREAM,1)
For p.Tplayer=Each Tplayer
If p\ID=yID
WriteInt(STREAM,p\x)
WriteInt(STREAM,p\y)
WriteInt(STREAM,p\dir)
WriteInt(STREAM,p\FR)
WriteInt(STREAM,p\ID)
SendUDPMsg STREAM,Iip,12555
EndIf
Next
End Function

Function UDP_in()
msg_type=ReadInt(STREAM)
talkID=ReadInt(STREAM)
If msg_type=0
NewPlayer(ReadString(STREAM))
ElseIf msg_type=1   ;ohh... nein, Spieler bewegt sich! :P
For p.Tplayer=Each Tplayer
If p\ID=talkID
p\x=ReadInt(STREAM)
p\y=ReadInt(STREAM)
p\dir=ReadInt(STREAM)
p\FR=ReadInt(STREAM)
EndIf
Next
;blubba blupp
EndIf
End Function

Game()

WriteInt(STREAM,-1)
WriteInt(STREAM,yID)
SendUDPMsg STREAM,Iip,12555


Server:
Code: [AUSKLAPPEN]

AppTitle "Nighthawk-Server"

Graphics 400,400,2,2
SetBuffer BackBuffer()

Print "UDP-Server"
Print "beliebige Taste zum fortfahren..."
WaitKey()

Global int_players
Global name$

Type Tplayer
Field x,y,dir,FR,ID,name$
Field ip
End Type

.wrong
Print "Zum Server erstellen wird ein"
Print "Passwort benötigt..."
key$=Input("--> ")
If Not key$="define server"
Goto wrong
EndIf

STREAM=CreateUDPStream(12555)


While Not KeyHit(1)
Flip
Cls


ip_count=CountHostIPs(GetEnv("localhost"))
For i=1 To ip_count
   Text 5,5,DottedIP(HostIP(1))
Next
Text 5,20,"Anzahl der Spieler: "+int_players


;frage Nachrichten ab
If Not RecvUDPMsg(STREAM)=0
msg_type=ReadInt(STREAM)

If msg_type=0   ;neuer Spieler will beitreten!!!!!!!
   name$=ReadString(STREAM)
   Locate 5,60
   Print "Spieler: "+name$+" möchte sich einloggen."
   confirm$=Input("ja / nein ? ")
   If Not confirm$="ja"
   Goto go1
   EndIf
   int_players=int_players+1
   WriteInt(STREAM,int_players)
   ip=UDPMsgIP(STREAM)
   SendUDPMsg STREAM,ip,12556
   
   p.Tplayer=New Tplayer
   p\x=ReadInt(STREAM)
   p\y=ReadInt(STREAM)
   p\dir=ReadInt(STREAM)
   p\FR=ReadInt(STREAM)
   p\name$=ReadString(STREAM)
   p\ip=UDPMsgIP(STREAM)
   p\ID=int_player
   WriteString(STREAM,"con")
   SendUDPMsg STREAM,p\ip,12556
   For p.Tplayer=Each Tplayer
   WriteInt(STREAM,0)
   WriteString(STREAM,name$)
   WriteInt(STREAM,int_player)
   Next
   .go1
ElseIf msg_type=1   ;Spieler bewegt sich!!!!!!!: wird danach an alle Spieler gesendet!
   SendToAll(ReadInt(STREAM),ReadInt(STREAM),ReadInt(STREAM),ReadInt(STREAM),ReadInt(STREAM))
ElseIf msg_type=-1
   int_player=int_player-1
   lol=ReadInt(STREAM)
   For p.Tplayer=Each Tplayer
   If p\ID=lol
   Delete p
   EndIf
   Next
EndIf
EndIf


Wend





Function SendToAll(x,y,dir,FR,id)
For p.Tplayer=Each Tplayer
   WriteInt(STREAM,1)
   WriteInt(STREAM,id)
   WriteInt(STREAM,x)
   WriteInt(STREAM,y)
   WriteInt(STREAM,dir)
   WriteInt(STREAM,FR)
   SendUDPMsg STREAM,p\ip,12556
Next
End Function





NEED help!

thx im vorraus!

mfg: Code: [AUSKLAPPEN]
mortus
Portfolio |LinkedIn |XING

Jolinah

BeitragFr, Jun 29, 2007 8:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Falls die Player nicht im gleichen LAN sind, sondern von Aussen über einen Router verbinden wollen, dann hast du das selbe Problem wie bei https://www.blitzforum.de/foru...hp?t=24116

Einen fixen Port beim Client bringt nichts, der Router bei den Clients verändert den Port gegen Aussen, so dass er nicht dem im Code angegebenen Port entspricht. Du musst in diesem Fall mit UDPMsgPort(udp_stream) den Absenderport ermitteln und auch auf diesen Port antworten, genau so wie du es mit der IP gemacht hast (UDPMsgIP), dann müsste es funktionieren Wink

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group