UDP...

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Jean

Betreff: UDP...

BeitragFr, März 11, 2005 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo

Also ich habe wieder ein kleines Problem mit UDP... und gleich werde ich wahnsinnig! Also ich verwende auf dem einen PC dieses Programm im Hintergrund:

Code: [AUSKLAPPEN]

senden = CreateUDPStream()
If senden = 0 Then
Print "Verbindung konnte nicht erstellt werden!"
EndIf

empfangen = CreateUDPStream()
If empfangen = 0 Then
Print "Verbindung konnte nicht erstellt werden!"
EndIf


Repeat

IP_Adresse = RecvUDPMsg(empfangen)

If IP_Adresse > 0 Then
senderip = DottedIP(IP_Adresse)
messenge$ = ReadLine(bekommen)
Print "Nachricht empfangen!"
Print "Sender Ip:" + senderip
Print "Nachricht:" + messenge$
EndIf

Forever


Auf einem zweiten PC sende ich dann eine Nachricht...

Code: [AUSKLAPPEN]

senden = CreateUDPStream(0)
If senden = 0 Then
Print "Verbindung konnte nicht erstellt werden!"

EndIf

bekommen = CreateUDPStream(0)
If bekommen = 0 Then
Print "Verbindung konnte nicht erstellt werden!"

EndIf

IP_Adresse = 172965


WriteLine(senden, "Hallo")
SendUDPMsg senden, IP_Adresse

Print "Gesendet!"


Aber beim empfänger erscheint dan nicht das gewünschte "Hallo" sondern rein garnichts... Kann es vielleicht auch daran liegen das ich an einem Router hänge? Zudem stimmt die IP Adresse zu 100%...
Bitte Bitte Bitte Bitte Bitte helft mir! Sonst werde ich noch verrückt!

Vertex

BeitragFr, März 11, 2005 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch bei Port 0 sucht sich das System einen freien Port oberhalb von 1024 aus. Du musst also explizit angeben (am besten nur bei SendUDPMsg), an welchen Zielport du senden möchtest.

Weiter ist es nicht nötig einen Sende- und Empfangsstream zu erstellen. Es reicht ein einziger Stream aus.

mfg olli
vertex.dreamfall.at | GitHub

Jean

BeitragFr, März 11, 2005 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe den Code jetzt so abgeändert:

Empfänger:
Code: [AUSKLAPPEN]

senden = CreateUDPStream()
If senden = 0 Then
Print "Verbindung konnte nicht erstellt werden!"
EndIf

empfangen = CreateUDPStream()
If empfangen = 0 Then
Print "Verbindung konnte nicht erstellt werden!"
EndIf

Port=UDPStreamPort (empfangen)
Print "Port: " + Port
umwandeln$ = ip$()

w1 = Instr(umwandeln$,".")
w2 = Instr(umwandeln$,".",teil1+1)
w3 = Instr(umwandeln$,".",teil2+1)

IP = w1*$1000000+w2*$10000+w3*$100+w4

Print "IP: " + IP

Repeat


IP_Adresse = RecvUDPMsg(empfangen)

If IP_Adresse > 0 Then
senderip = DottedIP(IP_Adresse)
messenge$ = ReadLine(bekommen)
Print "Nachricht empfangen!"
Print "Sender Ip:" + senderip
Print "Nachricht:" + messenge$
EndIf

Forever

Function ip$(inte=0)
ips=CountHostIPs("") ; Anzahl der offenen IPs am Computer auslesen.
If Not ips Then Return 0 ; Wenn kein geöffnet, dann 0 zurück liefern.
ip=HostIP(ips) ; Die IP als Integer von der momentane Verbindung rausfiltern.
If inte=1 Then Return ip ; Wenn die Option inte gesetzt ist, dann wird die IP im form eines Integer zurück geliefert.
ipstr$=DottedIP(ip) ; Im weiteren verlauf, falls die Option inte nicht gesetzt ist, das Integer in einen String umwandeln.
Return ipstr$ ; Wert zurückliefern.
End Function


Sender:
Code: [AUSKLAPPEN]

senden = CreateUDPStream(0)
If senden = 0 Then
Print "Verbindung konnte nicht erstellt werden!"

EndIf

bekommen = CreateUDPStream(0)
If bekommen = 0 Then
Print "Verbindung konnte nicht erstellt werden!"

EndIf

IP_Adresse = Input$("Empfaenger IP: ")
Port = Input$("Empfaenger Port: ")


WriteLine(senden, "Hallo")
SendUDPMsg senden, IP_Adresse, Port

CloseUDPStream senden
CloseUDPStream bekommen


Print "Gesendet!"


Aber es läuft immer noch nicht! Das ist so ein Scheiss!

Vertex

