Kleines UDP Tutorial

Übersicht BlitzBasic FAQ und Tutorials

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.

Jolinah

Betreff: Kleines UDP Tutorial

BeitragFr, Okt 22, 2004 23:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich hat der Server normalerweise einen festen Port und der Client einen variablen.

Bei UDP gibt es sowas wie Host und Join Funktionen nicht, die ganze Struktur muss selber programmiert werden. Hat man es aber einmal begriffen bietet UDP viel mehr Möglichkeiten und ist zudem schneller Smile


Hier mal zwei kleine Beispiele:

server:
Code: [AUSKLAPPEN]

;Type wo die Clients mit ip,port und name drin gespeichert werden
Type client
Field name$
Field ip,port
End Type

port = 7142 ;Serverport
udp = CreateUDPStream(port) ;UDP Stream auf port 7142 erstellen

;Wenn der Stream nicht steht Fehlermeldung ausgeben und beenden
If Not udp Then
  Print "Der UDP Stream konnte nicht erstellt werden."
  End
EndIf

Print "Server gestartet."

Repeat

  If RecvUDPMsg(udp) <> 0  ;Wenn eine UDP Message eingegangen ist.
    client_ip = UDPMsgIP(udp)  ;IP des Absenders
    client_port = UDPMsgPort(udp) ;Port des Absenders

    message = ReadByte(udp)  ;Anhand von diesem Byte erkennt der Server was der Client will

    Select message
      ;1 = Chatmessage
      Case 1
        name$ = ReadString(udp) ;Wer sendet eine Chatmessage
        txt$ = ReadString(udp) ;Der Inhalt der Chatmessage
        Print name$ + ": " + txt$ ;Chatmessage auf dem Server ausgeben

        ;Nachricht an alle anderen Teilnehmer weitersenden
        For c.client = Each client  ;Jeden Client durchgehen
          If Not c\name$ = name$  ;Wenn es nicht der Client ist der gerade gesendet hat
            WriteByte(udp,1)  ;Nachrichtentyp 1 senden = Chatmessage
            WriteString(udp,name$) ;Name weiterleiten
            WriteString(udp,txt$) ;Inhalt weiterleiten
            SendUDPMsg udp,c\ip,c\port  ;UDP Message absenden
          EndIf
        Next

      ;Neuer Client ist dem Chat beigetreten
      Case 2
        name$ = ReadString(udp)  ;Name des Clients lesen
        c.client = New client  ;Neues client objekt erstellen
        c\ip = client_ip  ;Ip speichern
        c\port = client_port ;Port speichern
        c\name$ = name$  ;Name speichern

        ;Servernachricht ausgeben
        Print name$ + " ist dem Chat beigetreten."
       
        ;Allen anderen Clients bescheid sagen das ein neuer da ist.
        For c2.client = Each client
          If Not c2 = c
            WriteByte(udp,2)  ;Nachrichtentyp 2 senden = Client beigetreten
            WriteString(udp,name$)  ;Name weiterleiten
            SendUDPMsg udp,c2\ip,c2\port  ;UDP Message senden
          EndIf
        Next

      ;Client hat die Verbindung getrennt
      Case 3
        name$ = ReadString(udp) ;Clientname auslesen

        ;Client löschen und allen anderen Clients mitteilen
        For c.client = Each client
          If c\name$ = name$
            Delete c  ;Den Client löschen der die Nachricht gesendet hat
          Else
            WriteByte(udp,3)  ;Den anderen sagen das ein Client weg geht.
            WriteString(udp,name$) ;Name weiterleiten
            SendUDPMsg udp,c\ip,c\port ;UDP Message senden
          EndIf
        Next
 
        ;Servernachricht ausgeben
        Print name$ + " hat den Chat verlassen."

    End Select

  EndIf

Until KeyHit(1)

CloseUDPStream(udp) ;UDP Stream schliessen

End


client:
Code: [AUSKLAPPEN]

;Type der die clients speichert
Type client
Field name$
End Type

SeedRnd(MilliSecs())  ;"Saat" für zufällige zahlen setzen.

server_ip$ = "127.0.0.1"  ;Ip des Servers
server_port = 7142  ;Port des Servers
client_name$ = "Babupp" + Str$(Rand(0,1000)) ;Name dieses Clients

udp = CreateUDPStream()  ;Stream erstellen
If Not udp Then
  Print "Der UDP Stream konnte nicht erstellt werden."
  End
EndIf

;Am Server den Client anmelden.
WriteByte(udp,2)  ;Dem Server mitteilen das wir neu dazu gekommen sind.
WriteString(udp,client_name$)  ;Unseren Namen mitteilen
SendUDPMsg udp,INT_IP(server_ip$),server_port  ;UDP Message senden

