udp testen ?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

cyby

Betreff: udp testen ?

BeitragMo, Apr 05, 2004 16:20
Antworten mit Zitat
Benutzer-Profile anzeigen
hi,

hier hat mal vor längerer zeit wer diesen code geschrieben !
leider klapt der nie bei meinen freunden und mir!
wir haben keine router und Firewall's ... doch es geht nicht !
wer das mal mit mir testen möchte, der sollte sich bitte bei per ICQ melden ! (211078928)
Code: [AUSKLAPPEN]
;---------------------------------Einstellen
Const vers$="ALPHA 0.6"
AppTitle "UDP-Game "+vers$
Graphics 640, 480, 16, 2
font = LoadFont ("Arial", 13)
SetFont font

;MSG IDs
;
;0 = Anmelden (Client->Server, enhält Namen des Clients und RICHTIGE IP des Servers)
;1 = Anmelde-Bestätigung (Server->Client, enthält ID und RICHTIGE IP für Client)
;2 = Player-Daten (Server/Client<->Client, enthält Client Daten ID, Name, x, y, IP, Port)
;3 = Player-Pos (Server/Client<->Client, enthält Client Position x,y)
;4 = Chat (Server/Client<->Client, enthält ID und Nachricht)
;5 = Verlassen (Server/Client<->Client, enthält ID und Art des Verlassens)
;6 = Server weg (Server->Client, enthält NICHTS)


;---------------------------------Variablen definieren
Global ip$         ;IP Nummer (des Servers)
Global port         ;UDP Port (des Servers)
Global port2      ;UDP Port (Client)
Global stream      ;UDP Stream
Global server      ;Ist man selbst Server oder nur Client?
Global name$      ;Eigener Name
Global id         ;Eigene ID (für pl_xxx Arrays)
Global chat$      ;Chat-Nachricht
Global timer      ;Timeout-Timer
Global fps_frames   ;
Global fps_ms      ;
Global fps         ;
Dim lines$(5)      ;Chat-Zeilen
Dim linesc(5)      ;Lines-Colors
Const pl_c = 10      ;Player Count
Dim pl_x(pl_c)      ;Player X
Dim pl_y(pl_c)      ;Player Y
Dim pl_dir(pl_c)   ;Player dir
Dim pl_name$(pl_c)   ;Player Name
Dim pl_ip(pl_c)      ;Player IP
Dim pl_port(pl_c)   ;Player Port
Dim pl_to(pl_c)      ;Player Time Out
Global i,j         ;For Next Zählvariablen


;---------------------------------Constanten erstellen
Const rate=30      ;UDP Nachrichten-Empfangs-Rate in ms
Const timeout=10   ;Timeout in sek



;0---------Start
Color 255,200,0                           ;Avatar Image erstellen
Global avatar                           ;
avatar = CreateImage(10, 10)               ;
SetBuffer ImageBuffer(avatar)               ;
Oval 0, 0, 10, 10, 0                     ;Kreis (10x10, nicht ausgefüllt)
Plot 3,3 : Plot 6,3                        ;Augen
Plot 3,6 : Plot 4,7 : Plot 5,7 : Plot 6,6      ;Mund
SetBuffer FrontBuffer()                     ;
Print ">>>UDP-Game"                        ;
DrawImage avatar,75,1                     ;
Color 255,255,255                        ;
Print "Join-Port:"+(port+1)+" Host-Port:"+port+" Empfang alle "+rate+" ms. Timeout "+timeout+" sek"


;1---------JOIN/HOST?
.step1                                 ;
Print ""                              ;
Color 255,200,0                           ;
Print ">>>Join/Host"                     ;
Color 255,255,255                        ;
Print "Was willst du machen?"               ;
Print "(J)oin"                           ;
Print "(H)ost"                           ;
Print "(Q)uit"                           ;
Repeat                                 ;
   If KeyDown(36) Then Gosub step2            ;Bei J -> step2
   If KeyDown(35) Then Gosub step3            ;Bei H -> step3
   If KeyDown(16) Then End                  ;Bei Q -> End
Forever                                 ;


