UDP Problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Mathe

Betreff: UDP Problem

BeitragMi, Aug 05, 2009 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

seit gestern hab ich mich mal an die Netzwerkbefehle von Blitz 3D gewagt ich wollte einen Chat programmieren der über einen Server funktioniert. Mein Konzept wie der Server reagiert ist schon fertig, aber jetzt komm ich zu meinen Problem.

Die Clients sollen sich automatisch mit den Server verbinden, aber wie finde ich die IP-Adresse des Servers heraus. Was mir spontan eingefallen wäre ist eine Schleife so wie diese:

Code: [AUSKLAPPEN]
For A1 = 0 To 255
   For A2 = o To 255
      For A3 = 0 To 255
         For A4 = 0 To 255
            WriteLine ClientOut,"###"
            SendUDPMsg (ClientOut,IntgerIP(A1+"."+A2+"."+A3+"."+A4),OUT)
         Next
      Next
   Next
Next

Function IntgerIP(IP$)
   Local A1 = Int(Left(IP,Instr(IP,".")-1)) : IP = Right(IP,Len(IP)-Instr(IP,"."))
   Local A2 = Int(Left(IP,Instr(IP,".")-1)) : IP = Right(IP,Len(IP)-Instr(IP,"."))
   Local A3 = Int(Left(IP,Instr(IP,".")-1)) : IP = Right(IP,Len(IP)-Instr(IP,"."))
   Local A4 = Int(IP)
   Return (A1 Shl 24)+(A2 Shl 16)+(A3 Shl 8)+A4
End Function


Wenn ein Server eine Antwort zurück gibt meldet sich der Client dort automatisch mit Benutzername und Passwort an. Geht das nicht einfach?

mfg.
Matthias
Windoof nein DANKE => ArchLinux Wink

Starwar

BeitragMi, Aug 05, 2009 12:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
damit wirst du keinen Erfolg haben. Die IP muss man einfach wissen...
Du könntest sie aber auf einer Internetseite speichern und dann auslesen. Aber mit wildem drauflos-suchen findest du nix.
MFG

Tankbuster

BeitragMi, Aug 05, 2009 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Soein Server, der dauerhaft an ist, sollte über eine Dynamische DNS verfügen. Du kannst bei verschiedenen Anbietern kostenlos soetwas einrichten lassen. Das verbindet einen Domain-name mit einem PC, indem ein Programm auf dem PC installiert wird, dass in bestimmten abständen die IP an den DynDNS-Anbieter sendet.

Im Prinzip kannst du dann mit allen Clients auf "irgendwas.no-ip.biz" oder ähnliche Seiten connecten, und hast so eine Verbindung zum Server.

EDIT: Oder wie Starwar schon sagte Wink
Twitter
Download Jewel Snake!
Windows|Android
 

Mathe

BeitragMi, Aug 05, 2009 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
hmmm... dazu müsst ich, aber ins Internet zugreifen es soll, aber ein Lan Chat werden.

So jetzt hab ich eine gute Lösung gefunden und sie funktioniert auch einwandfrei.

Client:
Code: [AUSKLAPPEN]
Function Sende_Anmeldung()
   Local T1 = MilliSecs()
   Local LocalIP$ = DottedIP(HostIP(CountHostIPs (SystemProperty("username"))))
   Local P1% = Instr(LocalIP,".",1)
   Local P2% = Instr(LocalIP,".",P1+1)
   Local P3% = Instr(LocalIP,".",P2+1)
   Local P4% = Instr(LocalIP,".",P3+1)
   Local A1$ = Mid(LocalIP,1,P1-1)
   Local A2$ = Mid(LocalIP,P1+1,P2-(P1+1))
   Local A3$ = Mid(LocalIP,P2+1,P3-(P2+1))
   DebugLog A1+"."+A2+"."+A3+"...."
   For A% = 2 To 255
      WriteLine ClientOUT,"###"
      SendUDPMsg (ClientOUT,IntgerIP(A1+"."+A2+"."+A3+"."+Str(A)),OUT)
      Delay 1
      ;Lese die Antwort vom Server aus...
      Local SIntgerIP% = RecvUDPMsg(ClientIN)
      If SIntgerIP <> 0 Then
         Local ServerNachricht$ = ReadLine(ClientIN)
         If ServerNachricht = "###" Then Add_Server(SIntgerIP)
      EndIf
   Next
   Print MilliSecs()-T1 + "ms"
   WaitKey
