unter PB3.94 mit UDPLib von PureFan kann ich ja ein Broadcast message an IP "255.255.255.255" versenden.
ab PB4 gibt ja bereits ein eingebaute UDP protokoll, aber leider funktioniert dort nicht mit IP "255.255.255.255".
wenn ich ein broadcast message versenden will, muß ich beim class D ein 255 eintragen. z.B. 192.168.0.255, dafür muß ich vorher meine eigene ip wissen.
frage: wie kann ich auch unter PB4 eine broadcast versenden, ohne meine ip vorher zu kennen.
denn ich benutze es um auf einfache weise meine eigene ip in lan festzustellen, indem ich ein broadcast message an 255.255.255.255 versenden und den sender bzw. clientip rauslesen der gesendet hat.
ich suche nämlich eine lösung wie man seine eigene ip adresse auslesen kann ohne auf winapi zurückgreifen zu müssen.
examineipaddresses möchte ich nicht unbedingt benutzen, denn später soll es ja auch auf linux funktionieren.
hat jemand eine lösung parat?
PB4 und Broadcast
Hi Charlie,
hab genau das gleiche Problem gehabt...
Und da hier und im englischen Forum keine sinnvolle Antwort kam hab ich eine ganz banale UserLib geschrieben, die nur eine Funktion SendUDPBroadcast(Port,Message$) enthält und nichts anderes tut als an die IP 255.255.255.255 auf den angegebenen Port eine Message$ zu schicken.
Das Beispiel dazu (Server & Client) sieht dann so aus:
Ihr könnt das Paket inkl. Library, Beschreibung, einem Testprogramm und der Library-Sourcen (für LCCwin32) von meiner Webseite (siehe unten) runterladen.
Nachtrag:
Hab mich so für meine erste Userlib bemüht und prompt im englischen Forum die Frage gestellt bekommen, ob es dafür einer Userlib bedarf. Natürlich nicht, wenn ihr SendUDPBroadcast() einfach als Procedure einbaut:
Gruß
René
hab genau das gleiche Problem gehabt...
Und da hier und im englischen Forum keine sinnvolle Antwort kam hab ich eine ganz banale UserLib geschrieben, die nur eine Funktion SendUDPBroadcast(Port,Message$) enthält und nichts anderes tut als an die IP 255.255.255.255 auf den angegebenen Port eine Message$ zu schicken.
Das Beispiel dazu (Server & Client) sieht dann so aus:
Code: Alles auswählen
If InitNetwork() = 0
MessageRequester("Fehler!", "Netzwerk kann nicht initialisiert werden.")
End
EndIf
Port = 42364
Buffer = AllocateMemory(1000)
If CreateNetworkServer(0, Port, #PB_Network_UDP)
MessageRequester("UDPServer", "Server auf Port "+Str(Port)+" erstellt.")
;
; Hier schick ich einfach mal einen Broadcast raus, der vom Server empfangen wird (bzw. werden sollte)
SendUDPBroadcast(Port,"BROADCAST-Message-Test!")
quit = #False
Repeat
SEvent = NetworkServerEvent()
If SEvent
ClientID = EventClient()
ClientIP$ = IPString(GetClientIP(ClientID))
Select SEvent
Case 2
MessageRequester("UDPServer", "ClientIP "+ ClientIP$ +" hat ein Paket geschickt", 0)
ReceiveNetworkData(ClientID, Buffer, 1000)
MessageRequester("UDPServer", "Meldung:"+ Chr(13) +"String: "+ Chr(39) + PeekS(Buffer) + Chr(39))
quit = #True
EndSelect
EndIf
Until quit
Else
MessageRequester("UDPServer", "Server kann nicht erstellt werden!"+ Chr(13) +"(Port bereits belegt?)")
EndIf
Nachtrag:
Hab mich so für meine erste Userlib bemüht und prompt im englischen Forum die Frage gestellt bekommen, ob es dafür einer Userlib bedarf. Natürlich nicht, wenn ihr SendUDPBroadcast() einfach als Procedure einbaut:
Code: Alles auswählen
Procedure.l SendUDPBroadcastL (port, message.s)
Protected sock,one,bytes,remote.sockaddr_in
sock = SOCKET_(#AF_INET,#SOCK_DGRAM,#IPPROTO_IP)
If ( sock = -1) : ProcedureReturn 1 : EndIf
one = 1
If (setsockopt_(sock,#SOL_SOCKET,#SO_BROADCAST,@one,SizeOf(one)) = -1)
ProcedureReturn 1
EndIf
remote\sin_family = #AF_INET
remote\sin_port = htons_(port)
remote\sin_addr = #INADDR_BROADCAST
if (sendto_(sock,message,Len(message),0,@remote,SizeOf(remote)) = -1)
ProcedureReturn 1
EndIf
closesocket_(sock)
ProcedureReturn 0
EndProcedure
René