;2---------JOIN
.step2                                 ;
server=0                              ;Client!
Print ""                              ;
Color 255,200,0                           ;
Print ">>>Join"                           ;
Color 255,255,255                        ;
Print "Gebe bitte die IP des Hosts ein (Nichts eingeben um lokal zu testen)";
FlushKeys()                              ;
ip$=Input("(>)")                        ;Host IP eingeben
If ip$="" Then ip$="127.0.0.1"               ;
Print "Gebe bitte den Port des Hosts ein."      ;
FlushKeys()                              ;
port=Input("(>)")                        ;Host Port eingeben
Print "Joining..."                        ;
stream=CreateUDPStream()                  ;UDP Stream erstellen
port2=UDPStreamPort(stream)                  ;Port
If check_stream()=0 Then Gosub step1         ;Stream testen
set_name()                              ;Namen eingeben
Print "Anmelden..."                        ;
WriteByte stream, 0                        ;Anmelden -> Typ schreiben
WriteLine stream, name$                     ;Anmelden -> Namen schreiben
WriteInt stream, ipint(ip$)                  ;Anmelden -> IP des Servers schreiben
SendUDPMsg (stream, ipint(ip$), port)         ;senden
timer=MilliSecs()                        ;
Repeat                                 ;
   If MilliSecs()-timer > timeout*1000 Then   ;Timeout?!
      Color 255,0,0                     ;
      Print "Anmedlung fehlgeschlagen! Timeout!"
      Color 255,255,255                  ;
      CloseUDPStream stream               ;
      WaitKey()                        ;
      Gosub step1                        ;
   EndIf                              ;
   If RecvUDPMsg(stream) Then               ;Angemeldet?!
      If ReadAvail(stream) Then            ;
         If ReadByte(stream)=1 Then         ;
            id=ReadByte(stream)            ;ID Empfangen
            set_player(id, name$)         ;Player setzen
            pl_ip(id)=ReadInt(stream)      ;Integer IP zuweisen
            pl_port(id)=port2            ;Port zuweisen
            Exit                     ;
         EndIf                        ;
      EndIf                           ;
   EndIf                              ;
Forever                                 ;
Print "Angemeldet! Deine ID ist "+id         ;
Print "Client IP: "+ip()                  ;
Print "Client Port: "+port2                  ;
AppTitle "UDP-Game "+vers$+" - "+name$+" (Client)";
Gosub step4                              ;


;3---------HOST
.step3                                 ;
server=1                              ;Server!
Print ""                              ;
Color 255,200,0                           ;
Print ">>>Host"                           ;
Color 255,255,255                        ;
Print "Hosting..."                        ;
stream=CreateUDPStream()                  ;UDP Stream erstellen
If check_stream()=0 Then Gosub step1         ;Stream testen
set_name()                              ;Namen eingeben
id=1                                 ;ID = 1
port=UDPStreamPort(stream)                  ;Port
Print "Gehostet!"                        ;
Print "Host IP: "+ip()                     ;
Print "Host Port: "+port                  ;
set_player(id, name$+" (Server)")            ;Player setzen
pl_ip(id)=ip(1)                           ;Integer IP zuweisen
pl_port(id)=port                        ;Port zuweisen
AppTitle "UDP-Game "+vers$+" - "+name$+" (Server)";
Gosub step4                              ;


