UDP Aufbau-Programm

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

ToeB

Betreff: UDP Aufbau-Programm

BeitragFr, Jun 27, 2008 22:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab mal ein kleines, verständliches UDP-LAN-Aufbau-Programm geschrieben. Erst hatte ich überlegt, ob ich éine Lib schreibe, fand ich aber zu umständlich...

Dieses Programm soll denjenigen helfen, die keine Lust haben, sich selber sowas zu schrieben oder es nicht verstehn wie es geht. Das Programm umfasst nur einen kleinen Chat, eine frei wählbare Spieleranzahl, Spieler ein-/und ausklinken und eine Grobe Host-Übersicht beim einloggen.

Das Programm ist leicht erweiterbar, man muss nur darauf achten, die richtigen Daten zu schicken.

Es gibt zwei Versionen : Die erste mit vielen Kommentaren zum verstehen, und die Zweite ohne Kommentare zum erweitern. Das ganze Basiert auf Server/Client schema, heißt, der Host hat die Macht über alles was im Spiel passiert (außer über die eingaben der Clients Wink

Lest euch am besten erst die Kommentare durch und wenn ihr es verstanden habt, könnt ihr loslegen.

So, genug gequatscht... Hier die Version Mit Kommentar :
Code: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()

Global p_anz = 1
Global Server = 0
Global send_ms = MilliSecs() ;Variable fürs Senden, damit nicht jeen schleifen durchgang gesendet werden muss
Global Send_in = 25 ;Intervallen, in denen gesenden wird (in ms)
Global SEND_STREAM
Global RECV_STREAM
Global SEND_PORT
Global RECV_PORT
Global GET_MSG

Const MSG = 1
Const QUEST = 2
Const NO_P = 3
Const GET_HOST = 4

Dim Cl$(39)

Dim acc(p_anz),name$(p_anz),IP(p_anz),TimeOut(p_anz),New_p(p_anz)  ;Die Wichtigsten Functionen

Dim chat$(p_anz),SetChat(P_anz) ;Positionen im Spiel (Hier ein Chat)

Dim GETHOST_IP(64)
Dim GETHOST_N$(64)

;HOST / JOIN Abfrage :
Print "HOST(1)  /  JOIN(2)"
Server = Input(">>")
If Server < 1 Then Server = 1 ;HOST
If Server > 2 Then Server = 2 ;JOIN

;Weitere Abfragen :
Select Server
Case 1
   SEND_PORT = 8000
   RECV_PORT = 8001
   ;Namen :
   Print "Name : "
   Name_$ = Input(">>")
   ;Spieleranzahl :
   Print "Spieler anzahl : "
   Print "1 : 4"
   Print "2 : 8"
   Print "3 : 16"
   Print "4 : 24"
   Print "5 : 32"
   Print "6 : 64"
   p_anz = Input(">>")
   If p_anz < 1 Then p_anz = 1
   If p_anz > 6 Then p_anz = 6
   Select p_anz
   Case 1
      p_anz = 4
   Case 2
      p_anz = 8
   Case 3
      p_anz = 16
   Case 4
      p_anz = 24
   Case 5
      p_anz = 32
   Case 6
      p_anz = 64
   End Select
   DimNew(p_anz)
   SEND_STREAM = CreateUDPStream(SEND_PORT)
   RECV_STREAM = CreateUDPStream(RECV_PORT)
   acc(1) = 1
   Name(1) = Name_
   ID = 1
Case 2
   SEND_PORT = 8001
   RECV_PORT = 8000
   SEND_STREAM = CreateUDPStream(SEND_PORT)
   RECV_STREAM = CreateUDPStream(RECV_PORT)
   ;Namen :
   Print "Name : "
   Name_$ = Input(">>")
   Print "Was willst du tun ?"
   Print "1 : IP eingeben"
   Print "2 : IP aus Liste auswählen"
   wahl = Input(">>")
   If wahl < 1 Then wahl = 1
   If wahl > 2 Then wahl = 2
   Select wahl
   Case 1
      Print "Server IP : "
      IP(1) = INT_IP(Input(">>"))
   Case 2
      IP(1) = INT_IP(BroadcastIP())
      WriteByte(SEND_STREAM,GET_HOST)
      SendUDPMsg(SEND_STREAM,IP(1),SEND_PORT)
      wahl = 0
      Cls
      Locate 0,0
      Print "Drücke enter um einen auszuwählen"
      Delay 100
      FlushKeys()
      Repeat
         If RecvUDPMsg(RECV_STREAM)
            If ReadByte(RECV_STREAM) = GET_HOST Then
               If wahl < 64 Then
                  namen$ = ReadString(RECV_STREAM)
                  wahl = wahl + 1
                  GETHOST_IP(wahl) = UDPMsgIP(RECV_STREAM)
                  GETHOST_N$(wahl) = namen
                  Print wahl + " : "+GETHOST_N$(wahl)+" ("+DottedIP(GETHOST_IP(wahl))+")"
               EndIf
            EndIf
         EndIf
         If KeyHit(1) Then End
      Until KeyHit(28)
      max_wa = wahl
      Delay 100
      FlushKeys()
      Print "Deine Wahl : "
      wahl = Input(">>")
      If wahl < 1 Then wahl = 1
      If wahl > max_wa Then wahl = max_wa
      IP(1) = GETHOST_IP(wahl)
   End Select
   WriteByte(SEND_STREAM,QUEST)
   WriteString(SEND_STREAM,Name_$)
   SendUDPMsg(SEND_STREAM,IP(1),SEND_PORT)
   Print "Bitte Warten..."
   wait_ms = MilliSecs() + 1000
   Repeat
      If RecvUDPMsg(RECV_STREAM)
         If ReadByte(RECV_STREAM) = QUEST
            ID = ReadByte(RECV_STREAM)
            p_anz = ReadByte(RECV_STREAM)
            IPIP = IP(1)
            DimNew(p_anz)
            IP(1) = IPIP
            acc(ID) = 1
            Name(ID) = Name_
            For i = 1 To p_anz
               IDID = ReadByte(RECV_STREAM)
               name(IDID) = ReadString(RECV_STREAM)
               acc(IDID) = 1
               TimeOut(IDID) = MilliSecs() + 1000
            Next
            Exit
         Else
            Print "Serverliste voll !"
            Delay 2500
            End
         EndIf
      EndIf
      If wait_ms <= MilliSecs()
         Print "Server hat nicht geantwortet !"
         Delay 2500
         End
      EndIf
      If KeyHit(1) Then End
   Forever    
   GET_MSG = 1
End Select
;zz = acc(1)
;Schleife
Repeat
   ;Hier die ganzen Steuerungs-abfragen, etc...
   zeile = 0
   For i = 1 To p_anz
      If acc(i) Then
         Text 0,zeile*15,i+".: "+Name(i)
         zeile = zeile + 1
      EndIf
   Next
   g = GetKey()
   If g > 0 And g <> 8 And g <> 13 Then Ch$ = Ch$ + Chr(g)
   If g = 8 Then Ch$ = Left(Ch$,Len(Ch$)-1)
   If g = 13 And ch <> "" Then
      Chat(ID) = ch
      ch = ""
      NewChatLine(Name(ID)+":"+Chat(ID))
   EndIf
   For i =1 To p_anz
      If i <> ID And Chat(i) <> "" And SetChat(i) = 0
         NewChatLine(Name(i)+":"+Chat(i))
         If Server = 1
            SetChat(i) = 1
         Else
            Chat(i) = ""
         EndIf
      EndIf
   Next
   Text 150,0,"Chat:"+ch
   Rect 150,15,650,1
   For i = 1 To 39
      Text 150,0+i*15,cl(i)
   Next
   ;Hier das ganze senden von Dateien
   Select Server
   Case 1
      If send_ms <= MilliSecs() Then
         For SEND_PLAYER = 2 To p_anz ;An die Spieler senden
            If acc(SEND_PLAYER) = 1 Then ;Wenn Player online ist
               WriteByte(SEND_STREAM,MSG) ;BYte für normal Nachricht (Positionen etc...)
               For POS_PLAYER = 1 To p_anz ;Positionen von Spielern
                  If POS_PLAYER <> SEND_PLAYER ;Damit keiner seine eigenen Daten bekommt und sich daher nicht bewegen (o.ä.) kann ^^
                     If acc(POS_PLAYER) = 1 Then
                        WriteByte(SEND_STREAM,POS_PLAYER) ;ID vom aktuellen Player als erstes schiken
                        ;Hier weitere Sachen schiken
                        WriteString(SEND_STREAM,Chat(POS_PLAYER))
                        If New_p(POS_PLAYER) = 1 Then WriteString(SEND_STREAM,name(POS_PLAYER))
                        ;/\__--Ist wenn ein neuer Spieler
                        ;dazugekommen ist, damit die anderen wissen, wie er heißt (man kann zusätzlich auch noch andere Standart-
                        ;informationen senden, die nicht die ganze Zeit mitgesendet werden müssen, weil sie immer gleich bleiebn,
                        ;z.b. Farbe oder Team...
                     EndIf
                  EndIf
               Next
               SendUDPMsg(SEND_STREAM,IP(SEND_PLAYER),SEND_PORT) ;Alles senden
            EndIf
         Next
         For i = 1 To p_anz
            New_p(i) = 0
            Chat(i) = ""
            SetChat(i) = 0
         Next
         send_ms = MilliSecs() + send_in ;Wieder zurücksetzten, damit der Intervall auch bleibt
      EndIf
   Case 2
      If GET_MSG = 1 Then ;Wenn der CLIENT eine Nachricht vom Host erhalten hat...
         WriteByte(SEND_STREAM,MSG) ;Normale Nachricht
         WriteByte(SEND_STREAM,ID);Eigene ID
         ;Andere Daten...
         WriteString(SEND_STREAM,Chat(ID))
         SendUDPMsg(SEND_STREAM,IP(1),SEND_PORT)
         CHAT(ID) = ""
         GET_MSG = 0
      EndIf
   End Select
   ;Hier die ganzen Daten empfangen / verarbeiten
   While RecvUDPMsg(RECV_STREAM) ;Während empfamngen wird, schleife nicht beenden...
      byte = ReadByte(RECV_STREAM) ;Byte für orientierung
      Select Server
      Case 1
         Select byte
         Case MSG ;Normale Nachricht
            IDID = ReadByte(RECV_STREAM) ;ID des Clienten auslesen
            ;Andere sachen für ID : IDID auslesen
            Chat(IDID) = ReadString(RECV_STREAM)
            TimeOut(IDID) = MilliSecs() + 1000 ;TimeOut wieder auf 1 Sekunde setzten
         Case QUEST
            ;Gucken, ob noch ein platz frei ist, und dann welcher
            IDID = 0
            For i = 2 To p_anz
               If acc(i) = 0 Then IDID = i:Exit
            Next
            If IDID Then ;Wenn platzt frei
               Name(IDID) = ReadString(RECV_STREAM) ;NAmen auslesen
               New_p(IDID) = 1
               acc(IDID) = 1
               IP(IDID) = UDPMsgIP(RECV_STREAM) ;IP herausfinden
               WriteByte(SEND_STREAM,QUEST)
               WriteByte(SEND_STREAM,IDID)
               WriteByte(SEND_STREAM,p_anz)
               For i = 1 To p_anz
                  If i <> IDID And acc(i)
                     WriteByte(SEND_STREAM,i)
                     WriteString(SEND_STREAM,name(i))
                  EndIf
               Next
               SendUDPMsg(SEND_STREAM,IP(IDID),SEND_PORT)
               TimeOut(IDID) = MilliSecs() + 1000 ;TimeOut auf 1 Sekunde setzten
            Else ;Wenn kein Platzt frei
               WriteByte(SEND_STREAM,NO_P) ;Sende "Kein Platzt"
               SendUDPMsg(SEND_STREAM,UDPMsgIP(RECV_STREAM),SEND_PORT)
            EndIf
         Case GET_HOST
            max_p = 0
            For i = 1 To p_anz
               If acc(i) Then max_p = max_p + 1
            Next
            namen$ = name(1)+"  "+max_p+"/"+p_anz
            WriteByte(SEND_STREAM,GET_HOST)
            WriteString(SEND_STREAM,namen$)
            SendUDPMsg(SEND_STREAM,UDPMsgIP(Recv_STREAM),SEND_PORT)
         End Select          
      Case 2
         Select byte
         Case MSG
            While Not Eof(RECV_STREAM)
               IDID = ReadByte(RECV_STREAM) ;ID auslesen
               If IDID > 0
                  chat(IDID) = ReadString(RECV_STREAM)
                  If acc(IDID) = 0 Then ;Wenn die ID vorher nicht online war ...
                     acc(IDID) = 1 ;Online machen xD
                     name(IDID) = ReadString(RECV_STREAM)
                     ;Oder halt noch die Standartinformationen (siehe oben bei Senden...)
                  EndIf
                  TimeOut(IDID) = MilliSecs() + 1000 ;TimeOut wieder auf 1 Sekunde setzten
               EndIf
            Wend
            GET_MSG = 1 ;Nachricht bekommen
         End Select             
      End Select
      If KeyHit(1) Then End
   Wend
      
   ;TimeOut :
   For i = 1 To p_anz
      If acc(i) And i <> ID ;Wenn online aber nicht die eigene IP
         If TimeOut(i) <= MilliSecs() Then acc(i) = 0 ;Wenn TimeOut (1s) abgelaufen, rausschmiss
      EndIf
   Next
   ;Timeout heiß so viel wie dass man 1s lang keine nachricht mehr von dem jenigen bekommen hat, heit er hat ca 40 nachrichten
   ;nicht bekommen von ihm...
   If acc(1) = 0 ; Wenn Server nicht mehr da ...
      Cls
      Flip
      Text 400,100,"Server hat das Spiel verlassen...",1
      Text 400,400,"-Taste zum Beenden drücken-",1
      Delay 100
      WaitKey()
      End ; ...Beenden ^^
   EndIf    
   Flip
   Cls
Until KeyHit(1)
End


Function INT_IP(IP$)
   If Instr(IP$,".") <> 0 a1=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
   If Instr(IP$,".") <> 0 a2=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
   If Instr(IP$,".") <> 0 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 DimNew(NewAnz)
   
   p_anz = NewAnz
   Dim acc(p_anz),name$(p_anz),IP(p_anz),TimeOut(p_anz),New_p(p_anz)  ;Die Wichtigsten Functionen
   
   Dim Chat(p_anz),SetChat(p_anz)  ;Positionen im Spiel (Hier Chat)
   
End Function

Function BroadcastIP$()
 
   CountHostIPs("")
   Local IP$ = DottedIP(HostIP(1))
   
   Local Subnetmask$ = "255.255.255.0"
   
   Local IPDigits[3], SubnetDigits[3]
   Local pos, i
   
   ; IP aufteilen
   For i = 0 To 3
      pos = Instr( IP$, "." )
      If pos > 0
         IPDigits[i] = Left( IP$, pos -1 )
         IP$ = Mid( IP$, pos +1 )
      Else
         IPDigits[i] = IP$
      EndIf
   Next
   
   ; Subnetmask aufteilen &invertieren
   For i = 0 To 3
      pos = Instr( Subnetmask$, "." )
      If pos > 0
         SubnetDigits[i] = Left( Subnetmask$, pos -1 ) Xor $FF
         Subnetmask$ = Mid( Subnetmask$, pos +1 )
      Else
         SubnetDigits[i] = Subnetmask$ Xor $FF
      EndIf
   Next
   
   ; IP maskieren
   For i = 0 To 3
      IPDigits[i] = IPDigits[i] Or SubnetDigits[i]
   Next
   
   Return IPDigits[0] +"." +IPDigits[1] +"." +IPDigits[2] +"." +IPDigits[3]
   
End Function

Function NewChatLine(txt$)
   
   If txt$ <> ""
      For i = 39 To 1 Step -1
         cl(i) = cl(i-1)
      Next
      cl(1) = txt$
   EndIf
   
End Function


Und hier die Ohne Kommentar :
Code: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()

Global p_anz = 1
Global Server = 0
Global send_ms = MilliSecs()
Global Send_in = 25
Global SEND_STREAM
Global RECV_STREAM
Global SEND_PORT
Global RECV_PORT
Global GET_MSG

Const MSG = 1
Const QUEST = 2
Const NO_P = 3
Const GET_HOST = 4

Dim Cl$(39)

Dim acc(p_anz),name$(p_anz),IP(p_anz),TimeOut(p_anz),New_p(p_anz) 

Dim chat$(p_anz),SetChat(P_anz)

Dim GETHOST_IP(64)
Dim GETHOST_N$(64)


Print "HOST(1)  /  JOIN(2)"
Server = Input(">>")
If Server < 1 Then Server = 1
If Server > 2 Then Server = 2

Select Server
Case 1
   SEND_PORT = 8000
   RECV_PORT = 8001
   Print "Name : "
   Name_$ = Input(">>")
   
   Print "Spieler anzahl : "
   Print "1 : 4"
   Print "2 : 8"
   Print "3 : 16"
   Print "4 : 24"
   Print "5 : 32"
   Print "6 : 64"
   p_anz = Input(">>")
   If p_anz < 1 Then p_anz = 1
   If p_anz > 6 Then p_anz = 6
   Select p_anz
   Case 1
      p_anz = 4
   Case 2
      p_anz = 8
   Case 3
      p_anz = 16
   Case 4
      p_anz = 24
   Case 5
      p_anz = 32
   Case 6
      p_anz = 64
   End Select
   DimNew(p_anz)
   SEND_STREAM = CreateUDPStream(SEND_PORT)
   RECV_STREAM = CreateUDPStream(RECV_PORT)
   acc(1) = 1
   Name(1) = Name_
   ID = 1
Case 2
   SEND_PORT = 8001
   RECV_PORT = 8000
   SEND_STREAM = CreateUDPStream(SEND_PORT)
   RECV_STREAM = CreateUDPStream(RECV_PORT)
   Print "Name : "
   Name_$ = Input(">>")
   Print "Was willst du tun ?"
   Print "1 : IP eingeben"
   Print "2 : IP aus Liste auswählen"
   wahl = Input(">>")
   If wahl < 1 Then wahl = 1
   If wahl > 2 Then wahl = 2
   Select wahl
   Case 1
      Print "Server IP : "
      IP(1) = INT_IP(Input(">>"))
   Case 2
      IP(1) = INT_IP(BroadcastIP())
      WriteByte(SEND_STREAM,GET_HOST)
      SendUDPMsg(SEND_STREAM,IP(1),SEND_PORT)
      wahl = 0
      Cls
      Locate 0,0
      Print "Drücke enter um einen auszuwählen"
      Delay 100
      FlushKeys()
      Repeat
         If RecvUDPMsg(RECV_STREAM)
            If ReadByte(RECV_STREAM) = GET_HOST Then
               If wahl < 64 Then
                  namen$ = ReadString(RECV_STREAM)
                  wahl = wahl + 1
                  GETHOST_IP(wahl) = UDPMsgIP(RECV_STREAM)
                  GETHOST_N$(wahl) = namen
                  Print wahl + " : "+GETHOST_N$(wahl)+" ("+DottedIP(GETHOST_IP(wahl))+")"
               EndIf
            EndIf
         EndIf
         If KeyHit(1) Then End
      Until KeyHit(28)
      max_wa = wahl
      Delay 100
      FlushKeys()
      Print "Deine Wahl : "
      wahl = Input(">>")
      If wahl < 1 Then wahl = 1
      If wahl > max_wa Then wahl = max_wa
      IP(1) = GETHOST_IP(wahl)
   End Select
   WriteByte(SEND_STREAM,QUEST)
   WriteString(SEND_STREAM,Name_$)
   SendUDPMsg(SEND_STREAM,IP(1),SEND_PORT)
   Print "Bitte Warten..."
   wait_ms = MilliSecs() + 1000
   Repeat
      If RecvUDPMsg(RECV_STREAM)
         If ReadByte(RECV_STREAM) = QUEST
            ID = ReadByte(RECV_STREAM)
            p_anz = ReadByte(RECV_STREAM)
            IPIP = IP(1)
            DimNew(p_anz)
            IP(1) = IPIP
            acc(ID) = 1
            Name(ID) = Name_
            For i = 1 To p_anz
               IDID = ReadByte(RECV_STREAM)
               name(IDID) = ReadString(RECV_STREAM)
               acc(IDID) = 1
               TimeOut(IDID) = MilliSecs() + 1000
            Next
            Exit
         Else
            Print "Serverliste voll !"
            Delay 2500
            End
         EndIf
      EndIf
      If wait_ms <= MilliSecs()
         Print "Server hat nicht geantwortet !"
         Delay 2500
         End
      EndIf
      If KeyHit(1) Then End
   Forever    
   GET_MSG = 1
End Select

Repeat
   
   zeile = 0
   For i = 1 To p_anz
      If acc(i) Then
         Text 0,zeile*15,i+".: "+Name(i)
         zeile = zeile + 1
      EndIf
   Next
   g = GetKey()
   If g > 0 And g <> 8 And g <> 13 Then Ch$ = Ch$ + Chr(g)
   If g = 8 Then Ch$ = Left(Ch$,Len(Ch$)-1)
   If g = 13 And ch <> "" Then
      Chat(ID) = ch
      ch = ""
      NewChatLine(Name(ID)+":"+Chat(ID))
   EndIf
   For i =1 To p_anz
      If i <> ID And Chat(i) <> "" And SetChat(i) = 0
         NewChatLine(Name(i)+":"+Chat(i))
         If Server = 1
            SetChat(i) = 1
         Else
            Chat(i) = ""
         EndIf
      EndIf
   Next
   Text 150,0,"Chat:"+ch
   Rect 150,15,650,1
   For i = 1 To 39
      Text 150,0+i*15,cl(i)
   Next
   
   Select Server
   Case 1
      If send_ms <= MilliSecs() Then
         For SEND_PLAYER = 2 To p_anz
            If acc(SEND_PLAYER) = 1 Then
               WriteByte(SEND_STREAM,MSG)
               For POS_PLAYER = 1 To p_anz
                  If POS_PLAYER <> SEND_PLAYER
                     If acc(POS_PLAYER) = 1 Then
                        WriteByte(SEND_STREAM,POS_PLAYER)
                        WriteString(SEND_STREAM,Chat(POS_PLAYER))
                     EndIf
                  EndIf
               Next
               SendUDPMsg(SEND_STREAM,IP(SEND_PLAYER),SEND_PORT)
            EndIf
         Next
         For i = 1 To p_anz
            New_p(i) = 0
            Chat(i) = ""
            SetChat(i) = 0
         Next
         send_ms = MilliSecs() + send_in
      EndIf
   Case 2
      If GET_MSG = 1 Then
         WriteByte(SEND_STREAM,MSG)
         WriteByte(SEND_STREAM,ID)
         
         WriteString(SEND_STREAM,Chat(ID))
         SendUDPMsg(SEND_STREAM,IP(1),SEND_PORT)
         CHAT(ID) = ""
         GET_MSG = 0
      EndIf
   End Select
   
   While RecvUDPMsg(RECV_STREAM)
      byte = ReadByte(RECV_STREAM)
      Select Server
      Case 1
         Select byte
         Case MSG
            IDID = ReadByte(RECV_STREAM)
            Chat(IDID) = ReadString(RECV_STREAM)
            TimeOut(IDID) = MilliSecs() + 1000
         Case QUEST
            
            IDID = 0
            For i = 2 To p_anz
               If acc(i) = 0 Then IDID = i:Exit
            Next
            If IDID Then
               Name(IDID) = ReadString(RECV_STREAM)
               New_p(IDID) = 1
               acc(IDID) = 1
               IP(IDID) = UDPMsgIP(RECV_STREAM)
               WriteByte(SEND_STREAM,QUEST)
               WriteByte(SEND_STREAM,IDID)
               WriteByte(SEND_STREAM,p_anz)
               For i = 1 To p_anz
                  If i <> IDID And acc(i)
                     WriteByte(SEND_STREAM,i)
                     WriteString(SEND_STREAM,name(i))
                  EndIf
               Next
               SendUDPMsg(SEND_STREAM,IP(IDID),SEND_PORT)
               TimeOut(IDID) = MilliSecs() + 1000
            Else
               WriteByte(SEND_STREAM,NO_P)
               SendUDPMsg(SEND_STREAM,UDPMsgIP(RECV_STREAM),SEND_PORT)
            EndIf
         Case GET_HOST
            max_p = 0
            For i = 1 To p_anz
               If acc(i) Then max_p = max_p + 1
            Next
            namen$ = name(1)+"  "+max_p+"/"+p_anz
            WriteByte(SEND_STREAM,GET_HOST)
            WriteString(SEND_STREAM,namen$)
            SendUDPMsg(SEND_STREAM,UDPMsgIP(Recv_STREAM),SEND_PORT)
         End Select          
      Case 2
         Select byte
         Case MSG
            While Not Eof(RECV_STREAM)
               IDID = ReadByte(RECV_STREAM)
               If IDID > 0
                  chat(IDID) = ReadString(RECV_STREAM)
                  If acc(IDID) = 0 Then
                     acc(IDID) = 1
                     name(IDID) = ReadString(RECV_STREAM)
                     
                  EndIf
                  TimeOut(IDID) = MilliSecs() + 1000
               EndIf
            Wend
            GET_MSG = 1
         End Select             
      End Select
      If KeyHit(1) Then End
   Wend
      
   
   For i = 1 To p_anz
      If acc(i) And i <> ID
         If TimeOut(i) <= MilliSecs() Then acc(i) = 0
      EndIf
   Next
   
   If acc(1) = 0
      Cls
      Flip
      Text 400,100,"Server hat das Spiel verlassen...",1
      Text 400,400,"-Taste zum Beenden drücken-",1
      Delay 100
      WaitKey()
      End
   EndIf    
   Flip
   Cls
Until KeyHit(1)
End


Function INT_IP(IP$)
   If Instr(IP$,".") <> 0 a1=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
   If Instr(IP$,".") <> 0 a2=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
   If Instr(IP$,".") <> 0 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 DimNew(NewAnz)
   
   p_anz = NewAnz
   Dim acc(p_anz),name$(p_anz),IP(p_anz),TimeOut(p_anz),New_p(p_anz) 
   
   Dim Chat(p_anz),SetChat(p_anz) 
   
End Function

Function BroadcastIP$()
 
   CountHostIPs("")
   Local IP$ = DottedIP(HostIP(1))
   
   Local Subnetmask$ = "255.255.255.0"
   
   Local IPDigits[3], SubnetDigits[3]
   Local pos, i
   
   
   For i = 0 To 3
      pos = Instr( IP$, "." )
      If pos > 0
         IPDigits[i] = Left( IP$, pos -1 )
         IP$ = Mid( IP$, pos +1 )
      Else
         IPDigits[i] = IP$
      EndIf
   Next
   
   
   For i = 0 To 3
      pos = Instr( Subnetmask$, "." )
      If pos > 0
         SubnetDigits[i] = Left( Subnetmask$, pos -1 ) Xor $FF
         Subnetmask$ = Mid( Subnetmask$, pos +1 )
      Else
         SubnetDigits[i] = Subnetmask$ Xor $FF
      EndIf
   Next
   

   For i = 0 To 3
      IPDigits[i] = IPDigits[i] Or SubnetDigits[i]
   Next
   
   Return IPDigits[0] +"." +IPDigits[1] +"." +IPDigits[2] +"." +IPDigits[3]
   
End Function

Function NewChatLine(txt$)
   
   If txt$ <> ""
      For i = 39 To 1 Step -1
         cl(i) = cl(i-1)
      Next
      cl(1) = txt$
   EndIf
   
End Function



Ich hoffe ich konnte einigen hier helfen, UDP besser zu verstehen oder ihen arbeit zu sparen...

Ich bin offen für kritik, verbesserungen sind erwünscht und Bugs sind hier zu melden ^^

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

emcapone

BeitragFr, Jul 25, 2008 3:23
Antworten mit Zitat
Benutzer-Profile anzeigen
hehehe sowas hab ich mir gewünscht! ich guckmal ob ich das für mein 3d multiplayerprojekt verwenden kann :>
BIG THX

Mr.Keks

BeitragFr, Jul 25, 2008 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Select p_anz
   Case 1
      p_anz = 4
   Case 2
      p_anz = 8
   Case 3
      p_anz = 16
   Case 4
      p_anz = 24
   Case 5
      p_anz = 32
   Case 6
      p_anz = 64
End Select

Manche Leute würden ja Folgendes schreiben:
Code: [AUSKLAPPEN]
p_anz = 2 * 2 ^ p_anz
Wobei dabei zugegebenermaßen die 24 nicht in die Reihe passt Wink Ansonsten:
Zitat:
p_anz = 2 * 2 ^ (p_anz - (p_anz > 4)) - 8 * (p_anz = 4)

Nein nur Spaß, dass is natürlich unübersichtlicher und lahmer, wenn auch mathematischer. Was mich daran nur so verwundert: Wozu dieses Angeben der einen Zahl, wenn die andere gemeint ist?
MrKeks.net

ToeB

BeitragFr, Jul 25, 2008 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
@emcapone : Ja man kann es für 3Dspiele benutzen... einfach Grapöhics3D und dann wo neue Spieler hinzugefügt werden einen neues Mesh laden/erstellen/anzeigen...

@Mr.Keks : Für die Übersicht. Ich wollte es zwar berechnen lassen, aber ich wollte dann schon so machen, das es festgelegte Spieleranzahlen gibt...
Es ist außerdem Übersichtlicher, da man nur eine Zahl von 1-6 eingibt, anstatt z.b. "Du darfst nur Zahlen wie 4/8/16/24/32/64 benutzen !" Und dann müsste man jede eizellne Zahl prüfen, ob sie eine der gewünschten Zahlen ist... Wäre noch mehr aufwand...

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group