UDP-IP einer Nachricht herausfinden

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Myn

Betreff: UDP-IP einer Nachricht herausfinden

BeitragSo, Dez 25, 2011 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey,

ich würde gerne wissen wie ich bei B-Max (ohne Netzwerklib)
von einer eingehenden UDP Message die Ip herausfinden kann.

In BB geht dies ja durch UdpMsgIp (oder so ähnlich)..

Ich habe das derzeit so:

Code: [AUSKLAPPEN]

If(SocketReadAvail(udp))Then
    remoteip=(SocketRemoteIP(udp))
     
    usw .... Antworten

Endif


"udp" ist ein funktionsfähiger Socket.
Das ganze funktioniert auch so lange ich die ClientIP angebe von dem die Message kommt.

Ich brauche ja die Ip vom Client um zu Antworten , bzw. per
Code: [AUSKLAPPEN]
udpconnected=ConnectSocket(udp,remoteip,remoteport)


antworten zu können?

Derzeit bekomme ich bei RemoteIp eine 0 zurückgeliefert...

ZEVS

BeitragSo, Dez 25, 2011 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube, bei BMax ist 0 ein Synonym von localhost, bin aber nicht sicher.
Außerdem kann es sein, dass RemoteIp nur die mittels ConnectSocket eigegebene ip ist, in diesem Falle also sinnlos.
Wie genau sieht deine Implementierung aus, mit der du die Nachricht empfängst?

ZEVS

BtbN

BeitragMo, Dez 26, 2011 1:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn sich da nicht inzwischen was getan hat: Garnicht
Must selber mittels StdC-Funktion recvfrom die nachrichten empfangen. Bmax Sockets nutzen nur recv. recvfrom gibt gleichzeitig auch an, woher das paket kommt, recv nicht.
 

Myn

BeitragMo, Dez 26, 2011 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich lasse einfach den Client mit ConnectSocket beim Server zu connecten und sende dann
etwas zum Server.
Nun weiß ich nicht wie ich dem Client antworten kann, da ich ja bei UDP nicht SocketAccept benutzen kann.

Wie kann ich also dem Client antworten?

ZEVS

BeitragMo, Dez 26, 2011 14:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Über recvfrom_ Parameter 5/6 ermittelst du remoteip / remoteport. Dahin kannst du mit sendto_ Parameter 5/6 zurücksenden. Es stellt sich die Frage, ob der Client die Nachricht empfangen kann. Mit Holepunch und BlitzMax habe ich bisher keine guten Erfahrungen gemacht. Mal schauen, ob du mehr Glück hast.
Rein spekulativ möchte ich dich darauf hinweisen, dass UPD-Sockets keine SocketStreams unterstützen.

ZEVS
 

Myn

BeitragMo, Dez 26, 2011 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
In Tcp habe ich einen Server+Client in den letzten Tagen hinbekommen,
was ihr aber jetzt hier von mir wollt versteh ich nicht^^

Was ist recvfrom_/sendto_ oder
Zitat:
Must selber mittels StdC-Funktion recvfrom die nachrichten empfangen.

?

Bisher benutze ich keine Lib oder sonstwas und habe keine Ahnung was genau ihr meint?
Die SuFu sagt auch nix Wink

Es muss doch möglich sein die IP von einer eingehenden UDP Nachricht zu ermitteln ..?!

Hoffe auf genauere Aussagen von euch, bisher habe ich nur in BB gearbeitet und dort ist es
ja irgendwie einfacher Very Happy

Mr.Keks

BeitragMo, Dez 26, 2011 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Durch das Modul pub.stdc gibt es Zugriff auf die C-Funktion "recvfrom", mit der man beim Empfangen eines UDP-Pakets auch eine Variable übergeben kann, in die dann als eine Art zweite Rückgabe die Senderadresse gepackt wird. Stell dich aber darauf ein, dass dein Code dann mehr wie https://en.wikipedia.org/wiki/...s#Server_2 als wie Basic aussieht... (Offenbar ist die BlitzMax-API da wirklich Müll?)
MrKeks.net

ZEVS

BeitragMo, Dez 26, 2011 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist es auch. Die Funktionen sind in Pub.StdC definiert, das solltest du haben.
Die Verwendung geht wie folgt:
BlitzMax: [AUSKLAPPEN]
Function recvfrom_( socket,buf:Byte Ptr,size,flags,sender_ip Var,sender_port Var)
Function sendto_( socket,buf:Byte Ptr,size,flags,dest_ip,dest_port )

Den Socket-Pointer (Int) findest du als TSocket._socket. Damit geht das so:
BlitzMax: [AUSKLAPPEN]
Local socket:TSocket = ...
Local ip%, port%
Local size% = 1024 '1024 Bytes für die Nachricht
Local buf:Byte[size]
Local recvLen% = recvfrom_(socket._socket, buf, size, 0, ip, port)
Print "received "+recvLen+" Bytes"
If recvLen > 0 Then
'buf auswerten
'buf und size mit der Antwort beschreiben
Assert _sendto(socket._socket, buf, size, 0, ip, port), "Fehler bim Senden der Antwort"
EndIf


ZEVS
 

Myn

BeitragMo, Dez 26, 2011 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für eure Hilfe, mal sehen ob ich damit was anfangen kann.
Ich denke ich werds aber einfach anderes realisieren, es gibt ja meistens mehrere Möglichkeiten.

Falls ich nocheinmal Hilfe hierzu benötige melde ich mich Wink

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group