;4---------RUNTIME
.step4                                 ;
Print ""                              ;
Color 255,200,0                           ;
Print ">>>Runtime"                        ;
Color 255,255,255                        ;
Print "Benutze die Pfeiltasten zum bewegen."   ;
Print "Chatten kannst du mit Enter."         ;
Print "Beenden mit ESC!"                  ;
Print "Befehle zum Eingeben:"               ;
Print "/quit       Beenden"                  ;
Print "/list         Liste aller User"         ;
Print "/clear     Löscht Chat-Nachrichten"      ;
Print "/debug   Erstellt eine debug.txt"      ;
Print "(>)Bitte Taste drücken ..."            ;
WaitKey                                 ;
SetBuffer BackBuffer()                     ;
Cls                                    ;
timer=MilliSecs()                        ;
fps_ms=MilliSecs()                        ;
Repeat                                 ;
   Cls                                 ;
   render()                           ;Zeichnen
   enter()                              ;Eingabe
   If MilliSecs()-timer>rate Then             ;Alle rate MS: Nachrichten auswerten und senden
      timer=MilliSecs()                  ;
      If server=1 Then                  ;
         get_server                     ;Server Auswertung
      Else                           ;
         get_client                     ;Client Auswertung
      EndIf                           ;
      send_pos(id)                     ;
   EndIf                              ;
   If server=1 Then                                    ;Timeout
      For i=2 To pl_c                                    ;
         If pl_name$(i)<>"" Then                           ;
            If MilliSecs()-pl_to(i)>(timeout*1000) Then         ;
               msg("(>)"+pl_name$(i)+" left. Timeout!", 1)      ;Anzeigen
               pl_name$(i)=""                           ;Spieler löschen
               For j=1 To pl_c                           ;
                  If pl_name$(i)<>"" And i<>id Then         ;
                     WriteByte stream, 5                  ;
                     WriteByte stream, i                  ;
                     WriteByte stream, 1                  ;
                     SendUDPMsg(stream, pl_ip(j), pl_port(j));
                  EndIf                              ;
               Next                                 ;
            EndIf                                    ;
         EndIf                                       ;
      Next                                          ;
   EndIf                                             ;
   fps_frames=fps_frames+1                  ;
   If MilliSecs()-fps_ms>=1000 Then         ;
      fps_ms=MilliSecs()                  ;
      fps=fps_frames                     ;
      fps_frames=0                     ;
   EndIf                              ;
   Flip                              ;
Forever                                 ;










;---------------------------------Functions



;----------UDP Functions
Function check_stream()                           ;-> Überprüfen ob stream exisitiert!
   If stream=0 Then                           ;
      Color 255,0,0                           ;
      Print "Konnte UDP-Stream nicht erstellen!"      ;Existiert nicht!
      Color 255,255,255                         ;
      CloseUDPStream stream                     ;
      WaitKey                                 ;
      Return 0                              ;
   Else                                    ;
      Print "UDP-Stream wurde erstellt!"            ;Existiert!
      Return 1                              ;
   EndIf                                    ;
End Function                                 ;


Function get_server()                           ;-> Einkommende Nachrichten als Server verarbeiten
   Local msgid, msgtxt$, i, j                     ;
   While RecvUDPMsg(stream)                     ;
      If ReadAvail(stream) Then                  ;
         msgid=ReadByte(stream)                  ;
         Select msgid                        ;
            Case 0                           ;Case 0: Anmelden
               msgtxt$=ReadLine(stream)         ;
               For i=2 To pl_c                  ;
                  If pl_name$(i)="" Then Exit      ;
               Next                        ;
               msg("(>)"+msgtxt$+" connected! ID: "+i,2);
               set_player(i, msgtxt$)            ;
               pl_ip(i)=UDPMsgIP(stream)         ;
               pl_port(i)=UDPMsgPort(stream)      ;
               pl_ip(1)=ReadInt(stream)         ;
               WriteByte stream, 1               ;
               WriteByte stream, i               ;
               WriteInt stream, UDPMsgIP(stream)   ;
               SendUDPMsg(stream, UDPMsgIP(stream), UDPMsgPort(stream));ID zu neuem Client
               j=i                           ;
               For i=1 To pl_c                  ;
                  If pl_name$(i)<>"" And i<>j   Then;
                     WriteByte stream, 2         ;Infos anderer Clients zu neuem Client
                     WriteByte stream, i         ;
                     WriteLine stream, pl_name$(i)
                     WriteShort stream, pl_x(i)   ;
                     WriteShort stream, pl_y(i)   ;
                     WriteInt stream, pl_ip(i)   ;
                     WriteInt stream, pl_port(i)   ;
                     SendUDPMsg(stream, UDPMsgIP(stream), UDPMsgPort(stream))
                     If i>1 Then               ;
                        WriteByte stream, 2      ;Infos des neuen Clients zu anderen Clients
                        WriteByte stream, j      ;
                        WriteLine stream, msgtxt$
                        WriteShort stream, pl_x(j);
                        WriteShort stream, pl_y(j);
                        WriteInt stream, pl_ip(j);
                        WriteInt stream, pl_port(j);
                        SendUDPMsg(stream, pl_ip(i), pl_port(i))
                     EndIf                  ;
                  EndIf                     ;
               Next                        ;
            Case 1                           ;Case 1: Anmelde-Bestätigung (nur Client-Join Prozess)
            Case 2                           ;Case 2: Player-Daten (nur Client)
            Case 3                           ;Case 3: Player-Pos
               i=ReadByte(stream)               ;
               pl_x(i)=ReadShort(stream)         ;
               pl_y(i)=ReadShort(stream)         ;
               pl_to(i)=MilliSecs()            ;
            Case 4                           ;Case 4: Chat-Message
               i=ReadByte(stream)               ;
               msgtxt$=ReadLine(stream)         ;         
               msg("("+pl_name(i)+") "+msgtxt$)   ;
            Case 5                            ;Case 5: Timeout
               i=ReadByte(stream)               ;
               j=ReadByte(stream)               ;
               If j=1 Then                     ;
                  msg("(>)"+pl_name$(i)+" left UDP-Game. Timeout!", 1);
               Else                        ;
                  msg("(>)"+pl_name$(i)+" left UDP-Game.", 1);
               EndIf                        ;
               pl_name$(i)=""                  ;
            Case 6                           ;Case 6: Server weg (nur Client)
         End Select                           ;
      EndIf                                 ;
   Wend                                    ;