BeitragFr, März 11, 2005 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist großer quatsch den du da gemacht hast. 1. funktioniert deine Umwandlung von dotted IP in integer IP nicht und 2. seh selbst:

Code: [AUSKLAPPEN]
Function IntIP(IP$)
   CountHostIPs(IP$)
   Return HostIP(1)
End Function


So einfach ist es, dotted IPs in integer IPs umzuwandeln.

Aber was rede ich da, https://www.blitzforum.de/viewtopic.php?t=9550 hier wird alles beschrieben.

mfg olli
vertex.dreamfall.at | GitHub
  • Zuletzt bearbeitet von Vertex am Sa, März 12, 2005 11:58, insgesamt einmal bearbeitet

Jean

BeitragSa, März 12, 2005 10:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo

Danke erstmal für deine Hilfe... aber wenn ich jetzt meine IntegerIP berechnen lassen will dann bekomme ich diese Zahl zurück: -1062731481
Und das kann doch nicht stimmen... oder? Rolling Eyes
Bitte helft mir! Question

DA

BeitragSa, März 12, 2005 11:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

Probier es doch aus.
Wen es klappt, dann weißt du das die Funktion richtig ist.

Thx
DarkAngel
Deutscher Blitz Basic Chat

Vertex

BeitragSa, März 12, 2005 11:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Nehmen wir mal die IP 192.168.2.100:

Binär sieht das dann so aus: 11000000.10101000.00000010.01100100

Ein Integerwert besteht aus 4 Byte also 4*8=32 Bit genausoviel wie eine IP hat. Integers sind in Blitz signed. Das heißt, es gibt negative Zahlen und auch positive Zahlen. Ob der Wert negativ oder positiv ist, bestimmt das erste Bit: 11000000.10101000.00000010.01100100
Ist das erste Bit gesetzt(also = 1), dann ist der absolute Wert der 31 folgenden Bits negativ, andern Falls positiv.

In diesem Beispiel ist der Wert halt negativ. Deswegen kommen auch negative IPs zustande.

Ist das selbe mit negativen Pixelfarben bei ReadPixel.

Man sollte jedoch bei der IP Formatierung A.B.C.D bleiben, denn das lässt sich eben besser merken.

mfg olli
vertex.dreamfall.at | GitHub

Jean

BeitragSa, März 12, 2005 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin

Also langsam verzweifle ich... ich habe das jetzt so gecodet:

Empfänger:
Code: [AUSKLAPPEN]

senden = CreateUDPStream()
If senden = 0 Then
Print "Verbindung konnte nicht erstellt werden!"
EndIf

empfangen = CreateUDPStream()
If empfangen = 0 Then
Print "Verbindung konnte nicht erstellt werden!"
EndIf

Port=UDPStreamPort (empfangen)
Print "Port: " + Port
umwandeln$ = ip$(1)
Print "IP: " + umwandeln$

Repeat

IP_Adresse = RecvUDPMsg(empfangen)

If IP_Adresse > 0 Then
senderip = DottedIP(IP_Adresse)
messenge$ = ReadLine(bekommen)
Print "Nachricht empfangen!"
Print "Sender Ip:" + senderip
Print "Nachricht:" + messenge$
EndIf

Forever

Function ip$(inte=0)
ips=CountHostIPs("") ; Anzahl der offenen IPs am Computer auslesen.
If Not ips Then Return 0 ; Wenn kein geöffnet, dann 0 zurück liefern.
ip=HostIP(ips) ; Die IP als Integer von der momentane Verbindung rausfiltern.
If inte=1 Then Return ip ; Wenn die Option inte gesetzt ist, dann wird die IP im form eines Integer zurück geliefert.
ipstr$=DottedIP(ip) ; Im weiteren verlauf, falls die Option inte nicht gesetzt ist, das Integer in einen String umwandeln.
Return ipstr$ ; Wert zurückliefern.
End Function


Sender:
Code: [AUSKLAPPEN]

senden = CreateUDPStream(0)
If senden = 0 Then
Print "Verbindung konnte nicht erstellt werden!"

EndIf

bekommen = CreateUDPStream(0)
If bekommen = 0 Then
Print "Verbindung konnte nicht erstellt werden!"

EndIf

IP_Adresse = Input$("Empfaenger IP: ")
Port = Input$("Empfaenger Port: ")


WriteLine(senden, "Hallo")
SendUDPMsg senden, IP_Adresse, Port

CloseUDPStream senden
CloseUDPStream bekommen


Print "Gesendet!"


Aber es geht immer noch nicht! Und ich schreibe auch alles 100% genau ab...
Bitte Bitte Bitte helft mir!

