PB4 und Broadcast

Fragen und Bugreports zur PureBasic 4.0-Beta.
Charlie
Beiträge: 6
Registriert: 08.02.2005 22:41

PB4 und Broadcast

Beitrag 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?
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag 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é
osta
Beiträge: 87
Registriert: 08.09.2004 11:48
Wohnort: Morsbach (Am Arsch der Welt)
Kontaktdaten:

Beitrag von osta »

Und wie siehts unter Linux aus?
Ich hänge zu oft und zu lange vor dem PC! Ich muss dringend was an meinem Lebenswandel verändern!.......
Nur heute geht's grad nicht.
Gesperrt