End Function                                 ;


Function get_client()                           ;-> Einkommende Nachrichten als Client verarbeiten
   Local msgid, msgtxt$, i, j                     ;
   While RecvUDPMsg(stream)                     ;
      If ReadAvail(stream) Then                  ;
         msgid=ReadByte(stream)                  ;
         Select msgid                        ;
            Case 0                           ;Case 0: Anmelden (nur Server)
            Case 1                           ;Case 1: Anmelde-Bestätigung (nur Client-Join Prozess)
            Case 2                           ;Case 2: Player-Daten
               i=ReadByte(stream)               ;
               msgtxt$=ReadLine(stream)         ;
               pl_name$(i)=msgtxt$               ;
               pl_x(i)=ReadShort(stream)         ;
               pl_y(i)=ReadShort(stream)         ;
               pl_ip(i)=ReadInt(stream)         ;
               pl_port(i)=ReadInt(stream)         ;
               msg("(>)"+msgtxt$+" connected! ID: "+i,2);
            Case 3                           ;Case 3: Player-Pos
               i=ReadByte(stream)               ;
               pl_x(i)=ReadShort(stream)         ;
               pl_y(i)=ReadShort(stream)         ;
               pl_to(i)=MilliSecs()            ;
            Case 4                           ;Case 4: Chat-Message
               i=ReadByte(stream)               ;
               msgtxt$=ReadLine(stream)         ;
               msg("("+pl_name(i)+") "+msgtxt$)   ;
            Case 5                            ;Case 5: Timeout
               i=ReadByte(stream)               ;
               j=ReadByte(stream)               ;
               If j=1 Then                     ;
                  msg("(>)"+pl_name$(i)+" left UDP-Game. Timeout!", 1);
               Else                        ;
                  msg("(>)"+pl_name$(i)+" left UDP-Game.", 1);
               EndIf                        ;
               pl_name$(i)=""                  ;
            Case 6                           ;Case 6: Server weg
               Cls                           ;
               Color 255,0,0                  ;
               Text 640/2, 480/2, "> Server ist down! <",1
               WaitKey                        ;
               End                           ;
         End Select                           ;
      EndIf                                 ;
   Wend                                    ;
End Function                                 ;


Function send_pos(id)                           ;-> Position von ID an alle senden
   Local x,y,i                                 ;
   x=pl_x(id)                                 ;
   y=pl_y(id)                                 ;
   For i=1 To pl_c                              ;Daten an alle senden
      If pl_name$(i)<>"" And i<>id Then            ;außer an sich selbst
         WriteByte stream, 3                     ;
         WriteByte stream, id                  ;
         WriteShort stream, x                  ;
         WriteShort stream, y                  ;
         SendUDPMsg(stream, pl_ip(i), pl_port(i))   ;
      EndIf                                 ;
   Next                                    ;