P.S.
Ich habe irgendwie das gefühl das etwas mit der Schleife nich stimmt... denn bei meinem Router blinken die Led`s nicht welche mir sonst den Datentransfer angeben... komisch!

Vertex

BeitragSa, März 12, 2005 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier habe ich dir mal ein funktionierendes Beispiel geschrieben:
Host.bb
Code: [AUSKLAPPEN]
Print "Host"
Print ""

Port = Int(Input$("Port: "))
Stream = CreateUDPStream(Port)

While Not KeyDown(1)
   IP = RecvUDPMsg(Stream)
   If IP Then
      Print "Nachricht von "+DottedIP$(IP)+":"
      Print ">"+ReadLine$(Stream)
      Print ""
      
      WriteLine Stream, "re, es ist "+CurrentTime$()
      SendUDPMsg Stream, IP, UDPMsgPort(Stream)
   EndIf   
Wend

CloseUDPStream Stream
End


Client.bb
Code: [AUSKLAPPEN]
Print "Client"
Print ""

ServerPort = Int(Input$("Server Port: "))
ServerIP   = IntIP(Input$("Server IP: "))

Stream = CreateUDPStream()
Print "Mein Port: "+UDPStreamPort(Stream)
Print ""

While True
   Message$ = Input$("Nachricht: ")
   Print ""
   If Message$ = "quit" Then
      WriteLine Stream, "und tschüss"
      SendUDPMsg Stream, ServerIP, ServerPort
      Exit
   Else
      WriteLine Stream, Message$
      SendUDPMsg Stream, ServerIP, ServerPort
   EndIf
   
   Repeat
      IP = RecvUDPMsg(Stream)
      If IP Then
         Print "Nachricht von "+DottedIP$(IP)+":"
         Print ">"+ReadLine$(Stream)
         Print ""
      EndIf
   Until IP
Wend

CloseUDPStream Stream
End

Function IntIP(IP$)
   CountHostIPs(IP$)
   Return HostIP(1)
End Function


Was ist zu machen? Als erstes den Host starten(= Server) und gibst den Port 1234 ein. Dann startest du den Client, und gibst als Server Port 1234 sowie als Server IP 127.0.0.1 an. Nun kannst du halt Nachrichten hin und her senden.

Beim Router ist es wichtig die verwendeten UDP Ports freizugeben.

mfg olli
vertex.dreamfall.at | GitHub

Jean

BeitragSa, März 12, 2005 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Wooooooooooooooooooooooooooooooooooooooooooow!

Es geht juhuuuuuuuuuu!
THX Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy
 

Mau

BeitragMi, Sep 14, 2005 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Mal eine Frage zum Beispiel von Vertex: dem Server (Host) wird ja hier ein manuelles Port zugewiesen (daß dieser halt vorher freischalten muß). Der Client aber benutzt einen willkürlichen Port. Ist es also völlig egal, ob beim Client ein Router im Weg ist? Auch wenn der Client nicht nur sendet, sondern auch vom Host empfängt? Muß man sich also NUR um die Freischaltung des Host-Ports Sorgen machen?

Da ich selbst keinen Router nutze, blicke ich da noch nicht so ganz durch.
Alles muss, nichts kann!

Justus

BeitragMi, Sep 14, 2005 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe nicht, warum sich manche Leute imer noch den (unnötigen) Aufwand machen und ALLES selbstcoden müssen. Wofür gibt es denn die genialen Libs wie BlitzPlay?

Such einfach mal danach. Ich finde, es erleichtert dir einiges...
 

Mau

BeitragMi, Sep 14, 2005 20:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab die BlitzPlay hier auf der Platte -aber ich würde auch gerne VERSTEHEN wie etwas funktioniert, wenn's recht ist.
Alles muss, nichts kann!

Justus

BeitragMi, Sep 14, 2005 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Kein Problem. Wollte dich nur darauf hinweisen, entschuldige bitte meinen vielleicht etwas aggressiven Ton von eben Mr. Green

skey-z

BeitragMi, Sep 14, 2005 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
@mau

ja, nur der host muss die benötigten Ports im Router freischalten.

die erklärung habe ich glaube ich schon mind. 2 mal hier im Forum geschrieben und auch schon von anderen gelsen, also werde ich es nicht noch mal erläutern, vor allem weil ich auch auf dem Sprung bin, also mal die suchmaschiene anschmeißen, denke da wirst du fündig.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

Mau

BeitragDo, Sep 15, 2005 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist dir auch schon mal aufgefallen, daß zum Thema UDP fast jeder etwas anderes sagt? Gerade WEIL ich die Suche benutzt habe und mich durch 60(!) Threads gekämpft habe, bin ich ja verwirrter als vorher. Aber du hast es ja gerade beantwortet.
Alles muss, nichts kann!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group