Wie Verarbeite ich Broadcast Antworten von mehreren PC?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
piwi
User
Beiträge: 17
Registriert: Montag 18. Januar 2010, 13:37

Moin,

ich sende eine Broadcastanfrage "who is out there" an ein paar Embedded Systeme und anschließend Antworten diese mit einem String (Konfigdaten).
Hier Konfiguriere den server socket:

Code: Alles auswählen

HOST = ''
BC_CLIENT = '<broadcast>'
PORT = 30303
s_srv = None
addr = (HOST,PORT)

bc_addr = (BC_CLIENT, PORT)
def __init__(self, parent):
        self._init_ctrls(parent)
        self.root = self.treeCtrl1.AddRoot('Devices')
        
        try:
            self.s_srv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)    ##init socket
            socket.setdefaulttimeout(2)  
            self.statusBar1.SetStatusText("Socket OK", 0)   
        except socket.error, msg:    
            self.s_srv = None
            self.statusBar1.SetStatusText("Socket Error", 0)
         
        try:
            self.s_srv.bind(addr)  ##bind 
            self.s_srv.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)   ##broadcast option
            self.statusBar1.SetStatusText("Binding OK", 0)   
        except socket.error, msg:
            self.s_srv.close()
            self.statusBar1.SetStatusText("Binding Error... "+str(msg), 0) 
Wenn nun der Discovery Button betätigt wird, wird eine Broadcast MSG losgeschickt (hier der code):

Code: Alles auswählen

if self.s_srv is not None:
            try: 
                self.s_srv.sendto('Discovery: Who is out there?',bc_addr)  ##sende broadcast msg
                
                self.textCtrl5.Clear()
                
                data, address = self.s_srv.recvfrom(256)##empfange antworten
                self.textCtrl5.AppendText("2: "+str(address)+" - "+data[0]+"\n  ")     
                
                self.statusBar1.SetStatusText("Discovery: Who is out there?", 0)
            except socket.error, msg:
                self.statusBar1.SetStatusText('Send Error... '+str(msg), 0)
                self.s_srv.close() 
in diesem fall empfange ich nur eine einzige Antwort...
ich sehe über Wireshark, dass jedoch 3 Embedded Systeme antworten.
Wie kann ich den Code modifizieren, dass auch alle 3 Antworten empfangen werden??
Muss ich dafür auch drei verschiedene Sockets zur Verfügung stellen??

Wäre glücklich über eine kleine Hilfe.

Schönen Gruß
Piwi
IoI
User
Beiträge: 68
Registriert: Dienstag 1. Dezember 2009, 11:39

Also, als erstes solltest du den Receiver in einen separaten Thread packen und schon vorher das zuhören starten. Das ganze dann in einer while True Schleife.
piwi
User
Beiträge: 17
Registriert: Montag 18. Januar 2010, 13:37

dank für deine antwort...

das mit dem separaten thread will auch noch einfügen. im ersten moment geht es mir darum, alle 3 antworten einzusammeln und diese darzustellen.

nun habe ich das mal mit der while schleife versucht:

Code: Alles auswählen

while True:    
                mylist = (data, address) = self.s_srv.recvfrom(256)
                self.textCtrl5.AppendText(str(mylist)+"\n  ") 
                if not data: break
leider hängt sich das programm auf, nachdem ich auf den knopf gedrückt habe, jedoch wird eine antwort im "textCtrl5" reingeschrieben.

woran könnte es liegen????
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

du solltest nicht von einem anderen thread gui komponenten steuern / Werte setzen, dies könnte das Problem sein, habe mir jedoch dein code sonst nicht genauer angesehen.
IoI
User
Beiträge: 68
Registriert: Dienstag 1. Dezember 2009, 11:39

Genau richtig, mit dem empfangen blockierst du die ganze gui und mit dem while true für immer. Wenn du jetzt aber deinen Empfänger in einem anderen Thread hast und mit der diesen mit der GUI über einen Timer oder einem Event ausliest, bleibt die GUI ansprechbar.
piwi
User
Beiträge: 17
Registriert: Montag 18. Januar 2010, 13:37

vielen dank....
dann muss ich mir mal anschauen wie man in python threads, event und timer programmiert.
ich werde es mal versuchen....

vielen dank
Antworten