End Function                                 ;



;----------Normale Functions
Function set_name()                              ;-> Eigenen Namen eingeben
   FlushKeys()                                 ;
   Print "Gebe einen Namen ein!"                  ;
   name$=Input("(>)")                           ;Eingeben
   If name$="" Or name$=" " Then                  ;Überprüfen
      Print "Nichts eingegeben! Dein Name ist Noname!";
      name$="Noname"                           ;
   EndIf                                    ;
End Function                                 ;


Function set_player(id,   name$)                     ;-> Player aktivieren und in Bildmitte setzen
   pl_name$(id)=name$                           ;Namen setzen
   pl_x(id)=(640/2)-5                           ;X in Mitte
   pl_y(id)=(480/2)-5                           ;Y in Mitte
   pl_to(id)=MilliSecs()                        ;Timeout-Zeit setzen
End Function                                 ;


Function render()                              ;-> Zeichnet alles ein
   Cls                                       ;
   Local i                                    ;
   For i = 0 To 5                              ;Chat-Zeilen einzeichnen
      Select linesc(i)                        ;
         Case 0 Color 255,255,255               ;0>Weiss
         Case 1 Color 255,0,0                  ;1>Rot
         Case 2 Color 0,255,0                  ;2>Grün
      End Select                              ;
      Text 3, 3+i*15, lines$(i)                  ;Text
   Next                                    ;
   Color 255,200,0                              ;
   Text 3, 93, "(>)"+chat$                        ;
   Color 100,100,100                           ;
   Text 3, 480-15, "FPS:"+fps
   Color 255,255,255                           ;
   For i = 1 To pl_c                           ;Alle Spieler in Schleife einzeichnen
      If pl_name$(i)<>"" Then                     ;Aber nur wenn sie einen Namen haben = existieren
         DrawImage avatar, pl_x(i), pl_y(i)         ;
         Text pl_x(i)+5,pl_y(i)+10,pl_name$(i),1      ;Name (unter Kreis, Zentriert)
      EndIf                                 ;
   Next                                    ;
End Function                                 ;


Function enter()                                          ;-> Eingabe
   Local key, i                                          ;
   If KeyDown(200) And pl_y(id)>2 Then pl_y(id)=pl_y(id)-2            ;Hoch
   If KeyDown(205) And pl_x(id)<628 Then pl_x(id)=pl_x(id)+2         ;Rechts
   If KeyDown(208) And pl_y(id)<468 Then pl_y(id)=pl_y(id)+2         ;Runter
   If KeyDown(203) And pl_x(id)>2 Then pl_x(id)=pl_x(id)-2            ;Links
   If KeyDown(1) Then parse("/quit")                           ;Ende
   key=GetKey()                                          ;
   If key>31 And key<>94 And key<>200 And key<>203 And key<>208 And key<>205 Then chat$=chat$+Chr(key);Eingeben
   If KeyHit(14) And Len(chat$)>0 Then chat$=LSet(chat$, Len(chat$)-1)   ;Backspace <-Löschen
   If KeyHit(28) And chat$<>"" Then                           ;
      If parse(chat$)=0 Then                                 ;
         msg("("+name$+") "+chat$)                           ;Neue Zeile
         For i=1 To pl_c                                    ;
            If pl_name$(i)<>"" And i<>id Then                  ;
               WriteByte stream, 4                           ;
               WriteByte stream, id                        ;
               WriteLine stream, chat$                        ;
               SendUDPMsg(stream, pl_ip(i), pl_port(i))         ;
            EndIf                                       ;
         Next                                          ;
      EndIf                                             ;
      chat$=""                                          ;
   EndIf                                                ;
End Function                                             ;


Function msg(msg$, clr=0)                                    ;-> msg$ ausgeben
   Local i                                                ;
   For i = 0 To 4                                          ;
      lines$(i)=lines$(i+1)                                 ;Zeilen verschieben
      linesc(i)=linesc(i+1)                                 ;Zeilen-Farben verschieben
   Next                                                ;
   lines$(5)=msg$                                          ;Neue Zeile
   linesc(5)=clr                                          ;Neue Zeilen Farben