End Function

Function IntgerIP(IP$)
   Local A1 = Int(Left(IP,Instr(IP,".")-1)) : IP = Right(IP,Len(IP)-Instr(IP,"."))
   Local A2 = Int(Left(IP,Instr(IP,".")-1)) : IP = Right(IP,Len(IP)-Instr(IP,"."))
   Local A3 = Int(Left(IP,Instr(IP,".")-1)) : IP = Right(IP,Len(IP)-Instr(IP,"."))
   Local A4 = Int(IP)
   Return (A1 Shl 24)+(A2 Shl 16)+(A3 Shl 8)+A4
End Function

Function Add_Server(IntIP%)
   ss.Server = New Server
   ss\ServerStringIP = DottedIP(IntIP)
   ss\ServerIntgerIP = IntIP
   DebugLog "Server gefunden: " + ss\ServerStringIP
End Function


Server:
Code: [AUSKLAPPEN]
Repeat
   Cls
   WaitTimer(Timer)
   IntgerIP = RecvUDPMsg(ServerIN)
   If IntgerIP <> 0 Then
      ClientNachricht = ReadLine(ServerIN)
      DebugLog ClientNachricht
      If Instr(ClientNachricht,"$200$",1) = 1 Then
         Benutzer_Anmeldung()
      ElseIf Instr(ClientNachricht,"$201$",1) = 1 Then
      ;   BenutzerNamen_aendern()
      ElseIf Instr(ClientNachricht,"$202$",1) = 1 Then
      ;   BenutzerPasswort_aendern()
      ElseIf Instr(ClientNachricht,"$203$",1) = 1 Then
      ;   Benutzer_loeschen()
      ElseIf Instr(ClientNachricht,"$204$",1) = 1 Then
      ;   BenutzerDaten_senden()
      ElseIf Instr(ClientNachricht,"###",1) = 1 Then
         WriteLine ServerOUT,"###"
         SendUDPMsg (ServerOUT,IntgerIP,OUT)
      EndIf
   EndIf
   ;WriteSystemNachrichten()
   Flip
Until KeyHit(1) ;: ServerBeenden()


Um den Server jetzt zu finden brauch ich > 550ms.

Wenns ich es über einen Internet Server machen würde muss das Internet an sein und so gehts auch ohne Internet, leider musste ich Delay einfügen, denn ein Computer ist nicht so schnell um die Antwort unter 1ms zurück zuschicken...
Windoof nein DANKE => ArchLinux Wink

Tankbuster

BeitragMi, Aug 05, 2009 13:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso. Im Lan kannst du es auch per Broadcast machen, da es ja nicht sehr viele Adressen gibt, die du ansenden müsstest.

Wenn z.B. alle Computer im LAN die IP
192.168.2.X
haben, dann kannst du ja einfach nur alle X durchgehen. Das wären dann 255 Nachrichten.

EDIT: Bei LAN Partys würde ich es so wie oben machen. Bei kleinen Sachen mit 3 Freunden oder so reicht es doch die IP Manuell anzugeben Wink
Twitter
Download Jewel Snake!
Windows|Android

BtbN

BeitragMi, Aug 05, 2009 14:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Im lan ist es kein problem, einfach einen Server-Melde-Dich-Broadcast zu senden, woraufhin der Server eine hier-bin-ich nachricht zurück schickt.
 

Mathe

BeitragMi, Aug 05, 2009 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
ah okey, dann bin ich mit meiner Taktik schon recht weit.

@Tankbuster
Theoretisch könnte man schon die IP eingeben, aber ich bin dafür zu faul und deshalb hab ich mir halt einen System überlegt, dass den Server automatisch findet.

Der Client kann sogar unterscheiden, wenn mehrere Server im Netz vorhanden wären.

mfg.
Matthias
Windoof nein DANKE => ArchLinux Wink

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group