UDP, und weiter?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

MisterMaboo

Betreff: UDP, und weiter?

BeitragMi, Jun 16, 2010 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hoffe ich spreche hier ein problem an dass viele anfänger haben:

ich habe lange gesucht aber immer noch nichts gefunden was mich UDP & co. näher bringen könnte. ich habe ehrlich gesagt kaum eine ahnung von so etwas; hätte sie aber gerne!

ich habe den code so mehr oder weniger aus der onlinehilfe übernommen.
wenn ich die .exe jetzt meinem freund schicke und ihm brav meine IP diktiere, kann er aber genau so wenig empfangen wie ich

muss ich diese ports (4000, 4001) öffnen?

kennt jemand vielleicht ein tutorial für deppen das alles von anfang an erklärt?
ich bin auch nicht abgeneigt mir viele hintergrundinformationen zur generellen funktion dieser protokolle durchzulesen.. wie gesagt, ich bin ein grünschnabel

Code: [AUSKLAPPEN]
Graphics  800, 600,24,2
SetBuffer BackBuffer()

Inp_Port = 4000
Out_Port = 4001
ip_count = CountHostIPs(GetEnv("localhost"))

Repeat
   Text 0, 0, "Beispiel UDP Communications"
   Text 0, 10, "LOCAL IP:"
   For i = 1 To ip_count
      Text 0, 20, DottedIP(HostIP(1))
   Next
   Text 0, 30, "Ziel IP#: xxx.xxx.xxx.xxx"
   Dest_IP$ = NewInput$(Dest_IP$)
   Text 0, 40, ">" + Dest_IP$ + "|"
   Flip
   Cls
Until KeyDown(28)

IP = INT_IP(Dest_IP$)

udp_rd = CreateUDPStream(inp_port)
udp_wr = CreateUDPStream(out_port)
Repeat
   Cls

   Text 0, 40, "Chat startet, esc zum beenden"
   
   byte1 = GetKey()
   If byte1>0 Then
      If Byte1 = 13 Then
         WriteByte(udp_wr, byte1)
         SendUDPMsg udp_wr, IP, Inp_Port
      Else
         drawedSendText$ = drawedSendText$ + Chr(Byte1)
         WriteByte(udp_wr, byte1)
         SendUDPMsg udp_wr, IP, Inp_Port
      EndIf
   EndIf

   IP_rd = RecvUDPMsg(udp_rd)

   If IP_rd <> 0 Then
      Buflen = ReadAvail(udp_rd)
      If Buflen> 0 Then
         byte1 = ReadByte(udp_rd)
         If byte1 <> 13 Then
            drawedRecText$ = drawedRecText$ + Chr$(byte1)
         EndIf
      EndIf
   EndIf
   Text 0, 50, "gesendet: "+drawedSendText$
   Text 0, 60, "empfangen: "+drawedRecText$
   Flip
   
Until KeyDown(1)


CloseUDPStream udp_wr
CloseUDPStream udp_rd
End

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 NewInput$(currentText$)
   localChar = GetKey()
   If (localChar > 0) And (localChar <> 8 ) Then
      currentText$ = currentText$ + Chr$(localChar)
   ElseIf localChar = 8 Then
      length = Len(currentText)
      If length > 0 Then
         currentText = Left(currentText, length - 1)
      EndIf
   EndIf
   Return currentText$
End Function

ToeB

