Kleines UDP Tutorial
Übersicht

![]() |
JolinahBetreff: Kleines UDP Tutorial |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
dimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielleicht weil Input das Programm anhaltet? *g*
Ne ich weiss nicht, sollte eigentlich nicht passieren. |
||
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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! ![]() grüße |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
bei mir geht die server seite nicht es öffnet sich und schlisst soford | ||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du Leichenschänder! Der Thread ist 6 (!) Jahre alt ![]() |
||
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 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group