Seite 1 von 1

PB4 und Broadcast

Verfasst: 20.03.2006 13:41
von Charlie
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?

Verfasst: 29.03.2006 11:17
von real
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:

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
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:

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
Gruß
René

Verfasst: 12.02.2007 11:04
von osta
Und wie siehts unter Linux aus?