UDP Socket scanner



  • Hallo zusammen,

    habe ein kleines Problem mit den Winsocks. Ein Scanner fragt zyklisch per Broadcast den Aufbau des Netzwerks ab.

    Mal grob der Ablauf des Scanners:

    for each NW-Interface{
     WSAStartup(MAKEWORD(1, 1), &wsa)
     sock = socket()
     ioctlsocket(sock,FIONBIO,1)   //nicht blockierend
     starte recvThread(sock)  
     sendto(sock,Daten)
     sleep(2s)
     close(sock)
    }
    

    der Empfänger:

    WSAStartup(MAKEWORD(1, 1), &wsa)
    rcv = recvfrom(sock)
    if(rcv==WSAEWOULBLOCK){
      sleep(1ms)
      continue
    }
    Daten verarbeiten
    

    Wenn ich das ganze ausführe funktioniert es wunderbar. Wenn ich aber das ganze mehrmal ausführe bekomm ich nur in 30% der Läufe komplette Daten. Beim 1. Run hab ich 100% Erfolg, danach ist kein Muster feststellbar.
    In den Fällen wo es nicht funktioniert (Keine Daten empfangen werden) liefert recvfrom aber keinen Fehler!? In Wireshark sehe ich aber dass die anderen Peers antworten.

    Das Ganze ist in einer Klasse untergebracht, es ist aber egal, ob ich die member-Funktion mehrmals aufrufe, oder das Objekt lösche und neu erzeuge.

    Wenn ich hingegen das Ganze als eigenes Programm compiliere und per Batch regelmäßig starte funktionierts auch einwandfrei.

    Ich hab jetzt schon einiges Probiert, aber bekomm es nicht hin.

    Hat von euch Einer ne Idee?
    Wäre super.

    Herzliche Grüße



  • der rcv-Thread wird übrigens nach dem sleep geschlossen.
    Der Socket ist asynchron, damit ich den Thread sauber beenden kann, auch wenn keine Daten gesendet werden.



  • xbu schrieb:

    Das Ganze ist in einer Klasse untergebracht, es ist aber egal, ob ich die member-Funktion mehrmals aufrufe, oder das Objekt lösche und neu erzeuge.

    Stimmt doch nicht, wenn ich die Klasse einmal instanziere kann ich beliebig oft Abfragen. Aber warum geht es nicht wenn ich die Klasse ereut instanziere?

    Das ganze läuft übrigens per UDP-Broadcast, die Peers antworten normalerweise in <1ms .



  • Hallo,

    liegt's vielleicht an fehlenden WSACleanup-Aufrufen? Bedenke, wenn du wirklich WSAStartup mehrfach während eines Laufs der Anwendung aufrufst (warum eigentlich?), dann muss für jeden Aufruf spätestens nach Abschluss aller "Socket-Nutzungen" ein entsprechendes WSACleanup passieren.

    MfG,

    Probe-Nutzer



  • ok, danke werde das mal testen!
    WSAStartup in der schliefe war nurn test, war früher davor. Danke für den Hinweis!



  • Hallo,

    wollte euch die Lösung nicht vorenthalten. Es fiel mir auf einmal wie Tomaten von den Augen (nachdem ich noch einen Tag gesucht hab 😞 ):
    close(sock) -> closesocket(sock)
    Danke Microsoft!


Log in to reply