Repeat

  If RecvUDPMsg(udp) <> 0 ;Wenn Meldung empfangen
    message = ReadByte(udp) ;Anhand dieses Bytes weiss man was der Server will

    Select message

      ;Der Server hat eine Chatmessage von einem anderen Clienten
      ;an diesen Client weitergeleitet.
      Case 1
        name$ = ReadString(udp)  ;Name des sendenden Clients
        txt$ = ReadString(udp)  ;Nachricht des sendenden Clients
        Print name$ + ": " + txt$  ;Nachricht ausgeben

      ;Der Server teilt uns mit das ein anderer Client beigetreten ist.
      Case 2
        name$ = ReadString(udp)  ;Name des beitretenden Clients
        c.client = New client  ;Ein neues Client objekt erstellen
        c\name$ = name$  ;Name darin speichern (kann man benutzen für Liste)

        ;Nachricht ausgeben
        Print name$ + " ist dem Chat beigetreten."

      ;Der Server teilt uns mit das ein anderer Client rausgeht.
      Case 3
        name$ = ReadString(udp)  ;Name des Clienten
        For c.client = Each client 
          If c\name$ = name$ Then Delete c  ;Diesen Clienten löschen
        Next

        ;Nachricht ausgeben
        Print name$ + " hat den Chat verlassen."

    End Select

  EndIf

  ;Nachricht dieses Clients einlesen
  inp$ = Input("Sagen: ")
 
  ;Wenn man was eingegeben hat:
  If inp$ <> ""
    Print client_name$ + ": " + inp$  ;Bei sich selber darstellen

    ;Dem Server mitteilen was man gesagt hat.
    WriteByte(udp,1)  ;Dem Server sagen das es sich um eine Chatmessage handelt
    WriteString(udp,client_name$)  ;Den Namen mitteilen
    WriteString(udp,inp$) ;Den Inhalt mitteilen
    SendUDPMsg udp,INT_IP(server_ip$),server_port  ;UDP Message senden
  EndIf


Until KeyHit(1)

;Beim Server den Client abmelden
WriteByte(udp,3)  ;Dem Server sagen das wir gehen
WriteString(udp,client_name$) ;Unser Name senden
SendUDPMsg udp,INT_IP(server_ip$),server_port  ;UDP Message senden

CloseUDPStream(udp) ;Stream schliessen

End


;Funktion zum Umwandeln von String IPs in Integer.
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


Oh, ist doch etwas länger als ich dachte. Das sollte aber gut veranschaulichen wie man mit UDP arbeiten könnte.

Das mit dem Input ist da ein bisschen doof gelöst, müsste man natürlich ne Eingaberoutine verwenden die nicht blockiert, aber funktionieren tuts.
  • Zuletzt bearbeitet von Jolinah am Sa, Okt 23, 2004 0:40, insgesamt einmal bearbeitet
 

OJay

BeitragFr, Okt 22, 2004 23:56
Antworten mit Zitat
Benutzer-Profile anzeigen
das ist doch wohl eher ein code-archiv eintrag, oder? o_O

wenn du dir wenigstens die mühe gemacht hättest ein paar kommentare zu setzen...

Jolinah

BeitragSa, Okt 23, 2004 0:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, hab nicht viel überlegt. Es sollte zuerst die Antwort auf den UDP Thread im Allgemeinen werden, da ich aber dachte das das Thema dauernd wieder kommt hab ich es hier hin gemacht. Code Archiv hab ich ganz vergessen.

Aber ich pack meinetwegen noch ein paar Kommentare dazu Wink

dimaster

BeitragSa, Okt 23, 2004 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo,
ich habs mir mal angesehen und ausprobiert.ich hab ein kleines 3d spiel gemacht und dein code eingebaut.dann wenn ich s gestartet habe ist meine framerate au 2 gesunken.warum denn das?weiss das jemand?

dimaster

Jolinah

BeitragSa, Okt 23, 2004 23:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht weil Input das Programm anhaltet? *g*

Ne ich weiss nicht, sollte eigentlich nicht passieren.
 

David

BeitragMo, Okt 25, 2004 9:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Ein paar dinge gibts hier dochnoch zu bemängeln...

Zitat:

Eigentlich hat der Server normalerweise einen festen Port und der Client einen variablen


Der Port, welchen der Client verwendet, ist ja logischerweise auf den Serverport festgelegt, also nicht wirklich variabel...

Zitat:

Bei UDP gibt es sowas wie Host und Join Funktionen nicht, die ganze Struktur muss selber programmiert werden. Hat man es aber einmal begriffen bietet UDP viel mehr Möglichkeiten und ist zudem schneller


TCP bietet genausoviel Möglichkeiten wie UDP ist allerdings etwas langsamer, dafür viel sicherer.

Soviel dazu! Smile

grüße

Jolinah

BeitragMo, Okt 25, 2004 11:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mich etwas falsch ausgedrückt wahrscheinlich.
Mit variablem Clientport meinte ich das dem Client ein zufälliger noch freier Port für den Stream zugewiesen wird. Also sowas wie CreateUDPStream() ohne Port angabe.


Und mit der anderen Aussage meinte ich eigentlich nicht im Gegensatz zu TCP sondern im Gegensatz zu der DirectPlay methode in bb, weil man da seine Messages und das ganze gehandhabe selber programmieren kann.

Hab ich aber nicht genau erwähnt deshalb wars auch kein Wunder das du mich falsch verstanden hast, sorry Embarassed

Raiden93

BeitragSa, Apr 17, 2010 11:42
Antworten mit Zitat
Benutzer-Profile anzeigen
bei mir geht die server seite nicht es öffnet sich und schlisst soford

Nicdel

BeitragSa, Apr 17, 2010 12:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Du Leichenschänder! Der Thread ist 6 (!) Jahre alt Rolling Eyes
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

BladeRunner

Moderator

BeitragSa, Apr 17, 2010 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Jop, lass die alten Threads mal ruhen wenn du nicht essentiell neues beizutragen hast.
~GESCHLOSSEN~
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group