Asynchroner Multicastclient

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Brombaer
User
Beiträge: 2
Registriert: Donnerstag 23. September 2004, 08:31

Hallo zusammen,

ich implementiere derzeit ein VR-System, welches als Konfigurationssprache Python verwendet. Prinzipiell ermöglicht es dem User recht einfach auf interne Funktionalitäten zuzgreifen und auch das System recht schnell zu erweitern. Zusätzlich ist das Sprache einfach elegant (mal abgesehen von der Defintion eines Konstruktors :). Besonders viel Erfahrung mit Python habe ich allerdings noch nicht, ich "lebe" von kleinen Snippets und ab und an in die Doku bei python.org reinschauen (bin eher mit der Programmierung des Systems selbst beschäftigt, was in C++ geschrieben ist).

Jetzt soll ich das System via Multicast mit einem Simulationssystem koppeln. Den passenden Client habe ich auch schon geschrieben:

Code: Alles auswählen

import socket
import time

PORT = 8420
GROUP = '224.245.211.234'

sock = socket.socket(socket.AF_INET , socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET , socket.SO_REUSEADDR , 1)
sock.bind((socket.gethostname(), PORT))

sock.setsockopt(socket.SOL_IP , socket.IP_ADD_MEMBERSHIP, socket.inet_aton(GROUP) + socket.inet_aton('') )
#sock.setblocking(false)

while 1:
    raw, sender = sock.recvfrom(1000)
    print raw
Mein Problem ist allerdings dass dieser Code blocking ist und das Simulationssystem nur bei Bedarf eine Message an mich schickt. Ich habe mir die Doku zu asyncore angeschaut, komme mit dieser allerdings gar nicht klar.

Jetzt die alles entscheidende Frage. Wie bekomme ich diesen Code nonblocking hin ?

Viele Grüsse

Matthias

PS: Wenn es interessiert, man kann sich eine Demoversion unter http://www.dmu-vr-solutions.de herunterladen, es sind einige kleinere Python-Examples mit dabei.
Life is too short to worry
Brombaer
User
Beiträge: 2
Registriert: Donnerstag 23. September 2004, 08:31

Hallo,

jetzt antworte ich mir teilweise schon selbst :) Habe herausgefunden, dass asyncore für mich nicht geeignet ist, die Pythonskripte die ich schreibe dürfen ja gar keine Mainloop besitzen :( Benötige also irgendeine Methode einfach selbst abfragen zu können ob eine Message zum Lesen da ist, oder nicht, quasi non-blocking.

Irgendwelche Ideen ?

Matthias
Life is too short to worry
Sorgenkind
User
Beiträge: 34
Registriert: Samstag 24. Juli 2004, 19:25
Kontaktdaten:

kannst natürlich asyncore ohne mainloop verwenden...

Code: Alles auswählen

def loop_once(timeout=0.5): 
    if asyncore.socket_map: 
        asyncore.poll(timeout,asyncore.socket_map) 
    else: 
        time.sleep(timeout)
in python 2.4 wäre es einfach asyncore.loop(count=1)
Antworten