End Function                                             ;


Function ipint(inputIP$)                                    ;-> wandelt ip$ in interger um
   Local break1,break2,break3,add1,add2,add3,add4,ipreturn            ;
   break1 = Instr(inputIP$,".")                              ;
   break2 = Instr(inputIP$,".",break1+1)                        ;
   break3 = Instr(inputIP$,".",break2+1)                        ;
   add1 = Mid(inputIP$,1,break1-1)                              ;
   add2 = Mid(inputIP$,break1+1,break2-1)                        ;
   add3 = Mid(inputIP$,break2+1,break3-1)                        ;
   add4 = Mid(inputIP$,break3+1)                              ;
   ipreturn=(add1 Shl 24) + (add2 Shl 16) + (add3 Shl 8) + add4      ;
   Return ipreturn                                          ;
End Function                                             ;


Function ip$(inte=0)                                       ;-> Eigene IP angeben als String oder Integer
   Local ips, ip$                                           ;
   ips=CountHostIPs("")                                     ;
   If Not ips Then Return 0                                 ;
   ips=HostIP(1)                                           ;
   If inte=1 Then Return ips                                 ;Integer-IP ausgeben
   ip$=DottedIP(ips)                                       ;String-IP ausgeben
   Return ip$                                             ;
End Function                                             ;


Function parse(msg$)                                       ;-> Text parsen
   Local i, j                                             ;
   Select msg$                                             ;
      Case "/quit"                                       ;/quit
         msg("(>)Verlassen ...", 1)                           ;
         For i=1 To pl_c                                    ;
            If pl_name$(i)<>"" And i<>id Then                  ;
               If server=0 Then                           ;
                  WriteByte stream, 5                        ;
                  WriteByte stream, id                     ;
                  WriteByte stream, 2                        ;
               Else                                    ;
                  WriteByte stream, 6                        ;
               EndIf                                    ;
               SendUDPMsg(stream, pl_ip(i), pl_port(i))         ;
            EndIf                                       ;
         Next                                          ;
         render                                          ;
         Flip                                          ;
         Delay 500                                       ;
         End                                             ;
      Case "/list"                                       ;/list
         Cls                                             ;
         Locate 0,0                                       ;
         Color 255,200,0                                    ;
         Text 3,3, ">>>User-Liste"                           ;
         Color 255,255,255                                 ;
         For i=1 To pl_c                                    ;
            If pl_name$(i)<>"" Then                           ;
               j=j+1                                    ;
               Text 3,3+j*15, i+". "+pl_name$(i)               ;
               Text 300,3+j*15, "IP: "+pl_ip(i)+" ("+DottedIP(pl_ip(i))+")";
               Text 550,3+j*15, "Port: "+pl_port(i)            ;
            EndIf                                       ;
         Next                                          ;
         Text 3, 480-15, "(>)Bitte Taste drücken ..."            ;
         Flip                                          ;
         WaitKey                                          ;
         Return 1                                       ;
      Case "/clear"                                       ;/clear
         For i=0 To 5                                    ;
            lines$(i)=""                                 ;
            linesc(i)=0                                    ;
         Next                                          ;
         Return 1                                       ;
      Case "/debug"                                       ;/debug
         j=WriteFile("debug.txt")                           ;
         If j=0 Then                                       ;
            msg("(>)Konnte debug.txt nicht erstellen!",1) : Return 1;
         Else                                          ;
            WriteLine j, "Debug-File, erstellt von "+name$         ;
            WriteLine j, ""                                 ;
            For i=1 To pl_c                                 ;
               WriteLine j, i+". "+pl_name$(i)+" | IP: "+pl_ip(i)+" ("+DottedIP(pl_ip(i))+") | Port: "+pl_port(i)
            Next                                       ;
            CloseFile(j)                                 ;
            msg("(>)debug.txt wurde erfolgreich erstellt!", 2)      ;
         EndIf                                          ;
         Return 1                                       ;
   End Select                                             ;
End Function                                             ;


mfg cyby Very Happy

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group