udp testen ?
Übersicht

cybyBetreff: udp testen ? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group