Netzwerkproblem UDP

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Shark

Betreff: Netzwerkproblem UDP

BeitragMo, Jan 21, 2008 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Community,
zur Vorgeschichte zu diesem Problem hab ich nur zusagen, dass ich mit bnetex versucht habe eine stabile und funktionierende Verbindung zu erhalten, doch dies gelang mir nicht und darum hab ich versucht in B3d nochmal den nicht funktionierenden Code von BnetEx nach zu programmieren. Leider funktionierte es immer noch nicht und ich muss darauß schließen, dass es ein Problem mit meiner Denkweise oder mit dem Code gibt.

Der Code, wie ich finde, ist etwas zu lange, dennoch poste ich den hier:
Code: [AUSKLAPPEN]
;Shark Test!!!
Global key
Type FMessage
   Field zeilenpos%
   Field txt$
End Type

Type TClient
 Field id%
 Field ip$
 Field port%
 Field stream
End Type

Global message_counter%
Global message_max%=20
Global eingabe$
Global True_eingabe
Global client_id%
Type FServer
   Field Stream
   Field Port%      
End Type

Type FClient
   Field Stream
   Field Port
   Field Ip
   Field Accept_connection

End Type

Connection(0,8000,"127.0.0.1")

Function Connection(mode% , port% , ip$ = False)

 Select mode
    ;Mode = dedicated
    Case 2
       Create_FServer(port%,2)
    ;Mode = Server
   Case 1
      Create_FServer(port%,1)
       Create_FClient(port% , "127.0.0.1" , False)
    ;Mode = Client
    Case 0
       Create_FClient(port%,ip$)
End Select



Runtime(mode)

End Function



Function Runtime(mode%)
Local ende% = False
Repeat   
   Cls   
   key = GetKey()
   Text(25,540,"Um eine Nachricht zu verfassen, druecke Eingabetaste")
   If MilliSecs() - ms_timer >= ms_rate
      ms_timer = MilliSecs()
      Select mode
      Case 1
         update_server()
         update_client()
      Case 0
         update_client()
      Case 2
         update_server()
      End Select
   EndIf        
   If mode <> 2 Then
      message()
      draw_message()
   EndIf
   Flip()
   
Until KeyHit(1)
End

End Function





Function Create_FServer(wPort,mode)
      t.FServer = New FServer
      t\Port = wport
      
      AppTitle = "Server ver." + Version
      Graphics (800 , 600 , 16,2)
      SetBuffer BackBuffer()
         t\Stream = CreateUDPStream(Port)
         If t\stream=0 Then
            RuntimeError"Stream:Error Number 1"
            End
         EndIf
      DebugLog "Server gestartet
      
End Function



Function Update_server()
      
      ;Local id%
   For t.FServer = Each FServer
   If RecvUDPMsg(t\stream)
      If ReadAvail(t\Stream)>0 Then
      Select ReadByte(t\stream)
            Case 1
               client_id = client_id + 1
               Local Client.TClient = New TClient
                    Client\id = client_id
                    Client\ip = UDPMsgIP(t\stream)
                    Client\port = UDPMsgPort(t\stream)
                    client\stream = t\stream
               DebugLog "Clientliste test"
               DebugLog Client\id
               DebugLog Client\ip
               DebugLog Client\port
               
             
               ;Nachricht zum Client wieder senden, dass er mit spielen darf oder net!
               WriteByte(client\stream,11)
               SendUDPMsg(client\stream,client\ip,client\port)
               DebugLog ("Nachricht zum Client gesendet")
               
            Case 20
               Local message$ = ReadLine(t\stream)
               DebugLog message
                  For Client.Tclient = Each Tclient
                     WriteByte(client\stream,21)
                     WriteLine(client\stream,message)
                     SendUDPMsg(client\stream,client\ip,client\port)
                     DebugLog("Narchricht an"+client\ip+"gesendet")
                  Next
            Case 100
               DebugLog "Pong"
               
         End Select   
   EndIf
   EndIf
Next
      
End Function



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 Create_FClient(Port, Ip$,connection=True)
      Local t.FClient = New FClient
      t\port = port
      t\ip =int_ip( ip$ )
      AppTitle = "Server ver." + Version
      Graphics (800 , 600 , 16,2)
      t\stream = CreateUDPStream(Port)
         If t\stream=0 Then
            RuntimeError"Stream:Error Number 1"
            End
         EndIf

      ;VerbindungsAnfrage!
         WriteByte(t\stream,1)
         DebugLog("Verbindungsanfrage")
         SendUDPMsg(t\stream,t\ip,t\port)
         If connection = False
            update_server()
         EndIf
      If connection = True
      Local accept_connection_ms% = MilliSecs()
      Local accept_connection_ping% = 4000
         Repeat
         For t.FClient = Each FClient
            If RecvUDPMsg(t\stream)
               If ReadAvail(t\Stream)>0 Then
               Select ReadByte(t\stream)
                  Case 1
                  DebugLog("Anmeldung auf dem Server erfolgreich")
                       Accept_connection = True
                   Case 0
                      DebugLog "Error"
                      RuntimeError "Join:Error Number 2"
                End Select
                
            EndIf
            EndIf
         Next
         Text  400 , 300 , "Wait..."
         Flip
         Until Accept_connection = True
      EndIf
End Function

Function update_client()
   For t.FClient = Each Fclient
   
   If RecvUDPMsg(t\stream)
      If ReadAvail(t\Stream)>0 Then
      Select ReadByte(t\stream)

      Case 21
         message_counter = message_counter + 1
         
               m.FMessage = New FMessage
             m\txt = ReadLine(t\stream)
             m\zeilenpos = message_counter * 13
            DebugLog "FMESSAGE"
            DebugLog m\txt
            DebugLog m\zeilenpos
      End Select
   EndIf
EndIf
Next 
End Function

Function send_message(message$)
      For t.FClient = Each Fclient
         If message <> "" Or " "
            WriteByte(t\stream,20)
            WriteLine(t\stream,message$)
            SendUDPMsg(t\stream,t\ip,t\port)
            DebugLog "Nachricht: "+message+"gesendet"
          EndIf
      Next
End Function
   
Function message()
   If true_eingabe = 0 Then
      If KeyHit(28) Then
      true_eingabe = 1
      FlushKeys()
      EndIf
   EndIf

   If true_eingabe = 1 Then
   
      Text(20,40,"TRUE")
      If KeyHit( 14 ) And eingabe <> "" Then eingabe = Left(eingabe , Len(eingabe) - 1)
   
      If key > 31 And key < 127
         eingabe$ = eingabe$ + Chr(key)
      EndIf
      If KeyHit(28) Then
         send_message(eingabe$)
         eingabe = ""
         FlushKeys()
         true_eingabe = 0
      EndIf
   EndIf
   Text(30,500,eingabe$+"|")
End Function

   
Function draw_message()
      For m.FMessage = Each FMessage
         Text( 10 , m\zeilenpos,message_counter+"."+m\txt)
      Next
End Function 
   


Ich habe versucht den Server sich selbst als Client zu adden, sodass der Server alles macht und die Daten alle an die Clients sendet!
Jedenfalls, wenn ich versuche ein Server[+Client] zu starten und dann noch ein Client joinen lasse, dann kann das Programm den Stream nicht erstellen, was ich leider gottes nicht verstehe warum.
Außerdem ist es eigenartiger weiße möglich als Client sich selber zu bestätigen, obwohl ich es so programmiert habe, das jeder client erstmal eine Anfrage an den Server sendet und der Server sendet darauf hin eine Nachricht, die den Client bestätigt oder nicht.

mfg Shark

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group