BeitragMi, Jun 16, 2010 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, ich denke das du in dem Programm das gerne auf einem PC testen möchtest. Du kannst aber nicht zwei Ports belegen, das geht nicht. Du erstellst ja dann 2 mal den Stream mit 4000 / 4001, deshalb klappt das nicht. Entweder du musst es über netzwerk testen oder halt ein einfaches Server/Client system machen, also server hat einen festen Port (immer z.B. 4000), die Client einen Varoiablen (also statt CreateUDPStream(4001) dann CreateUDPStream() oder CreateUDPStream(0). Dann Fragt der Client den Server an, ob er druaf kann un der Server antwortet ihm "ja". Dann sind die beiden Verbunden und du kannst mit den abgepeicherteten Werten (UDPMsgIP / UDPMsgPort) die NAchrichten hin und her schicken.( Zusätzlich könntest du hinterher noch meherere Clients einbauen, aber bleibt dir überlassen)

Zu deiner Frage mit den Tuts, nein ich kenn keins welches auf Blitzbasic basiert...

Um ein wenig werbung zu machen Wink : Chrise und ich bringen bald LAmaNetwork und die SimpleUDP 2.0 raus, das sind beides schöne Netzwerks libs, bei denen du dir mal den code anschauen könntest (sonst meine alte SimpleUDP )

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!
 

Hangman

BeitragMi, Jun 16, 2010 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat Holzchopf in https://www.blitzforum.de/foru...p;start=20 :
Zitat:
Schicke die Nachricht nicht konstant an Port 9002, sondern an den Port, der dir UDPMsgPort zurückgibt. Du kannst nämlich nie wissen, ob dein Router aus dem Port 9002 vom LAN deines PCs ins WWW nicht plötzlich einen anderen Port macht. Router tun sowas.


Holzchopf's Beispiel dazu:
Code: [AUSKLAPPEN]
Graphics 400, 300, 0, 2
SetBuffer BackBuffer()
Global TIMER = CreateTimer(30)

; IP und Port des Gegenübers
Global partnerIp, partnerPort

Type TMessage
   Field txt$
   Field col
End Type

Const STATE_SETUP = 0
Const STATE_JOIN = 1
Const STATE_GAME = 2
Global state = STATE_SETUP

Global Stream
Global inputText$, inputTextTemp$

; Hauptschleife
While Not KeyDown(1)
   Select state
   Case STATE_SETUP
      Setup
   Case STATE_JOIN
      Join
   Case STATE_GAME
      Game
   End Select
   
   FlushKeys()
   Flip 0
   WaitTimer TIMER
   Cls
Wend
End

Function Setup()
   If KeyHit(2)
      ; Server erstellen
      Stream = CreateUDPStream(9000)   ; fixer Port
      Message("Server erstellt", $AAAAAA)
      state = STATE_GAME
   ElseIf KeyHit(3)
      state = STATE_JOIN
   EndIf
   
   Text 0,0, "1: Server"
   Text 0,20, "2: Client"
End Function

Function Join()
   If Input()
      ; lokalen Stream erstellen
      Stream = CreateUDPStream()   ; variabler Port
      ; Serververbindung aufbauen
      partnerIp = StrToIntIP(inputText)   ; IP und
      partnerPort = 9000               ; Port des Servers sind bekannt
      ; Anmelden
      WriteByte Stream, $00
      SendUDPMsg Stream, partnerIp,partnerPort
      Message("Verbindungsaufbau", $AAAAAA)
      state = STATE_GAME
   EndIf
   
   Text 0,0, "IP des Servers eingeben:"
   Text 0,20, inputTextTemp
End Function

Function Game()
   Local ip = RecvUDPMsg(Stream)
   If ip
      Local msgType = ReadByte(Stream)
      Select msgType
      ; Verbindungsanfrage
      Case $00
         ; erst hier erfährt der Server IP und Port des Clienten
         partnerIp = ip
         partnerPort = UDPMsgPort(Stream)
         WriteByte Stream, $01
         SendUDPMsg Stream, partnerIp, partnerPort
         Message("Client verbunden", $AAAAAA)
      ; Verbindungsaufbau
      Case $01
         Message("Verbindung aufgebaut", $AAAAAA)
      ; Nachricht
      Case $10
         Message(ReadString(Stream), $00FF00)
      End Select
   EndIf
   
   If Input()
      Message(inputText, $0080FF)
      WriteByte(Stream,$10)
      WriteString(Stream,inputText)
      SendUDPMsg Stream, partnerIp, partnerPort
   EndIf
   
   DrawMessages
   
   Color 255,255,255
   Text 0, 260, "Nachricht:"
   Text 0, 280, inputTextTemp
End Function

; leicht erweiterte Inputfunktion
Function Input()
   Local char = GetKey()
   If char = 8
      If Len(inputTextTemp)>1
         inputTextTemp = Left(inputTextTemp, Len(inputTextTemp)-1)
      Else
         inputTextTemp=""
      EndIf
   ElseIf char>31
      inputTextTemp = inputTextTemp +Chr(char)
   ElseIf char=13
      inputText = inputTextTemp
      inputTextTemp = ""
      Return True
   EndIf
End Function

Function Message(pMessage$, pColor)
   Local msg.TMessage = New TMessage
   msg\txt = pMessage
   msg\col = pColor
End Function

Function DrawMessages()
   Local y = 240
   Local msg.TMessage = Last TMessage
   Repeat
      Color 0,0,msg\col
      Text 0,y, msg\txt
      If y < 0
         Delete msg
      EndIf
      y = y -20
      msg = Before msg
   Until msg = Null
End Function

Function StrToIntIP(pIP$)
   Local b1 = Int(Left(pIP$,Instr(pIP$,".")-1)):pIP$=Right(pIP$,Len(pIP$)-Instr(pIP$,"."))
   Local b2 = Int(Left(pIP$,Instr(pIP$,".")-1)):pIP$=Right(pIP$,Len(pIP$)-Instr(pIP$,"."))
   Local b3 = Int(Left(pIP$,Instr(pIP$,".")-1)):pIP$=Right(pIP$,Len(pIP$)-Instr(pIP$,"."))
   Local b4 = Int(pIP$)
   Return (b1 Shl 24) + (b2 Shl 16) + (b3 Shl 8 ) +b4
End Function


Finde dieses Beispiel wunderbar zum lernen von UDP.
Ich habe Berthold gebrochen.

MisterMaboo

BeitragMi, Jun 16, 2010 21:39
Antworten mit Zitat
Benutzer-Profile anzeigen
soo.. auf meinem pc als client und server auf einmal läufts perfekt, wenn mein freund auf seinem pc mitmischen will wird aber keine verbindung aufgebaut.

muss ich jetzt am router den entsprechenden port öffnen? (9000)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group